LTE демодуляция OFDM потоковой передачи выборок

Этот пример показывает, как использовать блок OFDM Demodulator, чтобы возвратить сетку ресурса LTE в потоковую передачу выборок. Можно сгенерировать HDL-код от этого блока.

Сгенерируйте символы входа LTE OFDM с помощью LTE Toolbox™. Выберите ссылочный канал на основе NDLRB и задайте тип циклического префикса.

enb = lteRMCDL('R.5');
enb.TotSubframes = 1;
enb.CyclicPrefix = 'Normal';  % or 'Extended'
% ------------------------------------------------------------
%      NDLRB  |   Reference Channel
% ------------------------------------------------------------
%   6         |   R.4
%   15        |   R.5
%   25        |   R.6
%   50        |   R.7
%   75        |   R.8
%   100       |   R.9
% ------------------------------------------------------------

[waveform,LTEGrid,info] = lteRMCDLTool(enb,[1;0;0;1]);

Блок OFDM Demodulator ожидает, что входные выборки на уровне частоты дискретизации на 30,72 МГц будут соответствовать размеру БПФ. Частота дискретизации waveform зависит от NDLRB, таким образом, сгенерированная форма волны может быть на более низком уровне. Чтобы сгенерировать тестовую форму волны, сверхдискретизируйте сигнал к 30,72 МГц, нормируйте степень и добавьте шум. Масштабируйте значение сигнала, чтобы быть в области значений-1 к 1 для легкого преобразования в фиксированные точки.

FsRx = 30.72e6;
FsTx = info.SamplingRate;
% --------------------------------------------------------------
%      NDLRB              |   Sampling Rate (MHz)
%   ------------------------------------------------------------
%   1) 6                  |   1.92
%   2) 15                 |   3.84
%   3) 25                 |   7.68
%   4) 50                 |   15.36
%   5) 75                 |   30.72
%   6) 100                |   30.72
%   ------------------------------------------------------------

tx = resample(waveform,FsRx,FsTx);
avgTxPower =  (tx' * tx) / length(tx);
tx = tx / sqrt(avgTxPower);
n = 0.1 * complex(randn(length(tx),1),randn(length(tx),1));
rx = tx + n;
rx = 0.99 * rx / max(abs(rx));

Используйте функцию LTE Toolbox в качестве поведенческой ссылки для демодуляции OFDM. Субдискретизируйте тестовую форму волны к фактической частоте дискретизации для выбранного NDLRB. Затем компенсируйте масштабный коэффициент, который следует из различия в размерах БПФ.

refInput = resample(rx,FsTx,FsRx);
refGrid = lteOFDMDemodulate(info,refInput);
refGrid = refGrid * FsRx/FsTx;

Настройте входные данные модели Simulink™. Преобразуйте тестовую форму волны в тип данных с фиксированной точкой, чтобы смоделировать результат 12-битного ADC. Шаг расчета Simulink составляет 30,72 МГц.

Модель Simulink импортирует демонстрационный поток dataIn и validIn, входные параметры NDLRB и cyclicPrefixType и переменная stopTime.

NDLRB = info.NDLRB;
if strcmp(info.CyclicPrefix,'Normal')
    cyclicPrefixType = false;
else
    cyclicPrefixType = true;
end

sampling_time = 1/FsRx;
dataIn = fi(rx,1,12,11);
validIn = true(length(dataIn),1);

Вычислите время симуляции Simulink, объяснив задержку блока OFDM Demodulator. Задержка БПФ фиксируется, потому что блок использует БПФ с 2048 точками. Примите максимальную возможную задержку циклического префиксного удаления и операций выбора поднесущей. Симуляция должна запуститься достаточно долго, чтобы применить входные данные плюс задержка итогового вводимого символа.

FFTlatency = 4137;
CPRemove_max = 512; % extended CP
carrierSelect_max = 424; % NDRLB 100
stopTime = sampling_time*(length(dataIn)+CPRemove_max+FFTlatency+carrierSelect_max);

Запустите модель Simulink. Модель импортирует dataIn и структуры validIn и возвращает dataOut и validOut.

modelname = 'LTEOFDMDemodulatorExample';
open(modelname)
set_param(modelname,'SampleTimeColors','on');
set_param(modelname,'SimulationCommand','Update');
sim(modelname)

Сравните вывод модели Simulink против поведенческих результатов и вычислите SQNR оптимизированного HDL блока LTE OFDM Demodulator.

rxgridSimulink = dataOut(validOut);

figure('units','normalized','outerposition',[0 0 1 1])
subplot(2,1,1)
plot(real(refGrid(:)))
hold on
plot(squeeze(real(rxgridSimulink)))
legend('Real part of behavioral waveform','Real part of HDL-optimized waveform')
title('Comparison of LTE Time-Domain Downlink Waveform')
xlabel('OFDM Subcarriers')
ylabel('Real Part of Time-Domain Waveform')

subplot(2,1,2)
plot(imag(refGrid(:)))
hold on
plot(squeeze(imag(rxgridSimulink)))
legend('Imag part of behavioral waveform','Imag part of HDL-optimized waveform')
title('Comparison of LTE Time-Domain Downlink Waveform')
xlabel('OFDM Subcarriers')
ylabel('Imag Part of Time-Domain Waveform')

sqnrRealdB = 10*log10(var(real(rxgridSimulink))/abs(var(real(rxgridSimulink))-var(real(refGrid(:)))));
sqnrImagdB = 10*log10(var(imag(rxgridSimulink))/abs(var(imag(rxgridSimulink))-var(imag(refGrid(:)))));

fprintf('\n LTE OFDM Demodulator: \n SQNR of real part is %.2f dB',sqnrRealdB)
fprintf('\n SQNR of imaginary part is %.2f dB\n',sqnrImagdB)
 LTE OFDM Demodulator: 
 SQNR of real part is 25.98 dB
 SQNR of imaginary part is 23.23 dB

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

Блоки