Демодуляция символа DVBS2 символов комплексных данных

В этом примере показано, как использовать блок DVBS2 Symbol Demodulator, чтобы демодулировать символы комплексных данных к значениям LLR. Сгенерируйте набор комплексных случайных входных параметров и обеспечьте их как вход с блоком и функцией MATLAB® refDVBS2SymDemod. Сравните выход блока с выходом refDVBS2SymDemod функция. Эта ссылочная функция использует comm.PSKDemodulator объект и dvbsapskdemod функция от Communications Toolbox™.

Настройте входные переменные

Настройте входные переменные. Можно изменить значения переменных в этом разделе на основе требований.

rng(0);
framesize = 8;                 % framesize must be a multiple of 8
modIdx = [1;3;0;2;4];          % modIdx must be 0, 1, 2, 3, and 4,
                               % which correspond to the modulation schemes
                               % QPSK, 8-PSK, 16-APSK, 32-APSK and
                               % pi/2-BPSK, respectively
codeRateIdx = [5;10;6;7;9;8];  % codeRateIdx values can be 5, 6, 7, 8, 9, 10
                               % that correspond to the code rates 2/3,
                               % 3/4, 4/5, 5/6, 8/9, and 9/10, respectively
UnitAvgCheckBox = 'on';        % on to enable and off to disable Unit average power option

% Initialize variables
numframes = length(modIdx);
dataSymbols  = cell(1,numframes);
modSelTmp = cell(1,numframes);
modOrder = cell(1,numframes);
codeRateStr = cell(1,numframes);
referenceOutput = cell(1,numframes);
codeRateIndTmp = cell(1,numframes);

Сгенерируйте системы координат случайных выборок

Сгенерируйте системы координат комплексных случайных выборок с помощью функции MATLAB randn.

for ii = 1:numframes
    dataSymbols{ii} = complex(randn(framesize,1),randn(framesize,1));
    modSelTmp{ii} = fi(modIdx(ii)*ones(framesize,1),0,3,0);
    codeRateIndTmp{ii} = fi(codeRateIdx(ii)*ones(framesize,1),0,4,0);
end

if strcmp(UnitAvgCheckBox,'on')
 UnitAvgPower = true;
else
 UnitAvgPower = false;
end

Преобразуйте системы координат в поток случайных выборок

Преобразуйте системы координат комплексных случайных выборок к потоку комплексных случайных выборок, чтобы предоставить их, как введено блоку.

idlecyclesbetweensamples = 0;
idlecyclesbetweenframes = 0;
[dataIn, ctrl] = whdlFramesToSamples(dataSymbols,idlecyclesbetweensamples, ...
    idlecyclesbetweenframes);
[modInd, ~] = whdlFramesToSamples(modSelTmp,idlecyclesbetweensamples, ...
    idlecyclesbetweenframes);
[codeRateInd, ~] = whdlFramesToSamples(codeRateIndTmp,idlecyclesbetweensamples, ...
    idlecyclesbetweenframes);
startIn = logical(ctrl(:,1)');
endIn = logical(ctrl(:,2)');
validIn = logical(ctrl(:,3)');

sampletime = 1;
samplesizeIn = 1;
simTime = size(ctrl,1)*8;

Запустите модель Simulink®

HDL DVBS2 Symbol Demodulator подсистема содержит блок DVBS2 Symbol Demodulator. Выполнение модели импортирует переменные dataIn входного сигнала, startIn, endIn, validIn, modIdx, и codeRateIdx с блоком из скрипта и экспорта поток демодулируемых выходных выборок dataOut и шина управления, содержащая startOut, endOut, и validOut сигналы от блока до рабочего пространства MATLAB.

modelname = 'HDLDVBS2SymbolDemodulator';
open_system(modelname);
set_param([modelname '/DVBS2SymbolDemod/DVBS2 Symbol Demodulator'],'UnitAveragePower',UnitAvgCheckBox)
symDemodOut = sim(modelname);

Демодулируйте потоковые выборки Используя функцию MATLAB

Чтобы демодулировать поток случайных выборок, предоставьте их, как введено refDVBS2SymDemod функция. Можно использовать выход этой функции как ссылка, чтобы сравнить выход блока.

for ii = 1:numframes
 inpParamFr.modIdx = modIdx(ii);
 inpParamFr.codeRateIdx = codeRateIdx(ii);
 referenceOutput{ii} = refDVBS2SymDemod(dataSymbols{ii},inpParamFr,UnitAvgCheckBox);
end

Сравните блок Simulink Выход с функцией MATLAB Выход

Сравните выход блока DVBS2 Symbol Demodulator с выходом refDVBS2SymDemod функция.

startIdx = find(symDemodOut.startOut.Data);
endIdx = find(symDemodOut.endOut.Data);
actualData = cell(1,numframes);

for ii = 1:numframes
   idx = startIdx(ii):endIdx(ii);
   tmpDataOut = symDemodOut.dataOut.Data(:,idx);
   dataOutSqueezed = squeeze(tmpDataOut);
   tmpValidOut = symDemodOut.validOut.Data(:,idx);
   demodOut = tmpDataOut(:,tmpValidOut);
   actualData{ii} = double(demodOut(:));
end

referenceOutput = double(cell2mat(referenceOutput.'));
actualData = double(cell2mat(actualData.'));

figure(1)
stem(actualData,'-bo')
hold on
stem(referenceOutput,'-r*')
grid on
legend('Reference Output','Block Output')
xlabel('Sample Index')
ylabel('Magnitude')
title('Comparison of Simulink Block and MATLAB Function')

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

| |