前言
今天嘗試用Python來做FFT
FFT的原理就不涉及了,主要是應用
其實Tecplot里面有Fourier Transformation的功能,但是我嫌做起來不夠優雅
做出來的圖很丑不說,無量綱起來也不明不白的
所以決定用Python試試看。
簡單的實現
其實核心功能非常之簡單,直接y=fft(y)就可以……
當然是用的現成的庫里的,一開始要import:
from scipy.fftpack import fft
也可以用numpy里的,但是用的時候語句就長一點
import numpy as np
yy=np.fft.fft(y)
所以是不是也可以這樣:
from numpy import fft.fft
yy=fft.fft(y)
噢試了一下并不行,應該語法上還有些問題
反正最后還是用scipy了。
問題的提出
這個功能實現起來非常之簡單了
只要給出一組離散點數據,然后fft一下就有頻率和振幅結果了
但是我搞不清楚的是,怎么樣的頻率和振幅是正確的?
比如我把一組80%轉速下1500步的P7結果輸出,然后放到Tecplot里面直接處理。當我輸出的數據中時域橫軸選的是時間步和真實時間時,結果分別是這樣:
Monitor_P7_L1500.png
Monitor_P7_L1500_time.png
從圖中可以看到,兩個圖線樣子是一樣的,振幅也相同,但是頻率差很大
數據為時間步的,頻率從0到1
數據為真實時間的,頻率從0到20多萬
這兒我就搞不懂了,到底頻率應該是多少啊?
處理方法
后來我找的網上的兩個例子正好對頻率有不同的處理方法,對比過之后我找到了正確的處理方法。
首先明確一點,tecplot的處理是沒有問題,而我應該用“真實時間”結果去進行FFT,那么我在程序中要怎么做到計算出正確的頻率和振幅?
- 頻率處理方法
正確做法如下:
- 提供采樣率 Fs(采樣率就是單位時間內采集的樣本數)
- 根據采樣區間Ts來算,Fs=1/Ts
- Ts在非定常計算里就是時間步,在080N計算中Ts=4.8828125e-6 s
- 因此Fs=1/Ts=204800(這就是20多萬的準確數字)
- 用采樣率算出我這段數據中一共有多少個周期 T = n/Fs
- 這個n是我給的這段數據的采樣點數,比如我的例子中n=1500
- Fs通常是個很大的數字,在我的非定常計算中T實際上是遠小于1的
- 把采樣點數的等差數列k除以周期T,就是頻率 frq = k/T
- k = np.arange(n)(就是 [0, 1, 2, ... , 1500])
- 所以這樣看來,frq = Fs * (k/n)
- 在Tecplot中這步他是處理對的
- 對于“時間步”的結果,時域橫軸是時間步,間隔都為1,即Ts=1,則Fs=1,所以frq就是一個從0到1分成n份的數列
- 對于“真實時間”的結果,時域橫軸是非定常步長,即Ts = 4.8828125e-6 s,那么Fs = 204800,所以frq是從0到204800分成n份的數列
- 幅值處理方法
以上是采樣頻率的處理,幅值也是要處理的,幅值的處理就比較簡單,除以,處理出來的結果除以采樣點數n就好了。
這是因為,采樣點數越多,振幅是成比例增大的