Этот пример объясняет, как установить пользовательские значения для входа частоты дискретизации, SampleRate, и вход размера быстрого преобразования Фурье (FFT), Nfft, когда вы вызываете функцию OFDM (nrOFDMModulate, nrOFDMInfo, и nrOFDMDemodulate).
Значение, которое вы устанавливаете для SampleRate введите определяет частоту дискретизации формы волны.
Номинальная частота дискретизации, соответствующая размеру БПФ, используемому в модуляции OFDM, , равно Nfft * carrier.SubcarrierSpacing * 1000, где carrier входной параметр вызова функции, задавая настройку несущей.
Поскольку передискретизация OFDM-модулируемой формы волны на коэффициент SampleRate/, передискретизация является дорогостоящей если SampleRate и не имейте больших общих множителей.
Значение, которое вы устанавливаете для 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; 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');

Обновите несущую с 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