信号的FFT幅度错误 [英] Wrong Amplitude of the fft of a signal
本文介绍了信号的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')
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)总是信号幅度的一半。
我不知道为什么它能找到正确的偏移量,但找不到正确的幅度!
如果有人能帮我,我将不胜感激,
非常感谢,
弗朗西丝卡
推荐答案
这是傅里叶变换的一个性质,也出现在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
是,必须是正弦波幅度的一半。
这篇关于信号的FFT幅度错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文