實驗訊號的表示式: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是什麼,可以用...