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

Этот пример показывает, как использовать блок 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(:)));

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

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

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

Экспорт потока оценок канала из Simulink в рабочую область MATLAB ®

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

См. также

Блоки

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