В этом примере показано, как использовать блок OFDM Channel Estimator, чтобы оценить вход использования канала и ссылочные поднесущие. В этой модели в качестве примера включены усреднение и функции интерполяции. Модель в качестве примера поддерживает генерацию HDL-кода для подсистемы Алгоритма HDL.
rng('default');
numOFDMSym = 28;
numOFDMSymToBeAvg = 14;
interpolFac = 3;
maxNumScPerSym = 72;
numScPerSym = 72;
Используя numScPerSym
и numOFDMSym
значения, сгенерируйте поднесущие данных случайных входных выборок.
dataIn = rand(1,numOFDMSym*numScPerSym) + 1i*rand(1,numOFDMSym*numScPerSym); validIn = true(1,length(dataIn));
Используя numScPerSym
и numOFDMSym
значения, сгенерируйте поднесущие справочных данных случайных входных выборок.
refDataIn = randsrc(size(dataIn,1),size(dataIn,2), [-1 1]); refValidIn = boolean(zeros(1,numOFDMSym*numScPerSym)); startRefValidIndex = randi(interpolFac,1,1); for numOFDMSymCount = 1:numOFDMSym refValidIn(startRefValidIndex+(numOFDMSymCount-1)*numScPerSym:interpolFac:numScPerSym*numOFDMSymCount)=true; end
numScPerSymIn = numScPerSym*true(1,length(dataIn)); resetSig = false(1,length(dataIn));
modelname = 'genhdlOFDMChannelEstimatorModel';
open_system(modelname);
out = sim(modelname);
simOut = out.dataOut.Data(out.validOut.Data);
Можно использовать выход функционального channelEstReference
как справочные данные для сравнения.
dataOut1 = channelEstReference(... numOFDMSymToBeAvg,interpolFac,numScPerSym,numOFDMSym,... dataIn,validIn,refDataIn,refValidIn,numScPerSymIn); matlabOut=dataOut1(:); matOut = zeros(numel(matlabOut)*numScPerSym,1); for ii= 1: numel(matlabOut) loadArray = [matlabOut(ii).dataOut; zeros((numel(matlabOut)-1)*numScPerSym,1)]; shiftArray = circshift(loadArray,(ii-1)*numScPerSym); matOut = matOut + shiftArray; end
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(double(var(real(simOut(:)))/abs(var(real(simOut(:)))-var(real(matOut(:)))))); sqnrImagdB=10*log10(double(var(imag(simOut(:)))/abs(var(imag(simOut(:)))-var(imag(matOut(:)))))); fprintf('\n OFDM Channel Estimator: \n SQNR of real part is %.2f dB',sqnrRealdB); fprintf('\n SQNR of imaginary part is %.2f dB\n',sqnrImagdB);
OFDM Channel Estimator: SQNR of real part is 31.82 dB SQNR of imaginary part is 29.41 dB