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

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

Для получения Simulink™ версии этого примера смотрите Демодуляцию LLR и Hard Decision в 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;

Декодирование Viterbi

Создание 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 объекты для сравнения декодированных битов с исходными переданными битами. Декодер Viterbi создает задержку в декодированном битовом потоке выхода равную длине отслеживания. Чтобы учесть эту задержку, установите 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);

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

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

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

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

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

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

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

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

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

Пример выполнения симуляции

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

Этот пример может занять некоторое время, чтобы вычислить результаты BER. Если у вас установлен Parallel Computing 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.

Приложение

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