如何在信号的FFT中获取正确的频率幅度
我有一个 1Hz/10Hz
的信号
import numpy as np
total_time = 5
sampling_frequency = 200
t = np.linspace(0, total_time , total_time * sampling_frequency)
signal = np.sin(2 * np.pi * 1 * t) + 0.5 * np.sin(2 * np.pi * 10 * t)
plt.plot(t, signal)
这是我得到的离散傅里叶变换(FFT)结果
fft_spectrum = np.fft.rfft(signal)
fft_spectrum_abs = np.abs(fft_spectrum)
freq = np.fft.rfftfreq(signal.size, d=1./sampling_frequency)
plt.plot(freq, fft_spectrum_abs)
plt.xlabel("frequency, Hz")
plt.ylabel("amplitude, units")
plt.show()
我本来以为1Hz的峰值应该是1,10Hz的峰值应该是0.5,基于我最初的信号。但是,从我在图上看到的数值来看,结果却偏离了500倍。我想知道这个偏差是从哪里来的,以及我该如何找回原来的幅度?
1 个回答
2
你需要通过把输出结果除以样本的数量来进行缩放,在这个例子中就是1000。然后,因为输入是实数,而且这是单边的快速傅里叶变换(FFT),没有负频率的部分,所以你还要乘以2。这样就能得到你想要的1和0.5的幅度。