FFT 整个输入与 FFT 段

信息处理 fft
2022-02-18 16:59:28

假设我在 = 1024Hz 捕获了一个 4 秒的信号,它提供了 4,096 个数据数组。这两种 FFT 方法有什么不同(MATLAB 代码)fs

[1] 用 4096 点 FFT 对整个输入进行 FFT

N = length(input);
Y = fft(input)/N;

[2] 将输入分成 8 段(每段 4096/8=512 个数据点),将每段送入 512 点 FFT,然后平均输出:

N = length(input);
Y = zeros(1,512);
for i = 1:8
  segment = input(512*(i-0)+1 : 512*i);
  Y = Y + abs(fft(segment,512))/512/8;
end

问题 #1:这两种方法是否等效?

问题 #2:两种方法的频率分辨率是否等于 = 0.25Hz per bin?fsN

3个回答

问题 #1:这两种方法是否等效?

不,方法 #1 对整个序列进行 FFT,从而导致频率区间宽度为 fs/N = 1024/4096 = 0.25 Hz。方法 #2 以 1024/512 = 2.0 Hz 的频率分辨率(bin 宽度)对较短的 FFT 求和。对于#2,如果在对它们求和后除以 FFT 的数量,那么就是对它们进行平均。这通常用于减少结果的方差。

问题 #2:这两种方法的频率分辨率是否等于每个 bin 0.25Hz?

不,它们是 0.25 和 2.0 Hz。FFT 的分辨率或 bin 宽度为 fs/N。

你是绝对正确的,频率分辨率fR(或 bin 宽度)应根据 FFT 的长度计算,NFFT(IEfR=fsNFFT),而不是原始捕获信号的长度N.

我相信那里的大多数期刊/书籍只是假设(N=NFFT) 在他们的样本计算中,并使用fR=fsN在他们的书籍/论文中。但当NNFFT与方法#2一样,然后fR=fsN可能会导致新手(比如我自己)的困惑。所以更安全的方法是使用fR=fsNFFT反而。

为了证明这一点,下面是 5Hz + 30Hz 正弦曲线的输出(fs=1024Hz,持续时间=4s,4096个数据点),分别用FFT-512和FFT-4096输出。您可以看到 FFT-512 输出(第 3 个图)的频率分辨率(或 bin 宽度)比 FFT-4096(第 2 个图)宽,因为fs512>fs4096.

在此处输入图像描述

DFT 操作的频率分辨率完全取决于样本数 (Ns)只要。取大于Ns长度 DFT 隐式使用 matlab 中的零填充。这不会增加频率分辨率(尽管当您看到图表时可能会出现这种情况),而是利用在没有零填充的情况下获得的频谱内插到增加的 DFT 长度样本值。此操作有助于平滑光谱的外观并解决峰之间的潜在模糊性。

在您的情况下,您将信号分成帧,因此每帧的 DFT 将具有较低的基本分辨率(取决于您现在使用的样本数 512)。您看到了良好的分辨率(尽管第二种情况的分辨率比第一种差),因为采样频率远高于信号内容频率,因此您在两种情况下都捕获了足够数量的组成组件周期。

将信号分成帧然后对得到的频谱^2(频域中的能量)进行平均的方法用于随机(确定性(正弦波)+噪声)信号的功率谱密度计算,其中可用样本的数量总是一个限制,因此从平均 PSD 推断解释比单个 PSD 估计值更合适。