В этом примере показано, как симулировать блок WLAN LDPC Decoder и сравнить оптимизированные оборудованием результаты с результатами Коммуникации функция Toolbox™.
Сгенерируйте вход с блоком с помощью Коммуникационной функции Тулбокса ldpcEncode
. Обеспечьте сгенерированные данные как вход с блоком WLAN LDPC Decoder и Коммуникационной функцией Тулбокса ldpcDecode
. Сравните выход блока с выходом ldpcDecode
функция. Этот пример содержит две модели Simulink®. Одна модель сконфигурирована, чтобы поддержать стандарты WLAN IEEE 802.11 n/ac/ax, и другая модель сконфигурирована, чтобы поддержать стандартное объявление IEEE 802.11. Когда вы запускаете скрипт, соответствующая модель выбрана на основе значения, которое вы задаете для переменной standard
упомянутый в скрипте.
Выберите серию входных значений для длины блока и скорости кода согласно стандарту WLAN. Можно изменить значения переменных в этом разделе на основе требований.
standard = 'IEEE 802.11 n/ac/ax'; % IEEE 802.11 n/ac/ax or IEEE 802.11 ad codeRateIdx = [0; 1; 2; 3]; % Code rate index blkLenIdx = [0; 1; 2; 0]; % Block length index numFrames = 4; scalar = false; % true for scalar inputs and false % for vector inputs algorithm = 'Min-sum'; % Min-sum or Normalized min-sum niter = 8; % Number of iterations if strcmpi(algorithm,'Min-sum') alpha = 1; else alpha = 0.75; % Scaling factor, which must be in % the range [0.5:0.0625:1] end
Сгенерируйте входные параметры для ldpcEncode
функция с заданной длиной блока и переменными скорости кода. Используйте закодированные данные из ldpcEncode
функционируйте, модулируйте данные с помощью функции модулятора, добавьте шум с помощью Системы канала object™ и сгенерируйте значения отношения логарифмической правдоподобности (LLR) с помощью функции демодулятора символа. После этого введите эти значения LLR как вход к ldpcDecode
функция.
Создайте векторы из индекса длины блока и индекса скорости кода с помощью blockLenIdx
и codeRateIdx
переменные, соответственно. Преобразуйте системы координат значений LLR к выборкам с сигналом шины управления, который указывает на контуры системы координат. Обеспечьте эти векторы и шину управления как вход с блоком WLAN LDPC Decoder.
decFrameGap
переменная в скрипте вмещает задержку блока WLAN LDPC Decoder для заданной длины блока, скорости кода и количества итераций. Используйте nextFrame выходной сигнал, чтобы определить, когда блок будет готов принять запуск следующего входного кадра.
% Initialize inputs msg = {numFrames}; % Input to |ldpcEncode| function rxLLR = cell(1,numFrames); % Input to |ldpcDecode| function refOut = cell(1,numFrames); % Output of |ldpcDecode| function decSampleIn = []; decStartIn = []; decEndIn = []; decValidIn = []; decBlkLenIdxIn = []; decCodeRateIdxIn = []; for ii = 1:numFrames if strcmpi(standard,'IEEE 802.11 n/ac/ax') blockLenSet = [648,1296,1944]; rateSet = {'1/2','2/3','3/4','5/6'}; blkLen = blockLenSet(blkLenIdx(ii)+1); codeRate = rateSet{codeRateIdx(ii)+1}; modelName = 'HDLWLANLDPCDecoderStd11ac'; else rateSet = {'1/2','5/8','3/4','13/16'}; blkLen = 672; codeRate = rateSet{codeRateIdx(ii)+1}; modelName = 'HDLWLANLDPCDecoderStd11ad'; end [rxLLR{ii},refOut{ii},msg{ii}] = inputGenForWLANLDPCDec(blkLen,codeRate,niter,alpha); if scalar decFrameGap = niter*1000 + length(msg{ii}); %#ok vecSize = 1; len = length(rxLLR{ii}); else len = length(rxLLR{ii})/8; vecSize = 8; decFrameGap = niter*1000 + ceil(length(msg{ii})/8); end decIn = reshape(rxLLR{ii},vecSize,[]); decSampleIn = [decSampleIn decIn zeros(size(decIn,1),decFrameGap)]; %#ok<*AGROW> decStartIn = logical([decStartIn 1 zeros(1,len-1) zeros(1,decFrameGap)]); decEndIn = logical([decEndIn zeros(1,len-1) 1 zeros(1,decFrameGap)]); decValidIn = logical([decValidIn ones(1,len) zeros(1,decFrameGap)]); decBlkLenIdxIn = ([decBlkLenIdxIn repmat(blkLenIdx(ii),1,len) zeros(1,decFrameGap)]); decCodeRateIdxIn = ([decCodeRateIdxIn repmat(codeRateIdx(ii),1,len) zeros(1,decFrameGap)]); end dataIn = timeseries(fi(decSampleIn',1,4,0)); startIn = timeseries(decStartIn); endIn = timeseries(decEndIn); validIn = timeseries(decValidIn); if strcmpi(standard,'IEEE 802.11 n/ac/ax') blockLenIdx = timeseries(fi(decBlkLenIdxIn,0,2,0)); end codeRateIdx = timeseries(fi(decCodeRateIdxIn,0,2,0)); % For the standard % IEEE 802.11 ad simTime = length(decValidIn);
HDL WLAN LDPC Decoder
подсистема содержит блок WLAN LDPC Decoder. Выполнение модели импортирует переменные dataIn
входного сигнала,
startIn
, endIn
, validIn
, blockLenIdx
, codeRateIdx
, niter
, и simTime
с блоком из скрипта и экспорта поток декодируемых выходных выборок dataOut
и шина управления, содержащая startOut
, endOut
, и validOut
сигналы от блока до рабочего пространства MATLAB.
open_system(modelName); if alpha ~= 1 set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ... 'Algorithm','Normalized min-sum'); set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ... 'ScalingFactor',num2str(alpha)); else set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ... 'Algorithm','Min-sum'); end sim(modelName);
Преобразуйте вывод данных потоковой передачи блока WLAN LDPC Decoder к системам координат. Сравните системы координат с выходом ldpcDecode
функция.
startIdx = find(squeeze(startOut)); endIdx = find(squeeze(endOut)); dec = squeeze(dataOut); decHDL = {numFrames}; for ii = 1:numFrames idx = startIdx(ii):endIdx(ii); if scalar decHDL{ii} = dec(idx); else decHDL{ii} = dec(:,idx); end HDLOutput = decHDL{ii}(1:length(refOut{ii})); error = sum(abs(double(refOut{ii})-HDLOutput(:))); fprintf(['Decoded frame %d: Output data differs by %d bits\n'],ii,error); end
Decoded frame 1: Output data differs by 0 bits Decoded frame 2: Output data differs by 0 bits Decoded frame 3: Output data differs by 0 bits Decoded frame 4: Output data differs by 0 bits