Декодирование и декодирование потоковых выборок

Этот пример показывает, как использовать удобный для аппаратного обеспечения блок Depuncturer и блок Viterbi Decoder для декодирования выборок, кодированных со скоростью кода WLAN.

Сгенерируйте входные выборки в MATLAB ® путем кодирования случайных данных, BPSK-модуляции выборок, применения модели канала, демодуляции выборок и создания полученных бит мягкого решения. Затем импортируйте биты мягкого решения в модель Simulink ®, чтобы депунктурировать и декодировать выборки. Экспортируйте результат симуляции Simulink обратно в MATLAB и сравните его с исходными входными выборками.

Модель в качестве примера поддерживает генерацию HDL-кода для подсистем HDL Depuncture и Decode.

modelname  = 'ltehdlViterbiDecoderModel';
open_system(modelname);

Настройка параметров скорости кода

Настройте переменные рабочей области, которые описывают скорость кода. Блок Viterbi Decoder поддерживает длины ограничений в области значений [3,9] и полиномиальные длины в области значений [2,7].

Выберите глубину трассировки в области значений [3,128]. Для непроколотых выборок рекомендуемая глубина в 5 раз больше constraintLength. Для проколотых выборок рекомендуемая глубина в 10 раз больше constraintLength.

Начиная со скорости кода 1/2, IEEE 802.11 WLAN задает три шаблона прокалывания, чтобы сгенерировать три дополнительные скорости кода. Выберите одну из этих скоростей кода, а затем установите формат кадра и шаблон прокалывания на основе этой скорости. Можно также выбрать скорость нетекстурированного кода 1/2.

IEEE 802.11 WLAN задает различные типы модуляции для различных скоростей кода и использует 'Terminated' режим. Этот пример использует BPSK модуляцию для всех скоростей и может выполняться с 'Terminated' или 'Truncated' операция. Блоки также поддерживают 'Continuous' mode, но он не включен в этот пример.

constraintLength = 7;
codeGenerator = [133 171];
opMode = 'Terminated';
tracebackDepth = 10*constraintLength;

trellis = poly2trellis(constraintLength,...
    codeGenerator);

% IEEE 802.11n-2009 WLAN 1/2 (7, [133 171])
% Rate   Puncture Pattern     Maximum Frame Size
% 1/2     [1;1;1;1]                 2592
% 2/3     [1;1;1;0]                 1728
% 3/4     [1;1;1;0;0;1]             1944
% 5/6     [1;1;1;0;0;1;1;0;0;1]     2160
codeRate = 3/4;

if (codeRate == 2/3)
    puncVector = logical([1;1;1;0]);
    frameSize = 1728;
elseif (codeRate == 3/4)
    puncVector = logical([1;1;1;0;0;1]);
    frameSize = 1944;
elseif (codeRate == 5/6)
    puncVector = logical([1;1;1;0;0;1;1;0;0;1]);
    frameSize = 2160;
else % codeRate == 1/2
    puncVector = logical([1;1;1;1]);
    frameSize = 2592;
end

if strcmpi(opMode,'Terminated')
    % Terminate the state at the end of the frame
    tailLen = constraintLength-1;
else
    % Truncated mode
    tailLen = 0;
end

Сгенерируйте выборки для декодирования

Используйте функции Communications Toolbox™ и системные объекты, чтобы сгенерировать закодированные выборки и применить шум канала. Демодулируйте полученные выборки и создайте значения мягкого решения для каждой выборки.

EbNo = 10;
EcNo = EbNo - 10*log10(numel(codeGenerator));

numFrames = 5;
numSoftBits = 4;

txMessages = cell(1,numFrames);
rxSoftMessages = cell(1,numFrames);

No = 10^((-EcNo)/10);
quantStepSize = sqrt(No/2^numSoftBits);

modulator = comm.BPSKModulator;
channel = comm.AWGNChannel('EbNo',EcNo);
demodulator = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio');

for ii = 1:numFrames
    txMessages{ii} = [randn(frameSize - tailLen,1)
        zeros(tailLen,1)]>0;
    % Convolutional encoding and puncturing
    txCodeword = convenc(txMessages{ii},trellis,puncVector);
    % Modulation
    modOut = modulator.step(txCodeword);
    % Channel
    chanOut = channel.step(modOut);
    % Demodulation
    demodOut = -demodulator.step(chanOut)/4;
    % Convert to soft-decision values
    rxSoftMessagesDouble = demodOut./quantStepSize;
    rxSoftMessages{ii} = fi(rxSoftMessagesDouble,1,numSoftBits,0);
end

Настройте переменные для симуляции Simulink

Модель Simulink требует потоковых выборок с сопутствующими сигналами управления. Используйте whdlFramesToSamples функция для преобразования системы координат rxSoftMessages для потоковых выборок и генерирования совпадающих управляющих сигналов.

Вычислите необходимое время симуляции из задержки блоков депунктуры и декодера.

samplesizeIn = 1;
idlecyclesbetweensamples = 0;
idlecyclesbetweenframes = 0;
if strcmpi(opMode,'Truncated')
    % Truncated mode requires a gap between frames of at least constraintLength-1
    idlecyclesbetweenframes = constraintLength - 1;
end

[sampleIn,ctrlIn] = whdlFramesToSamples(rxSoftMessages, ...
    idlecyclesbetweensamples,idlecyclesbetweenframes,samplesizeIn);

depunLatency = 6;
vitLatency = 4*tracebackDepth + constraintLength + 13;
latency = vitLatency + depunLatency;

simTime = size(ctrlIn,1) + latency;
sampletime = 1;

Запуск модели Simulink

Вызовите модель Simulink, чтобы разобрать и декодировать выборки. Модель экспортирует декодированные выборки в рабочее пространство MATLAB. Параметры блоков Depuncture и Viterbi Decoder конфигурируются с помощью переменных рабочей области. Поскольку операция является параметром списка, используйте set_param для присвоения значения рабочей области.

Преобразуйте потоковые выборки назад в кадрированные данные для сравнения.

set_param([modelname '/HDL Depuncture and Decode'],'Open','on');
set_param([modelname '/HDL Depuncture and Decode/Viterbi Decoder'],...
          'TerminationMethod',opMode);
sim(modelname);

sampleOut = squeeze(sampleOutTS.Data);
ctrlOut = [squeeze(ctrlOutTS.start.Data) ...
    squeeze(ctrlOutTS.end.Data) ...
    squeeze(ctrlOutTS.valid.Data)];
rxMessages = whdlSamplesToFrames(sampleOut,ctrlOut);
Maximum frame size computed to be 1944 samples.

Проверьте результаты

Сравните выходные выборки с сгенерированными входными выборками.

fprintf('\nDecoded Samples\n');
for ii = 1:numFrames
    numBitsErr = sum(xor(txMessages{ii},rxMessages{ii}));
    fprintf('Frame #%d: %d bits mismatch \n',ii,numBitsErr);
end
Decoded Samples
Frame #1: 0 bits mismatch 
Frame #2: 0 bits mismatch 
Frame #3: 0 bits mismatch 
Frame #4: 0 bits mismatch 
Frame #5: 0 bits mismatch 

См. также

Блоки

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