Передискретизация создания фильтра в функциях OFDM

Этот пример описывает внутреннее создание фильтра передискретизации функций OFDM nrOFDMModulate, nrOFDMInfo, и nrOFDMDemodulate. Эти функции позволяют вам задать частоту дискретизации OFDM и размер БПФ при помощи SampleRate и Nfft входные параметры значения имени. Когда заданная частота дискретизации и номинальная частота дискретизации, соответствуя размеру БПФ, не соответствуют, функции OFDM передискретизируют форму волны с помощью внутреннего многоскоростного КИХ-фильтра.

Частота дискретизации OFDM и номинальная частота дискретизации

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

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

Когда заданная частота дискретизации и номинальная частота дискретизации не соответствуют, функции OFDM передискретизируют форму волны с помощью внутреннего фильтра передискретизации. Установка частоты дискретизации к номинальной частоте дискретизации не приводит к передискретизации во время модуляции 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

Создание фильтра

Фильтр передискретизации является функцией этих двух отношений.

  • Отношение полосы пропускания передачи (TXBW) к номинальной частоте дискретизации: TXBW / FFTSR, где TXBW равно carrier.NSizeGrid * 12 * carrier.SubcarrierSpacing * 1000.

  • Отношение номинальной частоты дискретизации к заданной частоте дискретизации: FFTSR / SampleRate.

Функции OFDM вызывают designMultirateFIR функция с этими входными параметрами, чтобы спроектировать фильтр передискретизации.

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

  • Фактор децимации, M, равный FFTSR/g.

  • Ширина перехода, TW, таким образом, что полоса перехода запускается в ±TXBW / 2 (то есть, полоса перехода запускается в ребре занимаемой полосы).

  • Затухание в полосе задерживания, Astop, равняйтесь 70 дБ.

Если SampleRate > FFTSRто:

  • L > M и полоса перехода останавливается в ±FFTSR / 2 (соответствие нормированной частоте 1/L).

  • Фильтр действует как реконструкционный фильтр после повышающей дискретизации L.

Если SampleRate < FFTSRто:

  • M > L и полоса перехода останавливается в ±SampleRate/2 (соответствие нормированной частоте 1/M).

  • Фильтр действует как фильтр сглаживания прежде, чем проредить M.

Модуляция OFDM с передискретизацией

Создайте объект настройки несущей с 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

Вычислите gL, и 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]);

Figure contains an axes object. The axes object contains 5 objects of type line. These objects represent Nominal SR, Upsampled, Filtered, Desired SR, Filter specification.

Локальная функция

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

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

Функции

Похожие темы