Этот пример показывает повышение производительности BER для модуляции QPSK при использовании отношения логарифмической правдоподобности (LLR) вместо демодуляции трудного решения в convolutionally закодированной линии связи. С демодуляцией LLR можно использовать Декодер Витерби или в неквантованном режиме декодирования или в режиме декодирования мягкого решения. Неквантованное декодирование, где входные параметры декодера являются вещественными значениями, хотя лучше в терминах BER, не практически жизнеспособно. В более практическом декодировании мягкого решения демодулятор вывел, квантуется прежде чем быть питаемым декодера. Обычно замечается, что это не несет значительные расходы в BER, значительно уменьшая сложность декодера. Мы подтверждаем это экспериментально через этот пример.
Для версии Simulink™ этого примера см. LLR по сравнению с Демодуляцией Трудного решения в 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
Инициализируйте свойства кодирования для уровня 1/2, продолжительность ограничения 7 кодов.
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);
Создайте comm.ConvolutionalEncoder
Система object™ при помощи trellis
как вход.
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
объекты действовать как трудное решение, неквантованное, и декодеры мягкого решения. Для всех трех декодеров, набор traceback глубина к 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. Задайте точки parition для 3-битного квантования.
snrdB = EbNoCoded + 10*log10(k); NoiseVariance = 10.^(-snrdB/10); demodLLR.Variance = NoiseVariance; paritionPoints = (-1.5:0.5:1.5)/NoiseVariance;
Вычисление коэффициента ошибок
Создайте comm.ErrorRate
объекты сравнить декодируемые биты с исходными переданными битами. Декодер Витерби создает задержку декодируемого потока битов выход, равный traceback длине. С учетом этой задержки, набор ReceiveDelay
свойство comm.ErrorRate
объекты к tblen
.
errHard = comm.ErrorRate('ReceiveDelay',tblen); errUnquant = comm.ErrorRate('ReceiveDelay',tblen); errSoft = comm.ErrorRate('ReceiveDelay',tblen);
Сгенерируйте bitsPerIter
передайте биты. Затем convolutionally закодируйте и модулируйте данные.
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);
Декодирование мягкого решения
Передайте демодулируемые данные quantiz
функция. Эти данные должны быть умножены на -1
прежде чем быть переданным квантизатору, потому что в режиме мягкого решения Декодер Витерби принимает, что положительные числа соответствуют 1 с и отрицательным числам к 0s. Передайте квантизатор выход Декодеру Витерби. Вычислите статистику ошибок.
quantizedValue = quantiz(-LLRData,paritionPoints); 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 — Симулирует систему без PCT.
LLRvsHDwithPCT.m — Симулирует систему с PCT.
simLLRvsHDPCT.m — Функция помощника вызвана LLRvsHDwithPCT.