Сбросьте и перезапустите LTE демодуляция OFDM

Этот пример показывает, как восстановить блок OFDM Demodulator от незаконченной ячейки LTE. Входные данные являются усеченными, чтобы моделировать потерю сигнала или сброса от восходящих частей получателя. Модель в качестве примера использует сигнал сброса очистить счетчики внутреннего состояния блока OFDM Demodulator и затем перезапустить вычисления на следующей ячейке. В этом примере параметр частоты дискретизации Входных данных Демодулятора OFDM устанавливается, чтобы Использовать максимальную частоту дискретизации входных данных. Так, базовый уровень выборки блока составляет 30,72 МГц.

Сгенерируйте две ячейки входа LTE OFDM, которые используют различный NDLRBs или различные типы циклического префикса. Сверхдискретизируйте обе формы волны к базовому уровню выборки 30,72 МГц.

% ------------------------------------------------------------
%      NDLRB  |   Reference Channel
% ------------------------------------------------------------
%   6         |   R.4
%   15        |   R.5
%   25        |   R.6
%   50        |   R.7
%   75        |   R.8
%   100       |   R.9
% ------------------------------------------------------------

enb1 = lteRMCDL('R.9');
enb1.TotSubframes = 1;
enb1.CyclicPrefix = 'Normal';  % or 'Extended'
[waveform1,grid1,info1] = lteRMCDLTool(enb1,[1;0;0;1]);

enb2 = lteRMCDL('R.6');
enb2.TotSubframes = 1;
enb2.CyclicPrefix = 'Normal';  % or 'Extended'
[waveform2,grid2,info2] = lteRMCDLTool(enb2,[1;0;0;1]);

FsRx = 30.72e6;
tx1 = resample(waveform1,FsRx,info1.SamplingRate);
tx2 = resample(waveform2,FsRx,info2.SamplingRate);

Обрежьте первую две трети формы волны через ячейку. Конкатенация сокращенной ячейки со второй сгенерированной ячейкой, оставляя некоторые недопустимые выборки промежуточными. Добавьте шум и масштабируйте значение сигнала, чтобы быть в области значений [-1, 1] для легкого преобразования в фиксированную точку.

tx1 = tx1(1:2*length(tx1)/3);

Lgap1 = 3000;
Lgap2 = 10000;
rx = [zeros(Lgap1,1); tx1; zeros(Lgap2,1); tx2];

L = length(rx);
rx = rx + 2e-4*complex(randn(L,1),randn(L,1));

dataIn_fp = 0.99*rx/max(abs(rx));

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

resetIndex = Lgap1 + length(tx1);
resetIn = false(length(rx),1);
resetIn(resetIndex) = true;

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

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

dataIn = fi(dataIn_fp,1,12,11);

validIn = [false(Lgap1,1); true(length(tx1),1); false(Lgap2,1); true(length(tx2),1)];
validIn(resetIndex+1:Lgap1+length(tx1)) = false;

NDLRB = uint16([info1.NDLRB*ones(Lgap1 + length(tx1),1); info2.NDLRB*ones(Lgap2 + length(tx2),1)]);

cpType1 = strcmp(info1.CyclicPrefix,'Extended');
cpType2 = strcmp(info2.CyclicPrefix,'Extended');
cyclicPrefixType = [repmat(cpType1,Lgap1 + length(tx1),1); repmat(cpType2,Lgap2 + length(tx2),1)];

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

FFTlatency = 4137;
CPRemove_max = 512; % extended CP
carrierSelect_max = 424; % NDRLB 100

sampling_time = 1/FsRx;
stopTime = sampling_time*(length(dataIn) + CPRemove_max + FFTlatency + carrierSelect_max);

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

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

Разделите dataOut и validOut в две части, как разделено на импульс сброса. Блок применяет сброс к выходным данным один цикл после того, как сброс будет применен на вход. Используйте сигнал validOut собрать допустимые выходные выборки.

dataOut1 = dataOut(1:resetIndex);
dataOut2 = dataOut(resetIndex+1:end);
validOut1 = validOut(1:resetIndex);
validOut2 = validOut(resetIndex+1:end);

demodData1 = dataOut1(validOut1);
demodData2 = dataOut2(validOut2);

Сгенерируйте справочные данные путем выравнивания и нормализации немодулируемых данных о сетке ресурса. Обрежьте первую ячейку таким же образом как модулируемые входные данные. Примените комплекс, масштабирующийся к каждой демодулируемой последовательности так, чтобы это могло сравниться со своими соответствующими справочными данными.

refData1 = grid1(:);
refData1 = refData1(1:length(demodData1));
refData2 = grid2(:);

refData1 = refData1/norm(refData1);
refData2 = refData2/norm(refData2);

demodData1 = demodData1/(refData1'*demodData1);
demodData2 = demodData2/(refData2'*demodData2);

Сравните вывод модели Simulink против усеченной входной сетки и отобразите результаты.

figure('units','normalized','outerposition',[0 0 1 1])
subplot(2,2,1)
plot(real(refData1(:)))
hold on
plot(squeeze(real(demodData1)))
legend('Input grid','Demodulated output')
title(sprintf('Cell 1 (NDLRB %d) - Real part', info1.NDLRB))
xlabel('OFDM Subcarriers')

subplot(2,2,2)
plot(imag(refData1(:)))
hold on
plot(squeeze(imag(demodData1)))
legend('Input grid','Demodulated output')
title(sprintf('Cell 1 (NDLRB %d) - Imaginary part', info1.NDLRB))
xlabel('OFDM Subcarriers')

subplot(2,2,3)
plot(real(refData2(:)))
hold on
plot(squeeze(real(demodData2)))
legend('Input grid','Demodulated output')
title(sprintf('Cell 2 (NDLRB %d) - Real part', info2.NDLRB))
xlabel('OFDM Subcarriers')

subplot(2,2,4)
plot(imag(refData2(:)))
hold on
plot(squeeze(imag(demodData2)))
legend('Input grid','Demodulated output')
title(sprintf('Cell 2 (NDLRB %d) - Imaginary part', info2.NDLRB))
xlabel('OFDM Subcarriers')

sqnrRealdB1 = 10*log10(var(real(demodData1))/abs(var(real(demodData1)) - var(real(refData1(:)))));
sqnrImagdB1 = 10*log10(var(imag(demodData1))/abs(var(imag(demodData1)) - var(imag(refData1(:)))));

fprintf('\n Cell 1: SQNR of real part is %.2f dB',sqnrRealdB1)
fprintf('\n Cell 1: SQNR of imaginary part is %.2f dB\n',sqnrImagdB1)

sqnrRealdB2 = 10*log10(var(real(demodData2))/abs(var(real(demodData2)) - var(real(refData2(:)))));
sqnrImagdB2 = 10*log10(var(imag(demodData2))/abs(var(imag(demodData2)) - var(imag(refData2(:)))));

fprintf('\n Cell 2: SQNR of real part is %.2f dB',sqnrRealdB2)
fprintf('\n Cell 2: SQNR of imaginary part is %.2f dB\n',sqnrImagdB2)
 Cell 1: SQNR of real part is 33.71 dB
 Cell 1: SQNR of imaginary part is 52.26 dB

 Cell 2: SQNR of real part is 32.41 dB
 Cell 2: SQNR of imaginary part is 36.72 dB

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

Блоки