В этом примере показано, как использовать блок OFDM Demodulator, чтобы демодулировать комплексный временной интервал выборки 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;
Сгенерируйте системы координат случайных выборок с помощью функции MATLAB randn.
data = randn(fftLen,numOFDMSym)+1i*randn(fftLen,numOFDMSym); dataIn = ofdmmod(data,fftLen,cpLen);
Преобразуйте системы координат случайных выборок к потоку случайных выборок, чтобы предоставить их, как введено блоку.
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;
Выполнение модели импортирует переменные входного сигнала с блоком из скрипта и экспортирует поток демодулируемых выходных выборок от блока до рабочего пространства MATLAB.
modelname = 'genhdlOFDMDemodulatorModel';
open_system(modelname);
out = sim(modelname);
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