FFT幅度与样本大小的关系

信息处理 matlab fft 频谱 自由度
2022-02-03 13:22:39

有谁知道 FFT 幅度与数据长度之间是否存在任何关系?


例如,在 Matlab 中,如果signal_30k有 30,000 个数据点,以 1000 Hz 采样,我会这样做:

fft_amplitudes = abs( fft( signal_30k ) );

那么主导频率的结果幅度是某个数字。

但是具有相同频率分量的相同信号 signal_500k有 500,000 个数据点,也以 1000 Hz 采样,并对其进行了相同的操作:

fft_amplitudes = abs( fft( signal_500k ) );

相同的主频率产生的幅度将是另一个数字,但要大得多。


数据点的数量与 FFT 产生的幅度之间是否存在任何关系?目标是确保无论样本数量如何,幅度都具有某种相互比较的方法。

任何帮助将不胜感激。

3个回答

如果您想获得相同的幅度,则需要将 FFT 结果按 FFT 的长度进行缩放:

Fs = 100.0
f = 5;

t1 = np.arange(0, 5, 1/Fs)
t2 = np.arange(0, 50, 1/Fs)

s1 = np.sin(2*np.pi*f*t1)
s2 = np.sin(2*np.pi*f*t2)

plt.figure(figsize=(10,10))
plt.subplot(2,2,1)
plt.plot(t1, s1)

plt.subplot(2,2,2)
plt.plot(t2, s2)

S1 = np.fft.fft(s1) / len(t1)
f1 = np.linspace(0, Fs, len(t1))
S2 = np.fft.fft(s2) / len(t2)
f2 = np.linspace(0, Fs, len(t2))


plt.subplot(2,2,3)
plt.plot(f1, abs(S1))

plt.subplot(2,2,4)
plt.plot(f2, abs(S2))

在此处输入图像描述

如果您希望时域和频域信号具有相同的功率,则需要将 FFT 输出缩放 1/sqrt(length)。

是的,有这样的关系。首先考虑一个幅度为 A 和N样品。尺寸NFFT 输出将是该正弦波频率的脉冲,其幅度等于NA/2.

如果是复杂的正弦曲线,这个数字将是NA. 有关证明,请参见 DFT 的以下定义。

X[k]=n=0N1x[n]ej2πnk/N
并考虑频率等于 0(直流分量)。那是幅度的矩形序列A和长度N. 插入 DFT 表达式并对其求和给出值NA. 使用欧拉恒等式,真实正弦曲线的结果变得清晰。由于其他正弦曲线只是频率的变化,因此类似的结果也适用于它们。

有多种 FFT 实现。不同的 FFT 实现可以有不同的默认比例因子(1/N、1/sqrt(N) 等)

一种常见的 FFT 实现是正向能量保持(Parseval 定理)。因此,由于时域中两倍长的静止正弦曲线将具有两倍多的能量(假设没有窗口伪影),因此其 FFT 结果将按比例缩放以使幅度加倍。因此,您可以将 FFT 结果幅度按 1/N 缩放,以获得长度不变的正弦幅度。