Сверточный кодируют и прокалывают выборки потоковой передачи

В этом примере показано, как использовать благоприятный для оборудования Convolutional Encoder, и Puncturer блокируется, чтобы закодировать выборки на уровнях кода WLAN.

  1. Сгенерируйте случайные выборки входного кадра с сигналами управления кадром при помощи ltehdlFramesToSamples функция в MATLAB®.

  2. Импортируйте эти выборки в модель Simulink® и запустите модель, чтобы закодировать и проколоть выборки.

  3. Экспортируйте результат симуляции Simulink назад в MATLAB.

  4. Сгенерируйте ссылочные выборки с помощью convenc Функция MATLAB с прокалыванием активированного.

  5. Сравните результаты 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] = ltehdlFramesToSamples(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(dataOut.Data);
startOut = squeeze(ctrlOut.start.Data);
endOut   = squeeze(ctrlOut.end.Data);
validOut = squeeze(ctrlOut.valid.Data);

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

Смотрите также

Блоки