不同块大小的 FFT 平均 - 如何缩放幅度

信息处理 fft 窗函数
2022-01-29 10:53:32

我需要在频域中分析一个长度为 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 个问题:

  1. 按块大小的平方根缩放的数学基础是什么?还是因为我犯了一个明显的错误,所以是块大小的平方根?
  2. 如果我应用此缩放,矩形窗口的幅度不匹配。这是由频谱泄漏引起的吗?
  3. 我是否必须应用额外的缩放来解释窗口函数的形状,即积分保持不变?
1个回答

假设您正在处理加性白噪声,我不会立即看到拆分和平均的任何 SNR 优势。我将解释为什么如果有其他可能的方法 - 但在简单地详细说明之前,加性白噪声情况下的 SNR 与频率中的 bin 宽度直接相关,而频率中的 bin 宽度与长度成反比. 对于矩形窗口,等效噪声带宽为 1 bin 宽。如果我们将 bin 数量减半,则 bin 宽度将加倍,因此噪声将加倍 (+3 dB)。如果我们平均两个 bin 的结果,噪声将相对于信号下降 1/2 (-3dB)。所以我们最终做了很多工作来回到我们开始的地方。

在进一步详细说明之前,要回答您的缩放问题,FFT 缩放幅度是序列的长度(因此的幂)。1/N

是的,您必须应用额外的缩放来考虑窗口形状。请参阅我最喜欢的一篇论文,其中详细介绍了所有常见窗口;harris 在 Windows 上,我特别提请注意每个窗口的等效噪声带宽和相干增益指标。关于相干增益,其数学基础只是窗口与矩形窗口的总和。对于 Hann,当窗口的长度接近无穷大时,这个值为 0.5,而长度为 512 的值为 0.49902,因此总体上基本上是 0.5。因此,在这种情况下,为了进行标准化,您将按 2/N 的幅度缩放,而您将按 1/N 缩放的矩形窗口。(这个窗口调整因子会随着基于重叠的重叠添加方法而变化,这在 fred 的论文中有进一步的详细说明)。

更多细节:

FFT 是一种在结果没有差异的情况下有效计算 DFT 的算法,因此查看 DFT 公式可以非常深入地了解缩放以及 SNR 效果:

X[k]=0N1x[n]ej(kωo)n

注意这里发生了什么:在做这个计算时,我们对 N 个样本求和x[n]对于每个 k 值ej(kωo)n从 0 计数到 N-1。这是 x[n] 与e+j(kωo)n,我认为是“旋转相量”(ejϕn是幅度为 1 和相位的向量ϕn, n 随时间增加)。请注意,与旋转相量相关的任何“信号”分量(意味着以相等但相反的方向旋转)的幅度将以速率 N 增长。考虑我们的“DC”bin 0,因为这是最简单的示例:如果 x[ n] 为常数 M (并且ej0=1),求和的输出将是 NM。对于 x[n] 中的任何其他频率分量,都会出现相同的结果,因为我们的自旋相量本质上是通过在求和之前沿相反方向自旋将该信号分量移动到 DC。

因此,我们看到所有相关信号的幅度(而不是功率!)以 N 速率增长;因为这是一个数量级,它们以速率增长20Log10N. 另一方面,如果样本与样本之间不相关,噪声将在功率上相加,因此噪声分量以速率增长10Log10N. 通过这种“相关性”,我们得到了净处理增益(SNR 增加)10Log10N,因为“信号”分量每 N 上升 20dB,而噪声分量每 N 上升 10dB。事实上,我们由此看出为什么“相关”在一般情况下起作用,这是乘法和累加的过程(或与傅里叶和拉普拉斯变换一样,在模拟域中相乘和积分)!通过相关,在样本间噪声不相关的范围内,我们得到一个10Log10N优势。

注意:为了显示两种不同的情况,需要完成对该响应的其他更新:直接平均复杂的 FFT 值(导致从延迟+添加扇形通过频谱)与 OP 稍后指出的平均绝对幅度他确实做到了。