Python 信号的fft振幅错误

Python 信号的fft振幅错误,python,fft,Python,Fft,我正在尝试用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') p

我正在尝试用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)总是信号振幅的一半。 我不知道为什么它找到了正确的偏移量,但没有找到正确的振幅

如果有人能帮助我,我将不胜感激, 谢谢,
Francesca这是傅里叶变换的一个特性,也出现在FFT中。实际上,如果你绘制完整的数据,你会看到第二个峰值。您可能需要检查实际频率。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
并且必须是正弦波振幅的一半。

@Francesca:这是真的:看到了吗?例如,有一个S=0.7*sin(2*pi*50*t)+sin(2*pi*120*t)的
FFT
找到的振幅必须乘以2。谢谢,唯一的问题是,如果我乘以2,那么振幅是正确的,但0Hz时FFT的振幅也会加倍,因此它会变成偏移值的2倍!正确吗?@Francesca零频率很特殊,你可以在a的细节中看到。简单的答案是:乘以
2
,除了
f=0
。详细地说,您需要单面FFT。看一下,在那里的章节中,从双面功率谱转换为单面功率谱。窗函数重要吗?