exponenta event banner

Демодуляция логарифмического отношения правдоподобия (LLR)

Этот пример показывает улучшение рабочих характеристик BER для модуляции QPSK при использовании логарифмического отношения правдоподобия (LLR) вместо демодуляции жесткого решения в линии связи со сверточным кодированием. При демодуляции ЛОП можно использовать декодер Витерби либо в режиме неквантованного декодирования, либо в режиме декодирования с мягким решением. Неквантованное декодирование, где входы декодера являются реальными значениями, хотя и лучше с точки зрения BER, практически не жизнеспособно. При более практическом декодировании с мягким решением выходной сигнал демодулятора квантуется перед подачей в декодер. Обычно отмечается, что это не влечет за собой значительных затрат в BER при существенном снижении сложности декодера. Мы проверяем это экспериментально с помощью этого примера.

Для получения Simulink™ версии этого примера см. LLR vs. Hard Decision Demodulation in Simulink.

Инициализация

Параметры моделирования

M = 4; % Modulation order
k = log2(M); % Bits per symbol
bitsPerIter = 1.2e4; % Number of bits to simulate
EbNo = 3; % Information bit Eb/No in dB

Свойства кода

codeRate = 1/2; % Code rate of convolutional encoder
constLen = 7; % Constraint length of encoder
codeGenPoly = [171 133]; % Code generator polynomial of encoder
tblen = 32; % Traceback depth of Viterbi decoder
trellis = poly2trellis(constLen,codeGenPoly);

Создание скорости 1/2, длина ограничения 7 comm.ConvolutionalEncoder object™ системы.

enc = comm.ConvolutionalEncoder(trellis);

Модулятор и канал

Создать comm.QPSKModulator и два comm.QPSKDemodulator Системные объекты. Сконфигурируйте первый демодулятор для вывода битов жесткого решения. Сконфигурируйте второй для вывода значений LLR.

qpskMod = comm.QPSKModulator('BitInput',true);
demodHard = comm.QPSKDemodulator('BitOutput',true,...
    'DecisionMethod','Hard decision');
demodLLR = comm.QPSKDemodulator('BitOutput',true,...
    'DecisionMethod','Log-likelihood ratio');

Создание comm.AWGNChannel объект. Сигнал, поступающий в канал AWGN, является модулированным кодированным сигналом. Для достижения требуемого уровня шума настройте Eb/No для кодированных битов и многобитовых символов. Установите это как EbNo объекта канала.

chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'BitsPerSymbol',k);
EbNoCoded = EbNo + 10*log10(codeRate);
chan.EbNo = EbNoCoded;

Декодирование Витерби

Создать comm.ViterbiDecoder объекты действуют как декодеры жесткого решения, неквантованные и мягкого решения. Для всех трех декодеров установите глубину отслеживания на tblen.

decHard = comm.ViterbiDecoder(trellis,'InputFormat','Hard', ...
    'TracebackDepth',tblen);

decUnquant = comm.ViterbiDecoder(trellis,'InputFormat','Unquantized', ...
    'TracebackDepth',tblen);

decSoft = comm.ViterbiDecoder(trellis,'InputFormat','Soft', ...
    'SoftInputWordLength',3,'TracebackDepth',tblen);

Квантование для мягкого декодирования

Перед использованием comm.ViterbiDecoder в режиме мягкого решения выходной сигнал демодулятора должен быть квантован. В этом примере используется comm.ViterbiDecoder объект с SoftInputWordLength из 3. Это значение является хорошим компромиссом между длинами коротких слов и небольшим штрафом BER. Создать dsp.ScalarQuantizerEncoder объект с 3-битовым квантованием.

scalQuant = dsp.ScalarQuantizerEncoder('Partitioning','Unbounded');
snrdB = EbNoCoded + 10*log10(k);
NoiseVariance = 10.^(-snrdB/10);
demodLLR.Variance = NoiseVariance;
scalQuant.BoundaryPoints = (-1.5:0.5:1.5)/NoiseVariance;

Расчет частоты ошибок

