信号的FFT幅度错误 [英] Wrong Amplitude of the fft of a signal

查看:0
本文介绍了信号的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