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

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

Сгенерируйте две входные камеры LTE OFDM, которые используют различные NDLRB или различные типы циклического префикса. Увеличьте обе формы волны до базовой частоты дискретизации 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 LTE поддерживает внутренние счетчики субкадров в каждой камере. Блок требует сброса после неполной камеры, чтобы очистить счетчики, прежде чем он сможет правильно демодулировать последующие камеры. Создайте импульсный сигнал сброса в конце первой формы волны.

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

Настройте входные данные модели Simulink™. Преобразуйте тестовую форму сигнала в тип данных с фиксированной точкой, чтобы смоделировать результат от 12-битного АЦП. Шаг расчета 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, учитывая задержку блока LTE 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

См. также

Блоки