Этот пример показывает улучшение эффективности 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
В этом примере используются следующие функции:
simLLRvsHD.m - Моделирует систему без РСТ.
LLRvsHDwithPCT.m - Моделирует систему с PCT.
simLLRvsHDPCT.m - функция-помощник, вызываемая LLRvsHDwithPCT.