основные вопросы нормализации БПФ - PullRequest
3 голосов
/ 30 октября 2010

Я использую Matlab, чтобы принимать БПФ сигналов, и я застреваю в нормализации.В частности, как нормализовать спектр в единицах дБм.Я знаю, что 0.316228 - это правильный коэффициент нормализации, но мои вопросы связаны с тем, как правильно нормализовать корзины.

Я создал следующую программу, чтобы поднять мои вопросы.Просто порежьте и вставьте его в Matlab, и он запустится сам.Смотрите вопросы в строке.

В частности, я запутался, как нормализовать корзины.Например, если БПФ имеет индексы 1: конец, где конец четный, когда я вычисляю спектр величин БПФ, нужно ли мне умножать на (2 / N) для индексов 2: (конец / 2)?Аналогично, нормализуется ли бин на частоте Найквиста (расположенный в конце индекса / 2 + 1) к (1 / N)?Я знаю, что есть множество способов нормализовать в зависимости от своих интересов.Скажем, сигнал, который я использую (St ниже), это напряжение, снятое с АЦП.

Любая обратная связь с благодарностью.Заранее спасибо!

%% 1. Create an Example Signal
N = 2^21 ;                   % N = number of points in time-domain signal (St)
St = 1 + rand(N,1,'single'); % St = example broadband signal (e.g. random noise)

% take FFT
Sf = fft(St, N);                    
Sf_mag = (2/N)*abs(Sf(1: N/2 + 1));
Sf_dBm = 20*log10(Sf_mag / 0.316228); % 0.316338 is peak voltage of 1 mW into 50 Ohms

% Q: Are Sf_mag and Sf_dBm normalized correctly? (assume 0.316338 is correct 
%    peak voltage to get 1mW in 50 Ohms)
% Q: Should Sf_mag(fftpoints/2 + 1) = (1/N)*abs(Sf(fftpoints/2 + 1) for correct normalization 
%    of Nyquist frequency? (since Nyquist frequency is not folded in frequency 
%    like the others are)                         

%% 2. Plot Result

% create FFT spectrum x-axis
samplerate = 20e9;  % 20 Gsamples/sec 
fft_xaxis = single(0 : 1 : N/2)';    
fft_xaxis = fft_xaxis * single(samplerate/N); 

semilogx(fft_xaxis, Sf_dBm, 'b-')
xlabel('Frequency (Hz)');
ylabel('FFT Magnitude (dBm)');
title('Spectrum of Signal (Blue) vs Frequency (Hz)');
xlim([1e4 1e10]);
grid on;

Ответы [ 2 ]

5 голосов
/ 30 октября 2010

Мне не совсем ясно, что вы пытаетесь выполнить, но вот несколько советов, которые позволят вам отладить вашу собственную программу.

До fft([1 1 1 1]). Do fft([1 1 1 1 1 1 1 1]). В частности, соблюдайте выходную величину. Это то, что вы ожидаете?

Тогда сделай fft([1 -1 1 -1]). Do fft([1 -1 1 -1 1 -1 1 -1]). Повторите для различных длин и частот сигнала. Это должно позволить вам соответственно нормализовать ваши сигналы.

Также сделайте то же самое для ifft вместо fft. Это хорошие проверки работоспособности для различных реализаций БПФ, потому что, хотя большинство реализаций может поставить 1/N перед обратным преобразованием, другие могут поставить 1/sqrt(N) перед прямым и обратным преобразованиями.

0 голосов
/ 13 марта 2015

Смотрите это для ответа: БПФ нормализация

Некоторые программные пакеты и справочники неуклюже относятся к нормализации коэффициентов Фурье.

Если предположить, что реальный сигнал, то шаги нормализации:

1) Мощность в частотной области должна равняться мощности во временной области.

2) Величина коэффициентов Фурье дублируется (х2) за исключением члена постоянного тока и члена Найквиста. Термины DC и Nyquist появляются только один раз. В зависимости от того, как начинается / останавливается индексация вашего массива, вы должны быть осторожны. Просто удваивать мощность, чтобы получить односторонний спектр, неправильно.

3) Чтобы получить плотность мощности (дБм / Гц), необходимо нормализовать размер отдельного частотного элемента.

...