FFT的實驗與理解

2021-07-23 16:27:23 字數 1830 閱讀 5260

實驗訊號的表示式:f = sin(2*pi*5*t)+5*sin(2*pi*10*t)+3*cos(2*pi*22*t)目的:學會使用fft函式分析訊號

設定取樣頻率、計算訊號長度設定取樣頻率為200點,取樣區間為[0,1]直接使用取樣週期作為步長分割區間,因此得到的訊號長度於取樣頻率相等為200點

由於訊號的最大週期為0.2s,[0,1]區間包含了5個週期,共採200點,即每個週期內取樣40點,頻率倍數為8倍,能滿足奈奎斯特取樣定律大於2.56倍的要求

計算幅頻圖的引數縱座標為幅值fft變換後的y陣列中的值其實就是傅利葉係數ak,因此幅值就是|ak|,ak為複數(實數是虛部為0的複數),對複數求模就是複數的實部平方+虛部平方,再開更號,實數的取絕對值運算就是其特例。因此使用abs()函式就能求得幅值~。取值在左右兩端對稱,因此只要取一半的資料繪圖即可

橫座標為頻率

頻率與採集的訊號長度有關,由於傅利葉變換在具有對稱性,因此只要取一般的訊號長度作為橫座標即可

有了橫縱座標就可以愉快的畫圖了^_^

從圖中可以得到基波sin(2*pi*5*t)與 另外兩諧波的頻率幅值,與訊號函式的組成一致

import matplotlib.pyplot as plt

import numpy as np

fs = 200.0

# sampling rate

ts = 1.0/fs # sampling interval

ff = 5

# frequency of the signal

t = np.arange(0,1,ts) # time vector

#frequency ff=5

y = np.sin(2

*np.pi*ff

*t)+5

*np.sin(2

*np.pi*2

*ff*t)+3

*np.cos(2

*np.pi*22

*t)#set frequency

n = len(y) # length of the signal

k = np.arange(n)

frq = k[range(n/2)] # one side frequency range

y = np.fft.fft(y)/(n/2.0) # fft computing and normalization

y = y[range(n/2)]

fig, ax = plt.subplots(2, 1)

ax[0].plot(t,y)

ax[0].set_xlabel('time')

ax[0].set_ylabel('amplitude')

ax[1].plot(frq,abs(y), 'r') # plotting the spectrum

ax[1].set_xlabel('freq (hz)')

ax[1].set_ylabel('|y(freq)|')

plt.show()

FFT演算法理解與實現 二

快速傅利葉變換 二 fft演算法參考本書第12章 fft演算法主要流程 1.把乙個n點的時域訊號分解成n個單點時域訊號 2.計算n個單點時域訊號的頻譜 3.將n個頻譜合成乙個n點的頻譜。參考 bit reversal sorting public struct complex public doub...

FFT原理解釋

fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換 到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如 果變換到頻域之後,就很容易看出特徵了。這就是很多訊號 分析採用fft變換的原因。另外,fft可以將乙個訊號的頻譜 提取出來,這在頻譜分析方面也是經常用的。雖然很多人都知道fft是什麼,可以用...

深入理解FFT

fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換 到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如 果變換到頻域之後,就很容易看出特徵了。這就是很多訊號 分析採用fft變換的原因。另外,fft可以將乙個訊號的頻譜 提取出來,這在頻譜分析方面也是經常用的。雖然很多人都知道fft是什麼,可以用...