当信号频率正好落在FFT单元上时,Numpy FFT会给出意外的结果
当信号的频率正好落在FFT单元上时,振幅变为0! 但是如果我把信号频率偏移一点,结果就可以了 复制代码: 这里信号的频率是30当信号频率正好落在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个箱子中会有一个巨大的尖
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
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")