我需要在频域中分析一个长度为 300000 的实值时间信号。采样频率为 100000Hz。为了增加信噪比,当你的 bin 数量太大时减少“细粒度”波动,我决定将整个信号分成较小的块,计算较小块的 FFT 并对频谱进行平均。我使用Gnu Octave来实现这个:
function A = fft_average(x, win_length, samp_freq)
%overlapping samples
step = win_length / 2;
% calculate frequency range
freq = 0:1/win_length*samp_freq:(win_length-1)/win_length*samp_freq;
%fft_win = ones(win_length,1);
%fft_win = hanning(win_length);
%fft_win = hamming(win_length);
fft_win = blackman(win_length);
y = zeros(win_length,1);
start = 1;
stop = win_length;
nsteps = 0;
while (stop <= length(x))
nsteps = nsteps + 1;
ytemp = abs(fft(x(start:stop).*fft_win));
start = start + step;
stop = stop + step;
% add (and scale)
y = y + ytemp;
end
% average
y = y./(nsteps);
%copy to result array, omit negative frequencies
A(:,1) = freq(1:win_length/2);
A(:,2) = y(1:win_length/2);
endfunction
以下是 1024、4096 和 16384 3 种不同块大小的结果。此外,我尝试了 4 种不同的窗口函数。由于缺乏声誉,我只发布了矩形和 Hann Window 的结果。
我还没有对幅度应用任何缩放。我对正确缩放的期望是不同块大小的结果的一致性。因此,没有像第二幅图像中的 Hann 窗口那样的偏移。如果我按块大小的平方根缩放幅度,汉窗 FFT 的结果匹配。但我对这种方法有 3 个问题:
- 按块大小的平方根缩放的数学基础是什么?还是因为我犯了一个明显的错误,所以是块大小的平方根?
- 如果我应用此缩放,矩形窗口的幅度不匹配。这是由频谱泄漏引起的吗?
- 我是否必须应用额外的缩放来解释窗口函数的形状,即积分保持不变?