Этот пример показывает повышение производительности 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
Система object™.comm.ConvolutionalEncoder
enc = comm.ConvolutionalEncoder(trellis);
Модулятор и канал
Создайте
возразите и два comm.QPSKModulator
объекты. Сконфигурируйте первый демодулятор, чтобы вывести биты трудного решения. Сконфигурируйте второе к значениям выхода LLR.comm.QPSKDemodulator
qpskMod = comm.QPSKModulator('BitInput',true); demodHard = comm.QPSKDemodulator('BitOutput',true,... 'DecisionMethod','Hard decision'); demodLLR = comm.QPSKDemodulator('BitOutput',true,... 'DecisionMethod','Log-likelihood ratio');
Создайте
объект. Сигнал, входящий в канал AWGN, является модулируемым кодируемым сообщением. Чтобы достигнуть необходимого уровня шума, настройте Eb/No для закодированных битов и многоразрядных символов. Установите это как comm.AWGNChannel
EbNo
из объекта канала.
chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ... 'BitsPerSymbol',k); EbNoCoded = EbNo + 10*log10(codeRate); chan.EbNo = EbNoCoded;
Декодирование Viterbi
Создайте
объекты действовать как трудное решение, неквантованное, и декодеры мягкого решения. Для всех трех декодеров, набор traceback глубина к 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. Создайте
объект с 3-битным квантованием.dsp.ScalarQuantizerEncoder
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;
Вычисление коэффициента ошибок
Создайте
объекты сравнить декодируемые биты с исходными переданными битами. Декодер Витерби создает задержку декодируемого потока битов выход, равный traceback длине. Чтобы составлять эту задержку, установите comm.ErrorRate
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
Следующие функции используются в этом примере:
simLLRvsHD.m: Симулирует систему без PCT.
LLRvsHDwithPCT.m: Симулирует систему с PCT.
simLLRvsHDPCT.m: функция Помощника вызвана LLRvsHDwithPCT.