LLR по сравнению с демодуляцией трудного решения

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

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

Установите эти параметры, чтобы запустить симуляцию.

  • M : Порядок модуляции

  • k : Биты на символ

  • bitsPerIter : Количество битов, чтобы симулировать

  • EbNo : Информационный бит Eb/No в дБ

  • codeRate : Уровень кода сверточного энкодера

  • constLen : Продолжительность ограничения энкодера

  • codeGenPoly : Полином генератора кода энкодера

  • tblen : Глубина Traceback Декодера Витерби

Параметры симуляции

M = 4;
k = log2(M);
bitsPerIter = 1.2e4;
EbNo = 3;

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

codeRate = 1/2;
constLen = 7;
codeGenPoly = [171 133];
tblen = 32;
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 объекты действовать как трудное решение, неквантованное, и декодеры мягкого решения. Для всех трех декодеров, набор 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. Создайте 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 объекты сравнить декодируемые биты с исходными переданными битами. Декодер Витерби создает задержку декодируемого потока битов выход, равный traceback длине. Чтобы составлять эту задержку, установите 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);

Convolutionally кодируют данные.

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 с и отрицательным числам к 0s. Передайте квантизатор выход Декодеру Витерби. Вычислите ошибочную статистику.

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 на истинный запускать параллельную симуляцию. В этом случае, файл 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

Приложение

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