numpyfft中的意外幅度
我有一个问题,numpy fft 没有给我 fft 图中的预期幅度。这仅在某些时期作为输入发生。
我正在使用一个干净的正弦信号,周期为 25 个点,超过 240 个数据点。
np.fft.rfft 给出的峰值为 24。
我想知道什么可能导致这种情况。我认为干净的信号应该产生一个 dirac-delta 函数,比如 25 左右的结果。我在某些时期得到这种类型的结果,但不是全部。是否需要多次重复此期间才能准确指定期间?这对我来说没有意义。fft 以下列方式完成,其中 y=my sine datapoints with period 25:
fft = np.fft.rfft(y)
fft = abs(fft)
x=np.fft.rfftfreq(len(y),d=1./1)
x = 1/x # to convert from freq to periods. T = 1/f
plt.plot(x,fft)
回答
回想一下,从技术上讲,FFT 是在信号的无限周期扩展上计算的。因此,如果您的信号不包含整数个周期,则周期扩展将在周期边界处包含不连续性(同相,通常也是振幅)。这将表现为您的信号跨多个相邻频率区间的“拖尾”。此外,请注意 FFT 的各个 bin 代表特定的频率(使用 fftfreq 作为列表);任何在单个 bin 中无法表示的频率都需要从附近的 bin 重建。
您可以通过应用窗口来改善 FFT 结果,例如通过将您的信号与窗口函数(通常是汉明、汉恩或升余弦滤波器之类的东西)相乘,这将减少幅度不连续性,从而锐化您的峰值,但代价是在您的信号边缘具有一定的准确性。