当信号频率正好落在FFT单元上时,Numpy FFT会给出意外的结果

当信号频率正好落在FFT单元上时,Numpy FFT会给出意外的结果,numpy,signal-processing,fft,Numpy,Signal Processing,Fft,当信号的频率正好落在FFT单元上时,振幅变为0! 但是如果我把信号频率偏移一点,结果就可以了 复制代码: 这里信号的频率是30 import numpy as np import matplotlib.pyplot as plt N = 1024 Freq = 30 t = np.arange(N) x = np.sin(2*np.pi*Freq/N*t) f = np.fft.fft(x) plt.plot(t, x) plt.plot(t, f) 我希望输出在第30个箱子中会有一个巨大的尖

当信号的频率正好落在FFT单元上时,振幅变为0! 但是如果我把信号频率偏移一点,结果就可以了

复制代码:

这里信号的频率是30

import numpy as np
import matplotlib.pyplot as plt
N = 1024
Freq = 30
t = np.arange(N)
x = np.sin(2*np.pi*Freq/N*t)
f = np.fft.fft(x)
plt.plot(t, x)
plt.plot(t, f)
我希望输出在第30个箱子中会有一个巨大的尖峰,但它是平的,如下图所示。

但是,如果只是稍微将频率更改为30.1,以避免它落在确切的箱子上

import numpy as np
import matplotlib.pyplot as plt
N = 1024
Freq = 30.1
t = np.arange(N)
x = np.sin(2*np.pi*Freq/N*t)
f = np.fft.fft(x)
plt.plot(t, x)
plt.plot(t, f)
结果正确,如下图所示:


为什么??这是一个numpy FFT实现问题吗?或者这是标准FFT算法的局限性?

f是复数,我应该使用abs(f)进行绘图。 我忘记了:P

  • 要得到功率谱,需要取傅里叶系数的大小。绘制傅里叶系数直接丢弃虚部,而仅绘制实部
  • 从技术上讲,x和f不应该绘制在同一个x轴上,因为它们有不同的含义
  • import numpy as np
    import matplotlib.pyplot as plt
    
    T = 1 # Total signal duration (s)
    N = 1024 # samples over signal duration
    Freq = 30 # frequency: (Hz)
    t = np.arange(N)/N*T # time array
    
    df = 1.0/T # resolution of angular frequency
    f = np.arange(N)*df
    
    
    x = np.sin(2*np.pi*Freq*t)
    xhat = np.fft.fft(x) # Fourier series of x
    
    plt.plot(t, x)
    plt.xlabel("t (s)")
    plt.ylabel("x")
    plt.savefig("fig1.png")
    
    plt.cla()
    plt.plot(f, np.abs(xhat))
    plt.xlabel("f (Hz)")
    plt.ylabel("|fft(x)|")
    plt.savefig("fig2.png")