Демодуляция отношения логарифмической правдоподобности (LLR)

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

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

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 объекты действовать как трудное решение, неквантованное, и декодеры мягкого решения. Для всех трех декодеров, набор 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 передайте биты. Затем 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);

Декодирование мягкого решения

Передайте демодулируемые данные квантизатору. Эти данные должны быть умножены на -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 на 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

Приложение

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

Для просмотра документации необходимо авторизоваться на сайте