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('distcomp'))
    LLRvsHDwithPCT(1.5:0.5:5.5,5);
else
    simLLRvsHD(1.5:0.5:5.5,5);
end

Приложение

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