Создать comm.ErrorRate объекты для сравнения декодированных битов с исходными передаваемыми битами. Декодер Витерби создает задержку на выходе декодированного битового потока, равную длине отслеживания. Чтобы учесть эту задержку, установите ReceiveDelay имущества comm.ErrorRate объекты в tblen.

errHard = comm.ErrorRate('ReceiveDelay',tblen);
errUnquant = comm.ErrorRate('ReceiveDelay',tblen);
errSoft = comm.ErrorRate('ReceiveDelay',tblen);

Моделирование системы

Произвести bitsPerIter биты сообщения. Затем сверточно кодируют и модулируют данные.

txData = randi([0 1],bitsPerIter,1); 
encData = enc(txData);
modData = qpskMod(encData);

Пропустить модулированный сигнал через канал AWGN.

rxSig = chan(modData);

Демодулируют принятый сигнал и выводят биты жесткого решения.

hardData = demodHard(rxSig);

Демодулируйте принятый сигнал и выходные значения LLR.

LLRData = demodLLR(rxSig);

Декодирование с жестким решением

Передача демодулированных данных через декодер Витерби. Вычислите статистику ошибок.

rxDataHard = decHard(hardData);
berHard = errHard(txData,rxDataHard);

Неквантованное декодирование

Передача демодулированных данных через декодер Витерби. Вычислите статистику ошибок.

rxDataUnquant = decUnquant(LLRData);
berUnquant = errUnquant(txData,rxDataUnquant);

Декодирование с мягким решением

Передать демодулированные данные в квантователь. Эти данные должны быть умножены на -1 перед передачей в квантователь, поскольку в режиме мягкого решения декодер Витерби предполагает, что положительные числа соответствуют 1 s, а отрицательные числа - 0 s. Передача выходного сигнала квантователя в декодер Витерби. Вычислите статистику ошибок.

quantizedValue = scalQuant(-LLRData);
rxDataSoft = decSoft(double(quantizedValue));
berSoft = errSoft(txData,rxDataSoft);

Пример выполнения моделирования

Моделирование ранее описанной системы связи в диапазоне значений Eb/No путем выполнения файла моделирования simLLRvsHD. Он отображает результаты BER по мере их генерации. Результаты BER для демодуляции жесткого решения и демодуляции LLR с неквантованным и мягким декодированием строятся красным, синим и черным цветом соответственно. Также показано сравнение результатов моделирования с теоретическими результатами. Обратите внимание, что BER лишь немного ухудшается при использовании декодирования с мягким решением вместо неквантованного декодирования. Промежуток между кривыми ЧОК для декодирования с мягким решением и теоретическим ограничением может быть уменьшен путем увеличения числа уровней квантователя.

Этот пример может занять некоторое время для вычисления результатов BER. Если установлен Toolbox™ параллельных вычислений (PCT), можно задать usePCT равным true для параллельного выполнения моделирования. В этом случае файл LLRvsHDwithPCT выполняется.

Для получения результатов в большем диапазоне значений Eb/No измените соответствующие вспомогательные файлы. Обратите внимание, что вы можете получить более статистически достоверные результаты, собрав больше ошибок.

usePCT = false;
if usePCT && license('checkout','Distrib_Computing_Toolbox') ...
        && ~isempty(ver('parallel'))
    LLRvsHDwithPCT(1.5:0.5:5.5,5);
else
    simLLRvsHD(1.5:0.5:5.5,5);
end

Figure contains an axes. The axes with title LLR vs. Hard Decision Demodulation contains 32 objects of type line. These objects represent Hard Decision: Theoretical Upper Bound, LLR with unquantized decoding: Theoretical Upper Bound, Hard Decision: Simulation, LLR with unquantized decoding: Simulation, LLR with Soft Decision: Simulation.

Приложение

В этом примере используются следующие функции:

  • simLLRvsHD.m - Моделирование системы без РСТ.

  • LLRvsHDweyPCT.m - Имитирует систему с PCT.

  • simLLRvsHDPCT.m - вспомогательная функция, вызываемая LLRvsHDwithPCT.