Этот пример показывает улучшение рабочих характеристик 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

В этом примере используются следующие функции:
simLLRvsHD.m - Моделирование системы без РСТ.
LLRvsHDweyPCT.m - Имитирует систему с PCT.
simLLRvsHDPCT.m - вспомогательная функция, вызываемая LLRvsHDwithPCT.