簡體   English   中英

信號fft的幅度錯誤

[英]Wrong Amplitude of the fft of a signal

我試圖用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中。 實際上,如果您繪制完整數據,您將看到第二個峰值。 你可能想以實際的頻率檢查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 並且必須是正弦波振幅的一半。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM