В этом примере показано, как использовать благоприятный для оборудования Convolutional Encoder, и Puncturer блокируется, чтобы закодировать выборки на уровнях кода WLAN.
Сгенерируйте случайные выборки входного кадра с сигналами управления кадром при помощи whdlFramesToSamples
функция в MATLAB®.
Импортируйте эти выборки в модель Simulink® и запустите модель, чтобы закодировать и проколоть выборки.
Экспортируйте результат симуляции Simulink назад в MATLAB.
Сгенерируйте ссылочные выборки с помощью convenc
Функция MATLAB с прокалыванием активированного.
Сравните результаты Simulink со ссылочными выборками.
Модель в качестве примера поддерживает генерацию HDL-кода для подсистемы EncodeAndPuncture, которая содержит блоки Convolutional Encoder и Puncturer.
modelname = 'GenConvEncPuncturerModel';
open_system(modelname);
Настройте переменные рабочей области, которые описывают уровень кода. Блок Convolutional Encoder поддерживает продолжительности ограничения в области значений [3,9] и полиномиальные длины в области значений [2,7].
Начиная с уровня кода 1/2, IEEE 802.11 WLAN задает три шаблона прокалывания, чтобы сгенерировать три уровня дополнительного кода. Выберите один из этих уровней кода, и затем установите формат кадра и шаблон прокалывания на основе того уровня. Можно также выбрать непроколотый уровень кода 1/2.
IEEE 802.11 WLAN задает различные уровни кода и использует 'Terminated'
режим. Блоки также поддерживают 'Continuous'
режим и 'Truncated'
режимы, но они не включены в этот пример.
constraintLength = 7; codeGenerator = [133 171]; 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
Сгенерируйте выборки входного кадра для кодирования и прокалывания при помощи Системных объектов Communications Toolbox™, чтобы сгенерировать закодированные выборки.
numFrames = 5; txMessages = cell(1,numFrames); txCodeword = cell(1,numFrames); for ii = 1:numFrames txMessages{ii} = logical(randn(frameSize-constraintLength+1,1)); end
Настройте переменные для симуляции Simulink. Модель Simulink требует выборок потоковой передачи с сопроводительными управляющими сигналами. Вычислите необходимое время симуляции от задержки блоков Convolutional Encoder и Puncturer.
samplesizeIn = 1;
idlecyclesbetweensamples = 0;
idlecyclesbetweenframes = constraintLength-1;
[sampleIn,ctrlIn] = whdlFramesToSamples(txMessages, ...
idlecyclesbetweensamples,idlecyclesbetweenframes,samplesizeIn);
startIn = ctrlIn(:,1);
endIn = ctrlIn(:,2);
validIn = ctrlIn(:,3);
simTime = size(ctrlIn,1)+6;
sampletime = 1;
Запустите модель Simulink.
set_param([modelname '/EncodeAndPuncture'],'Open','on'); sim(modelname);
Преобразуйте выборки потоковой передачи от блока Simulink выход к обрамленным данным для сравнения.
sampleOut = squeeze(sampleOut); startOut = ctrlOut(:,1); endOut = ctrlOut(:,2); validOut = ctrlOut(:,3); idxStart = find(startOut.*validOut); idxEnd = find(endOut.*validOut);
Сгенерируйте ссылочные выборки с помощью convenc
Функция MATLAB.
for ii = 1:numFrames txCodeword{ii} = convenc([txMessages{ii};false(constraintLength-1,1)],... trellis,puncVector); end
Сравните выходные выборки со сгенерированными входными выборками.
fprintf('\nEncoded Samples\n'); for ii = 1:numFrames idx = idxStart(ii):idxEnd(ii); idxValid = (validOut(idx)); dataOut = sampleOut(:,idx); hdlTxCoded = dataOut(:,idxValid); numBitsErr = sum(xor(txCodeword{ii},hdlTxCoded(:))); fprintf('Number of samples mismatched in the frame #%d: %d bits\n',ii,numBitsErr); end
Encoded Samples Number of samples mismatched in the frame #1: 0 bits Number of samples mismatched in the frame #2: 0 bits Number of samples mismatched in the frame #3: 0 bits Number of samples mismatched in the frame #4: 0 bits Number of samples mismatched in the frame #5: 0 bits