В этом примере показано, как использовать блок OFDM Demodulator, чтобы демодулировать комплексный временной интервал выборки OFDM к поднесущим. Модель в качестве примера поддерживает генерацию HDL-кода для подсистемы OFDMDemod. Рабочий процесс выполняет эти шаги:
Настройте параметры входных данных.
Сгенерируйте системы координат случайных входных выборок.
Преобразуйте структурированные входные данные в поток выборок и импортируйте поток в Simulink®.
Запустите модель Simulink, которая содержит блок OFDM Demodulator.
Экспортируйте поток демодулируемых выборок от Simulink до рабочей области MATLAB®.
Демодулируйте случайные входные выборки с ofdmdemod_baseline
функционируйте, чтобы использовать его выход в качестве справочных данных.
Сравните выходные данные блока Simulink со ссылочной функцией MATLAB выход.
Настройте параметры входных данных.
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]; end symbOffset=floor(cpFraction*cpLen);
Сгенерируйте системы координат случайных входных выборок.
data=randn(fftLen,numOFDMSym)+1i*randn(fftLen,numOFDMSym); dataIn = ofdmmod(data,fftLen,cpLen);
Импортируйте входной поток к Simulink.
data=dataIn(:); valid= true(length(dataIn),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);
Запустите модель 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