Используйте пользовательскую частоту дискретизации OFDM и пользовательский размер БПФ

Этот пример объясняет, как установить пользовательские значения для входа частоты дискретизации, SampleRate, и вход размера быстрого преобразования Фурье (FFT), Nfft, когда вы вызываете функцию OFDM (nrOFDMModulate, nrOFDMInfo, и nrOFDMDemodulate).

Пользовательская частота дискретизации OFDM

Значение, которое вы устанавливаете для SampleRate введите определяет частоту дискретизации формы волны.

Номинальная частота дискретизации, соответствующая размеру БПФ, используемому в модуляции OFDM, FFTSR, равно Nfft * carrier.SubcarrierSpacing * 1000, где carrier входной параметр вызова функции, задавая настройку несущей.

Поскольку передискретизация OFDM-модулируемой формы волны на коэффициент SampleRate/FFTSR, передискретизация является дорогостоящей если SampleRate и FFTSR не имейте больших общих множителей.

Пользовательский размер БПФ

Значение, которое вы устанавливаете для Nfft введите должен удовлетворить этим условиям.

  • Nfft целочисленное значение, приводящее к длинам циклического префикса с целочисленным знаком.

  • Nfft целочисленная степень 2.

  • Nfft результаты в максимальном заполнении 100%. Фактическое заполнение равно carrier.NSizeGrid * 12 / Nfft.

Можно только достигнуть заполнения полосы пропускания точно 100%, когда эти условия применяются.

  • БПФ и сетка несущей имеют тот же размер, то есть, Nfft = carrier.NSizeGrid * 12.

  • Передискретизация не нужна, то есть, SampleRate = Nfft * carrier.SubcarrierSpacing * 1000.

Постройте заполнение полосы пропускания

Создайте объект настройки несущей.

carrier = nrCarrierConfig;

Установите SampleRate для каждого NSizeGrid таким образом, что заполнение полосы пропускания (txBW / SampleRate) 90%. Установите Nfft к степени 2.

nSizeGrids = 1:275;
userSampleRateUserNfft = zeros(1,275);
fftOccupancy = zeros(1,275);
for nSizeGrid = 1:275
    carrier.NSizeGrid = nSizeGrid;
    % Transmission bandwidth of OFDM waveform
    txBW = carrier.NSizeGrid * 12 * carrier.SubcarrierSpacing * 1000;
    sr = txBW / 0.9;
    nfft = max(128,2^ceil(log2(carrier.NSizeGrid * 12)));
    ofdmInfo = nrOFDMInfo(carrier,'SampleRate',sr,'Nfft',nfft);
    userSampleRateUserNfft(nSizeGrid) = ofdmInfo.Nfft;
    fftOccupancy(nSizeGrid) = carrier.NSizeGrid * 12 / ofdmInfo.Nfft;    
end

Постройте получившийся размер БПФ.

figure;
plot(nSizeGrids,userSampleRateUserNfft,'x');
title({'Nfft Selected with Power of 2 Size' 'with Bandwidth Occupancy of 90%'});
axis([1 275 min(userSampleRateUserNfft) max(userSampleRateUserNfft)]);
xlabel('NSizeGrid');
xticks([1 52 106 160 216 275]);
ylabel('Nfft');
yticks(2.^(7:12));

Figure contains an axes object. The axes object with title Nfft Selected with Power of 2 Size with Bandwidth Occupancy of 90% contains an object of type line.

Постройте получившееся заполнение БПФ.

figure;
plot(nSizeGrids,fftOccupancy,'x');
title({'FFT Occupancy' 'with Bandwidth Occupancy of 90%'});
axis([1 275 0 1]);
xlabel('NSizeGrid');
xticks([1 52 106 160 216 275]);
ylabel('FFT Occupancy');

Figure contains an axes object. The axes object with title FFT Occupancy with Bandwidth Occupancy of 90% contains an object of type line.

Получите информацию OFDM

Обновите несущую с 25 блоками ресурса (RBS).

carrier.NSizeGrid = 25;

Получите информацию OFDM.

ofdmInfo = nrOFDMInfo(carrier)
ofdmInfo = struct with fields:
                   Nfft: 512
             SampleRate: 7680000
    CyclicPrefixLengths: [40 36 36 36 36 36 36 40 36 36 36 36 36 36]
          SymbolLengths: [552 548 548 548 548 548 548 552 548 548 548 ... ]
              Windowing: 18
           SymbolPhases: [0 0 0 0 0 0 0 0 0 0 0 0 0 0]
         SymbolsPerSlot: 14
       SlotsPerSubframe: 1
          SlotsPerFrame: 10

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

ofdmInfo.SymbolLengths - ofdmInfo.CyclicPrefixLengths
ans = 1×14

   512   512   512   512   512   512   512   512   512   512   512   512   512   512

Поскольку конструкция символа OFDM выполняется с помощью ОБПФ размера, который вы задаете в Nfft введите, CyclicPrefixLengths и SymbolLengths полевые возвращаемые значения в терминах этого Nfft значение. Заданный Nfft также возвращен в Nfft поле выхода.

nfft = 640;
ofdmInfo = nrOFDMInfo(carrier,'Nfft',nfft)
ofdmInfo = struct with fields:
                   Nfft: 640
             SampleRate: 9600000
    CyclicPrefixLengths: [50 45 45 45 45 45 45 50 45 45 45 45 45 45]
          SymbolLengths: [690 685 685 685 685 685 685 690 685 685 685 ... ]
              Windowing: 22
           SymbolPhases: [0 0 0 0 0 0 0 0 0 0 0 0 0 0]
         SymbolsPerSlot: 14
       SlotsPerSubframe: 1
          SlotsPerFrame: 10

ofdmInfo.SymbolLengths - ofdmInfo.CyclicPrefixLengths
ans = 1×14

   640   640   640   640   640   640   640   640   640   640   640   640   640   640

Для частоты дискретизации по умолчанию количество выборок временного интервала каждого символа OFDM совпадает со значениями SymbolLengths поле . Если вы задаете SampleRate введите, заданное значение возвращено в SampleRate поле выхода. Однако CyclicPrefixLengths и SymbolLengths поля описываются в терминах размера ОБПФ, используемого во время конструкции символа OFDM, поэтому, эти значения не изменяются в выходе. Форма волны передискретизируется к частоте дискретизации, которую вы задаете после конструкции символа OFDM. В зависимости от частоты дискретизации длина циклических префиксов и номинальных символов OFDM в соответствующей форме волны OFDM не может быть целым числом выборок.

sr = 1.35 * nfft * carrier.SubcarrierSpacing * 1e3;
ofdmInfo = nrOFDMInfo(carrier,'Nfft',640,'SampleRate',sr)
ofdmInfo = struct with fields:
                   Nfft: 640
             SampleRate: 12960000
    CyclicPrefixLengths: [50 45 45 45 45 45 45 50 45 45 45 45 45 45]
          SymbolLengths: [690 685 685 685 685 685 685 690 685 685 685 ... ]
              Windowing: 22
           SymbolPhases: [0 0 0 0 0 0 0 0 0 0 0 0 0 0]
         SymbolsPerSlot: 14
       SlotsPerSubframe: 1
          SlotsPerFrame: 10

ratio = ofdmInfo.SampleRate / (ofdmInfo.Nfft * carrier.SubcarrierSpacing * 1e3)
ratio = 1.3500
disp(num2str(ofdmInfo.SymbolLengths*ratio,'%0.3f '));
931.500 924.750 924.750 924.750 924.750 924.750 924.750 931.500 924.750 924.750 924.750 924.750 924.750 924.750

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

Функции

Похожие темы