Этот пример объясняет, как установить пользовательские значения для входа частоты дискретизации, 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