gpt4 book ai didi

python - 信号 fft 的错误幅度

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:41 24 4
gpt4 key购买 nike

我正在尝试使用 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 并且必须是正弦波振幅的一半。

关于python - 信号 fft 的错误幅度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49172828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com