基础FFT归一化问题

3
我正在使用Matlab对信号进行FFT,但在归一化上卡住了。具体来说,如何将频谱归一化为dBm单位。我知道0.316228是正确的归一化因子,但我的问题与如何正确归一化bins有关。
我创建了以下程序以提出我的问题。只需将其复制并粘贴到Matlab中即可运行它。内联查看问题。
特别是,我不确定如何归一化bins。例如,如果FFT具有索引1:end(其中end为偶数),当我计算FFT幅度谱时,是否应该在索引2:(end/2)处乘以(2/N)?同样,位于奈奎斯特频率(位于索引end/2+1)的bin是否被归一化为(1/N)?我知道根据一个人的兴趣有许多归一化方式。假设我使用的信号(下面的St)是从ADC捕获的电压。
非常感谢任何反馈。提前致谢!
%% 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
在将幅度转换为分贝时,请使用 log10 而不是 log - YYC
是的,这是一个很好的发现YYC,谢谢! - ggkmath
我在很多问题下都会留下这样的评论:简单的傅里叶变换并不足以进行频谱估计。在Matlab核心中有很好实现的函数可供使用,可以看一下pwelch - A. Donda
2个回答

5

我不是完全清楚你想要实现什么,但以下是一些提示,可以帮助你调试自己的程序。

执行 fft([1 1 1 1])。执行 fft([1 1 1 1 1 1 1 1])。特别是观察输出幅度。它是否符合你的预期?

然后执行 fft([1 -1 1 -1])。执行 fft([1 -1 1 -1 1 -1 1 -1])。对于不同的信号长度和频率进行重复操作。这样可以使你相应地归一化你的信号。

同样,使用 ifft 执行相同的操作而不是 fft。这些都是各种FFT实现的良好健全性检查,因为大多数实现可能会将 1/N 放在逆变换前面,而其他一些实现可能会将 1/sqrt(N) 放在正向和反向变换前面。


0

请参考以下答案: FFT归一化

有些软件包和参考资料在傅里叶系数的归一化方面可能会出现问题。

假设信号是实数,则归一化步骤如下:

1)频域中的功率必须等于时域中的功率。

2)傅里叶系数的幅度被复制(x2),除了直流项和奈奎斯特项。直流项和奈奎斯特项只出现一次。根据您的数组索引起始/停止方式,您需要小心处理。简单地将功率加倍以获得单边谱是错误的。

3)要获得功率密度(dBm / Hz),您需要将其归一化到各个频率间隔的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接