exponenta event banner

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

В этом примере показано, как восстановить блок демодулятора OFDM LTE из незаконченной ячейки LTE. Входные данные усекаются для имитации потери сигнала или сброса из восходящих частей приемника. Пример модели использует сигнал сброса для сброса внутренних счетчиков состояния блока демодулятора OFDM LTE и последующего перезапуска вычислений в следующей соте. В этом примере параметр скорости выборки входных данных демодулятора OFDM LTE установлен в Use maximum input data sample rate. Так, базовая частота дискретизации блока составляет 30,72 МГц.

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

См. также

Блоки