Use Custom OFDM Sample Rate and Default FFT Size
This example shows how the OFDM functions (nrOFDMModulate
, nrOFDMInfo
, and nrOFDMDemodulate
) set the default value for the fast Fourier transform (FFT) size input, Nfft
, when you call an OFDM function and these conditions apply.
You specify a custom value for the sample rate input,
SampleRate
.You do not specify a value for the
Nfft
input, or you specify'Nfft',[]
.
Custom OFDM Sample Rate
The value that you set for the SampleRate
input determines the sample rate of the waveform.
The nominal sample rate corresponding to the FFT size used in the OFDM modulation, , is equal to Nfft*carrier.SubcarrierSpacing*1000
, where carrier
is the input argument of the function call that specifies the carrier configuration.
Because the resampling of the OFDM-modulated waveform is by a factor of SampleRate/
, the resampling is costly if SampleRate
and do not have large common factors.
Default FFT Size
The default value set for the Nfft
input satisfies these conditions.
Nfft
is a multiple of 128, that is,Nfft = 128 *
Y
(to ensure integer-valued cyclic prefix lengths).The lower bound of
Y
is equal toceil((carrier.NSizeGrid*12/0.85)/128)
. That is, the lower bound depends on the maximum FFT occupancy of 85%.The upper bound of
Y
is equal toceil((2*SampleRate/(carrier.SubcarrierSpacing*1000))/128)
. That is, the upper bound depends on the sample rate you specify.Y
maximizes the common factors of the nominal and specified sample rates, that is,gcd
(,SampleRate
).
Plot Bandwidth Occupancy
Create a carrier configuration object.
carrier = nrCarrierConfig;
Set the SampleRate
for each NSizeGrid
value to give an occupancy of 75%.
nSizeGrids = 1:275; userSampleRateDefaultNfft = 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.75; ofdmInfo = nrOFDMInfo(carrier,'SampleRate',sr); userSampleRateDefaultNfft(nSizeGrid) = ofdmInfo.Nfft; fftOccupancy(nSizeGrid) = carrier.NSizeGrid*12/ofdmInfo.Nfft; end
Plot the resulting Nfft
values.
figure; plot(nSizeGrids,userSampleRateDefaultNfft,'x'); title({'FFT Size for Custom Sample Rate' 'with Bandwidth Occupancy of 75%'}); axis([1 275 min(userSampleRateDefaultNfft) max(userSampleRateDefaultNfft)]); xlabel('NSizeGrid'); xticks([1 52 106 160 216 275]); ylabel('FFT Size'); yticks([min(userSampleRateDefaultNfft) 1024:1024:8192 max(userSampleRateDefaultNfft)]);
Plot the resulting FFT occupancy.
figure; plot(nSizeGrids,fftOccupancy,'x'); title({'FFT Occupancy for Custom SampleRate' 'with Bandwidth Occupancy of 75%'}); axis([1 275 0 1]); xlabel('NSizeGrid'); xticks([1 52 106 160 216 275]); ylabel('FFT Occupancy');