如何在信号的FFT中获取正确的频率幅度

1 投票
1 回答
36 浏览
提问于 2025-04-14 15:29

我有一个 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的幅度。

撰写回答