Этот пример описывает внутреннее создание фильтра передискретизации функций OFDM nrOFDMModulate
, nrOFDMInfo
, и nrOFDMDemodulate
. Эти функции позволяют вам задать частоту дискретизации OFDM и размер БПФ при помощи SampleRate
и Nfft
входные параметры значения имени. Когда заданная частота дискретизации и номинальная частота дискретизации, соответствуя размеру БПФ, не соответствуют, функции OFDM передискретизируют форму волны с помощью внутреннего многоскоростного КИХ-фильтра.
Значение, которое вы устанавливаете для SampleRate
введите определяет частоту дискретизации формы волны.
Номинальная частота дискретизации, соответствующая размеру БПФ, используемому в модуляции OFDM, , равно Nfft * carrier.SubcarrierSpacing * 1000
, где carrier
входной параметр вызова функции, задавая настройку несущей.
Когда заданная частота дискретизации и номинальная частота дискретизации не соответствуют, функции OFDM передискретизируют форму волны с помощью внутреннего фильтра передискретизации. Установка частоты дискретизации к номинальной частоте дискретизации не приводит к передискретизации во время модуляции OFDM.
Создайте объект настройки несущей с 25 блоками ресурса.
carrier = nrCarrierConfig; carrier.NSizeGrid = 25;
Получите информацию OFDM.
ofdmInfo = nrOFDMInfo(carrier);
Отобразите номинальную частоту дискретизации и частоту дискретизации, возвращенную в информации OFDM.
ofdmInfo.Nfft * carrier.SubcarrierSpacing * 1000
ans = 7680000
ofdmInfo.SampleRate
ans = 7680000
Проверьте что, задав частоту дискретизации 7.68e6
не приводит к передискретизации во время модуляции OFDM.
grid = nrResourceGrid(carrier); grid(:) = nrSymbolModulate(randi([0 1],numel(grid)*2,1),'QPSK'); waveform1 = nrOFDMModulate(carrier,grid); waveform2 = nrOFDMModulate(carrier,grid,'SampleRate',7.68e6); isequal(waveform1,waveform2)
ans = logical
1
Фильтр передискретизации является функцией этих двух отношений.
Отношение полосы пропускания передачи () к номинальной частоте дискретизации: / , где равно carrier.NSizeGrid * 12 * carrier.SubcarrierSpacing * 1000
.
Отношение номинальной частоты дискретизации к заданной частоте дискретизации: / SampleRate
.
Функции OFDM вызывают designMultirateFIR
функция с этими входными параметрами, чтобы спроектировать фильтр передискретизации.
Коэффициент интерполяции, L
, равняйтесь SampleRate/g
, где g =
gcd
(, SampleRate
). Поскольку передискретизация OFDM-модулируемой формы волны на коэффициент SampleRate/
, передискретизация является дорогостоящей если SampleRate
и не имейте больших общих множителей.
Фактор децимации, M
, равный /g
.
Ширина перехода, TW
, таким образом, что полоса перехода запускается в / 2 (то есть, полоса перехода запускается в ребре занимаемой полосы).
Затухание в полосе задерживания, Astop
, равняйтесь 70 дБ.
Если SampleRate
> то:
L
> M
и полоса перехода останавливается в / 2 (соответствие нормированной частоте 1/L
).
Фильтр действует как реконструкционный фильтр после повышающей дискретизации L
.
Если SampleRate
< то:
M
> L
и полоса перехода останавливается в SampleRate/2
(соответствие нормированной частоте 1/M
).
Фильтр действует как фильтр сглаживания прежде, чем проредить M
.
Создайте объект настройки несущей с 25 блоками ресурса.
carrier = nrCarrierConfig; carrier.NSizeGrid = 25;
Вычислите полосу пропускания передачи.
txBW = carrier.NSizeGrid * 12 * carrier.SubcarrierSpacing * 1000
txBW = 4500000
Задайте пользовательскую частоту дискретизации. Получите соответствующую информацию OFDM и вычислите номинальную частоту дискретизации для размера БПФ по умолчанию.
SampleRate = 6e6;
ofdmInfo = nrOFDMInfo(carrier,'SampleRate',SampleRate);
Nfft = ofdmInfo.Nfft
Nfft = 640
fftSR = Nfft * carrier.SubcarrierSpacing * 1000
fftSR = 9600000
Вычислите g
L
, и M
.
g = gcd(fftSR,SampleRate)
g = 1200000
L = SampleRate / g
L = 5
M = fftSR / g
M = 8
Постройте спектр формы волны OFDM прежде, чем передискретизировать путем установки частоты дискретизации на номинальную частоту дискретизации.
figure; hold on; [f,S] = measureSpectrum(carrier,Nfft,fftSR,1); plot(f,S,'LineWidth',2);
Постройте спектр формы волны OFDM после повышающей дискретизации L
, прежде, чем применить фильтр.
[fL,S] = measureSpectrum(carrier,Nfft,fftSR,L);
hL = plot(fL,S,':');
Постройте спектр формы волны OFDM после применения фильтра.
[f,S] = measureSpectrum(carrier,Nfft,fftSR*L,1); plot(f,S);
Постройте спектр итоговой формы волны OFDM после субдискретизации.
[f,S] = measureSpectrum(carrier,Nfft,SampleRate,1); plot(f,S,'Color',hL.Color,'LineWidth',2); hL.Color = [0.5 0.5 0.5];
Наложите спецификацию создания фильтра.
fStop = fftSR / 2 * L / max([L M]); aStop = -70.0; spec = [fL(1) aStop; -fStop aStop; -txBW/2 0; txBW/2 0; fStop aStop; fL(end) aStop]; plot(spec(:,1),spec(:,2),'k--'); legend('Nominal SR','Upsampled','Filtered','Desired SR','Filter specification','Location','north'); xlabel('Frequency'); ylabel(['Power Spectral Density (dBw/' num2str(carrier.SubcarrierSpacing) 'kHz)']); axis([0 fftSR -120 10]);
function [f,S] = measureSpectrum(carrier,Nfft,SampleRate,L) % Subcarrier spacing in Hz SCS = carrier.SubcarrierSpacing * 1e3; % Set up spectrum estimator spectrumEstimator = dsp.SpectrumEstimator; spectrumEstimator.SampleRate = SampleRate; spectrumEstimator.AveragingMethod = 'Exponential'; spectrumEstimator.ForgettingFactor = 0.99; spectrumEstimator.FrequencyRange = 'centered'; spectrumEstimator.PowerUnits = 'dBW'; spectrumEstimator.SpectrumType = 'Power density'; spectrumEstimator.FFTLengthSource = 'Property'; spectrumEstimator.FFTLength = floor(SampleRate * L / SCS); % For 100 slots rs = RandStream('mt19937ar','Seed',1); for nSlot = 0:99 % Create a slot grid filled with QPSK symbols and OFDM modulate grid = nrResourceGrid(carrier); grid(:) = nrSymbolModulate(rs.randi([0 1],numel(grid)*2,1),'QPSK'); waveform = nrOFDMModulate(carrier,grid,'Nfft',Nfft,'SampleRate',SampleRate); waveform = waveform * Nfft; % Apply interpolation if required if (L>1) T = size(waveform,1); waveform = reshape([waveform.'; zeros(L-1,T)],[],1) * sqrt(L); end % Measure the spectrum S = spectrumEstimator(waveform); end % Create frequency axis N = spectrumEstimator.FFTLength; f = (-N/2:(N/2 - 1)) * SCS; % Translate from dBw/Hz to dBW/SCS S = S + 10*log10(SCS); end