我正在尝试使用Python计算 fft 。 我正在使用函数fft.fft,我将它应用于一个简单的正弦信号。 这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
frames=100
fps=1000
t=np.linspace(0, frames, frames)/fps
x=np.sin(2*np.pi*80*t)+1
plt.plot(t, x, 'o-')
plt.title('seno')
plt.ylabel('sin')
plt.xlabel('time $s$')
plt.grid()
plt.show()
#calculating the fft
sin_fft=np.fft.fft(x)
#calculating the absolute value
sin_fft_abs=np.ones(len(sin_fft))
for i in range(len(sin_fft)):
sin_fft_abs[i]=np.sqrt((sin_fft[i].real**2)+(sin_fft[i].imag**2))
sin_fft_final=sin_fft_abs/frames
#calculating the frequencies
inc=fps/frames
freq=np.linspace(0, fps-inc, fps/inc)
plt.plot(freq, sin_fft_final, 'o-')
plt.xlim(xmax=fps/2)
plt.title('seno fft')
plt.ylabel('sin fft')
plt.xlabel('f $Hz$')
plt.grid()
plt.show()
它可以找到正确的偏移(在这个简单的情况下为1),但是对应于正弦频率(在这种情况下为80)的峰值幅度始终是信号幅度的一半。 我不知道它为什么找到正确的偏移,但不是正确的振幅!
如果有人能帮助我,我将不胜感激, 非常感谢, 弗朗西斯
答案 0 :(得分:2)
这是傅立叶变换的一个属性,也出现在FFT中。实际上,如果您绘制完整数据,您将看到第二个峰值。您可能希望以实际的频率检查numpy.fft.fftfreq。 FFT中的频率通常为[0,df,...,fmax,-fmax,..., - df]。因此,您的第一个峰值位于omega
,第二个峰值位于-omega
。这是因为它是一个复杂的分析,意味着傅里叶核是exp( -1j * omega * t)
。如sin( omega * t) = 1 / 2j * ( exp( 1j * omega * t) - exp( -1j * omega * t))
,您将获得两个峰值。
在相反方向,峰值幅度A
,您的信号为A * exp( 1j * omega * t) + (-A * exp( 1j * (-omega) * t)
。如果你扩展它,你将获得1j * 2 * A * sin( omega * t )
。因此A
且必须正弦波振幅的一半。