Этот пример показывает, как использовать благоприятный для оборудования блок Depuncturer и блок Viterbi Decoder, чтобы декодировать выборки, закодированные на уровнях кода WLAN.
Сгенерируйте входные выборки в MATLAB® путем кодирования случайных данных, модуляция BPSK выборки, применения модели канала, демодуляции выборок и создания полученных битов мягкого решения. Затем импортируйте биты мягкого решения в модель Simulink® к depuncture и декодируйте выборки. Экспортируйте результат симуляции Simulink назад в MATLAB и сравните его с исходными входными выборками.
Модель в качестве примера поддерживает генерацию HDL-кода для HDL Depuncture, и Декодируйте подсистему.
modelname = 'ltehdlViterbiDecoderModel';
open_system(modelname);
Настройте переменные рабочей области, которые описывают уровень кода. Блок Viterbi Decoder поддерживает продолжительности ограничения в области значений [3,9] и полиномиальные длины в области значений [2,7].
Выберите traceback глубину в области значений [3,128]. Для непроколотых выборок рекомендуемая глубина является 5 раз constraintLength. Для проколотых выборок рекомендуемая глубина является 10 раз constraintLength.
Начиная с уровня кода 1/2, IEEE 802.11 WLAN задает три шаблона прокалывания, чтобы сгенерировать три уровня дополнительного кода. Выберите один из этих уровней кода, и затем установите формат кадра и шаблон прокалывания на основе того уровня. Можно также выбрать непроколотый уровень кода 1/2.
IEEE 802.11 WLAN задает различные типы модуляции для различных уровней кода и использует режим 'Terminated'
. Этот пример использует модуляцию BPSK для всех уровней и может запуститься с режимом работы 'Truncated'
или 'Terminated'
. Блоки также поддерживают режим 'Continuous'
, но он не включен в этот пример.
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 требует выборок потоковой передачи с сопроводительными управляющими сигналами. Используйте функцию ltehdlFramesToSamples
, чтобы преобразовать обрамленный rxSoftMessages
в потоковую передачу выборок и сгенерировать соответствующие управляющие сигналы.
Вычислите необходимое время симуляции от задержки блоков декодера и depuncture.
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] = ltehdlFramesToSamples(rxSoftMessages, ... idlecyclesbetweensamples,idlecyclesbetweenframes,samplesizeIn); depunLatency = 6; vitLatency = 4*tracebackDepth + constraintLength + 13; latency = vitLatency + depunLatency; simTime = size(ctrlIn,1) + latency; sampletime = 1;
Вызовите модель Simulink к depuncture и декодируйте выборки. Модель экспортирует декодируемые выборки в рабочее пространство MATLAB. Параметры блоков Depuncture и Декодера Витерби сконфигурированы с помощью переменных рабочей области. Поскольку Режим работы является параметром списка, используйте 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 = ltehdlSamplesToFrames(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