В этом примере показано, как использовать блок OFDM Channel Estimator, чтобы оценить канал с помощью входных данных и ссылочных поднесущих. В этой модели в качестве примера активированы опции усреднения и интерполяции. Подсистема Алгоритма HDL в этой модели в качестве примера поддерживает генерацию HDL-кода.
Настройте эти переменные рабочей области для модели, чтобы использовать. Можно изменить эти значения согласно требованию.
rng('default');
numOFDMSym = 980;
numOFDMSymToBeAvg = 14;
interpolFac = 3;
maxNumScPerSym = 72;
numOFDMSymPerFrame = 140;
numScPerSym = 72;
Используйте numScPerSym
и numOFDMSym
переменные, чтобы сгенерировать комплексные синусоидальные поднесущие входных данных с их действительными и мнимыми частями, сгенерированными отдельно.
dataInGrid = zeros(numScPerSym,numOFDMSym); for numScPerSymCount = 0:numScPerSym - 1 for numOFDMSymCount = 0:numOFDMSym - 1 realXgain = 1 + .2*sin(2*pi*numScPerSymCount/numScPerSym); realYgain = 1 + .5*sin(2*pi*numOFDMSymCount/numOFDMSymPerFrame); imagXgain = 1 + .3*sin(2*pi*numScPerSymCount/numScPerSym); imagYgain = 1 + .4*sin(2*pi*numOFDMSymCount/numOFDMSymPerFrame); dataInGrid(numScPerSymCount+1,numOFDMSymCount+1) = realXgain*realYgain + 1i*(imagXgain*imagYgain); end end validIn = true(1,length(dataInGrid(:))); figure(1); surf(real(dataInGrid)) xlabel('OFDM Symbols') ylabel('Subcarriers') zlabel('Magnitude') title('Input Data Grid (Real Part)') figure(2); surf(imag(dataInGrid)) xlabel('OFDM Symbols') ylabel('Subcarriers') zlabel('Magnitude') title('Input Data Grid (Imaginary Part)')
Сгенерируйте поднесущие справочных данных.
refDataIn = randsrc(size(dataInGrid(:),1),size(dataInGrid(:),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(dataInGrid(:))); resetSig = false(1,length(dataInGrid(:)));
Запустите модель. Выполнение модели импортирует переменные входного сигнала от рабочего пространства MATLAB до блока OFDM Channel Estimator в модели.
modelname = 'genhdlOFDMChannelEstimatorModel';
open_system(modelname);
out = sim(modelname);
Экспортируйте выход блока OFDM Channel Estimator к рабочей области MATLAB®. Постройте действительную часть и мнимую часть экспортируемого блока выход.
simOut = out.dataOut.Data(out.validOut.Data); N = length(simOut) - mod(length(simOut),numScPerSym); temp = simOut(1:N); channelEstimateSimOut = reshape(temp,numScPerSym,length(temp)/numScPerSym); figure(3); surf(real(channelEstimateSimOut)) xlabel('OFDM Symbols') ylabel('Subcarriers') zlabel('Magnitude') title('Channel Estimator Output (Real Part)') figure(4); surf(imag(channelEstimateSimOut)) xlabel('OFDM Symbols') ylabel('Subcarriers') zlabel('Magnitude') title('Channel Estimator Output (Imaginary Part)')
Оцените канал при помощи channelEstReference
функция с sinsusoidal поднесущими входных данных.
dataOut1 = channelEstReference(... numOFDMSymToBeAvg,interpolFac,numScPerSym,numOFDMSym, ... dataInGrid(:),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
Сравните блок OFDM Channel Estimator выход с channelEstReference
функциональный выход. Постройте выходное сравнение как действительную часть и мнимую часть с помощью отдельных графиков.
figure('units','normalized','outerposition',[0 0 1 1]) subplot(2,1,1) plot(real(matOut(:))); hold on; plot(real(simOut(:))); grid on legend('MATLAB Reference Output','Simulink Block Output') 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('MATLAB Reference Output','Simulink Block Output') 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: %.2f dB',sqnrRealdB); fprintf('\n SQNR of imaginary part: %.2f dB\n',sqnrImagdB);
OFDM Channel Estimator SQNR of real part: 38.54 dB SQNR of imaginary part: 37.77 dB