Оцените канал Используя входные данные и ссылочные поднесущие

В этом примере показано, как использовать блок OFDM Channel Estimator, чтобы оценить канал с помощью входных данных и ссылочных поднесущих. В этой модели в качестве примера активированы опции усреднения и интерполяции. HDL Algorithm подсистема в этой модели в качестве примера поддерживает генерацию 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(:)));

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

Запустите модель. Выполнение модели импортирует переменные входного сигнала от рабочего пространства MATLAB до блока OFDM Channel Estimator в модели.

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

Экспортируйте поток оценок канала от Simulink до MATLAB® Workspace

Экспортируйте выход блока 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)')

Оцените канал Используя функцию MATLAB

Оцените канал при помощи channelEstReference функция с синусоидальными поднесущими входных данных.

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

Сравните блок Simulink Выход с функцией MATLAB Выход

Сравните блок 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

Смотрите также

Блоки

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