В этом примере показано, как восстановить блок LTE OFDM Demodulator из незаконченной ячейки LTE. Входные данные являются усеченными, чтобы симулировать потерю сигнала или сброса от восходящих частей получателя. Модель в качестве примера использует сигнал сброса очистить счетчики внутреннего состояния блока LTE OFDM Demodulator и затем перезапустить вычисления на следующей ячейке. В этом примере параметре частоты дискретизации Входных данных LTE Демодулятор 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));
Блок LTE 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, объяснив задержку блока 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