OFDM-демодуляция потоковых выборок

Этот пример показов, как использовать блок демодулятора OFDM для демодуляции комплексных выборок OFDM временной области к поднесущим для вектора входа. Эта модель примера поддерживает генерацию HDL-кода для подсистемы OFDMDemod.

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

rng('default');
numOFDMSym = 2;
maxFFTLen = 128;
DCRem = true;
RoundingMethod = 'floor';
Normalize = false;
cpFraction = 1;
fftLen = 64;
cpLen = 16;
numLG = 6;
numRG = 5;
if DCRem
    NullInd = [1:numLG fftLen/2+1 fftLen-numRG+1:fftLen];
else
    NullInd = [1:numLG fftLen-numRG+1:fftLen]; %#ok<UNRCH>
end
symbOffset = floor(cpFraction*cpLen);
vecLen = 2;

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

data = randn(fftLen,numOFDMSym)+1i*randn(fftLen,numOFDMSym);
dataIn = ofdmmod(data,fftLen,cpLen);

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

®
data = dataIn(:);
valid = true(length(dataIn)/vecLen,1);
fftSig = fftLen*ones(length(dataIn),1);
CPSig = cpLen*ones(length(dataIn),1);
LGSig = numLG*ones(length(dataIn),1);
RGSig = numRG*ones(length(dataIn),1);
resetSig = false(length(data),1);
sampleTime = 1/vecLen;
stopTime = (maxFFTLen*3*numOFDMSym)/vecLen;

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

modelname = 'genhdlOFDMDemodulatorModel';
open_system(modelname);
out = sim(modelname);

Экспорт потока демодулированных выборок блока Simulink в рабочую область MATLAB ®

simOut = squeeze(out.dataOut(:,1,out.validOut==1));

Демодулируйте случайные входные выборки, используя ofdmdemod_baseline функция

[dataOut1] = ofdmdemod_baseline(dataIn,fftLen,cpLen,symbOffset,NullInd.',[],Normalize,RoundingMethod);
matOut = dataOut1(:);

Сравните вывод модели Simulink с выходом ofdmdemod_baseline функция

figure('units','normalized','outerposition',[0 0 1 1])
subplot(2,1,1)
plot(real(matOut(:)));
hold on;
plot(real(simOut(:)));
grid on
legend('Reference','Simulink')
xlabel('Sample Index')
ylabel('Magnitude')
title('Comparison of Simulink block and MATLAB function - Real part')

subplot(2,1,2)
plot(imag(matOut(:)));
hold on;
plot(imag(simOut(:)));
grid on
legend('Reference','Simulink')
xlabel('Sample Index')
ylabel('Magnitude')
title('Comparison of Simulink block and MATLAB function - Imaginary part')

sqnrRealdB=10*log10(var(real(simOut(:)))/abs(var(real(simOut(:)))-var(real(matOut(:)))));
sqnrImagdB=10*log10(var(imag(simOut(:)))/abs(var(imag(simOut(:)))-var(imag(matOut(:)))));

fprintf('\n OFDM Demodulator: \n SQNR of real part is %.2f dB',sqnrRealdB);
fprintf('\n SQNR of imaginary part is %.2f dB\n',sqnrImagdB);
 OFDM Demodulator: 
 SQNR of real part is 47.77 dB
 SQNR of imaginary part is 42.69 dB

См. также

Блоки