我正在尝试计算使用 Python 进行快速傅立叶变换。
我正在使用函数 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 https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fft.fftfreq.html#numpy.fft.fftfreq这实际上是什么频率。 FFT 中的频率通常为 [0, df,..., fmax, -fmax, ..., -df]。所以你的第一个峰值是omega
,第二个在-omega
。这是因为这是一个复杂的分析,意味着傅里叶核是exp( -1j * omega * t)
. As 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 )
. Hence A
is and must be正弦波振幅的一半。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)