Этот пример показывает, как использовать удобный для аппаратного обеспечения блок 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 требует потоковых выборок с сопутствующими сигналами управления. Используйте 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, чтобы разобрать и декодировать выборки. Модель экспортирует декодированные выборки в рабочее пространство 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