numpy基础(part12)--快速傅里叶变换模块
學習筆記,這個筆記以例子為主。
開發工具:Spyder
文章目錄
- 快速傅里葉變換模塊(fft)
- 傅里葉變換相關函數
- 案例
快速傅里葉變換模塊(fft)
傅里葉變換在處理信號時效果較好,比如音頻,心電波。
什么是傅里葉變換?
法國科學家傅里葉提出,任何一條周期曲線,無論多么跳躍或不規則,都能表示成一組光滑正弦曲線疊加之和。
傅里葉變換既是基于傅里葉定理,對一條不規則的曲線進行拆解,從而得到一組光滑正弦曲線函數的過程。
傅里葉變換的目的是可將時域(即時間域)上的信號轉變為頻域(即頻率域)上的信號,隨著域的不同,對同一個事物的了解角度也就隨之改變,因此在時域中某些不好處理的地方,在頻域就可以較為簡單的處理。這就可以大量減少處理信號存儲量。比如:在存儲數據時用頻域的思想存儲音頻,則會大大節省空間,因為只需要存儲一組正弦函數的參數。
- 時域圖和頻域圖
頻域圖中能量越低,正弦函數的振幅越小;頻率越高,正弦函數的最短周期經歷時間越短。
假如有一時間域函數:y = f(x),根據傅里葉的理論它可以被分解為一系列正弦函數的疊加,這些正弦函數的振幅A,頻率ω和初項?各不相同,比如:
y=A1sin(ω1x+?1)+A2sin(ω2x+?2)+A3sin(ω3x+?3)+Ry = A_1sin(\omega_1x+\phi_1) + A_2sin(\omega_2x+\phi_2) + A_3sin(\omega_3x+\phi_3) + R y=A1?sin(ω1?x+?1?)+A2?sin(ω2?x+?2?)+A3?sin(ω3?x+?3?)+R
所以,傅里葉變換可以把一個比較復雜的函數轉換為多個簡單函數的疊加,看問題的角度也從時間域轉到了頻率域,有的問題處理起來就會比較簡單。
傅里葉變換相關函數
導入快速傅里葉變換所需模塊:
import numpy.fft as nf通過采樣數與采樣周期求得傅里葉變換分解所得曲線的頻率序列,得到頻率(ω):
freqs = nf.fftfreq(采樣數量, 采樣周期)采樣數量:總共這個波有多少個點。
采樣周期:每單位長度內采集點數的倒數,或者說是頻率的倒數,或者說兩個點之間采樣需要的長度。
原函數值的序列j經過快速傅里葉變換得到一個復數數組,每一個復數可以代表一個正弦函數,復數的模代表的是振幅(A)[也代表能量],復數的輔角代表初項位(?)
若得到復數3 + 4i, 則有如下示意圖:
由上圖可知,點3 +4i到原點的距離為振幅(A),它與x軸的夾角為初項位(φ)
nf.fft(原函數值序列) -> 目標函數值序列<復數>我們也可以通過一個復數數組,經過逆向傅里葉變換得到合成的函數值數組:
nf.ifft(目標函數值序列<復數>)->原函數值序列案例
針對合成波做快速傅里葉變換,得到一組復數序列;再針對該復數序列做逆向傅里葉變換得到新的合成波并繪制。
傅里葉拆分(差分成多個代表正弦函數的復數):
import numpy as np import numpy.fft as nfx = np.linspace(-2*np.pi, 2*np.pi, 1000) y = np.zeros(1000) n = 20 for i in range(1, n):y_temp = 4 / ((2 * i - 1) * np.pi) \* np.sin((2 * i - 1) * x)y += y_temp#拆分 complex_array = nf.fft(y) print(complex_array)部分結果(因為拆分成的正弦函數太多了):
[ -6.27831120e-14 +0.00000000e+00j 3.10986537e-03 -9.89897635e-01j3.99983691e+00 -6.36585439e+02j -9.71019279e-03 +1.03025295e+00j-4.68395606e-04 +3.72717759e-02j 1.49132852e-02 -9.49331137e-01j... ...傅里葉合并:
#合并 y_merge = nf.ifft(complex_array)繪圖,觀察原序列與傅里葉拆分并合成之后的序列是否一致:
#繪圖 mp.plot(x, y, color = 'b', linestyle = '--',label = 'Original')mp.plot(x, y_merge, color = 'r', linestyle = '-.',label = 'ifft')mp.legend() mp.show()圖像:
由結果可知,原序列與傅里葉拆分并合成之后的序列一致。
由上面的代碼可知,我們的采樣數量1000, 采樣周期為1/250π,為我們再繪制頻域圖:
import numpy as np import numpy.fft as nf import matplotlib.pyplot as mpx = np.linspace(-2*np.pi, 2*np.pi, 1000) y = np.zeros(1000) n = 20 for i in range(1, n):y_temp = 4 / ((2 * i - 1) * np.pi) \* np.sin((2 * i - 1) * x)y += y_temp#拆分 complex_array = nf.fft(y) #合并 y_merge = nf.ifft(complex_array)#頻率 freqs = nf.fftfreq(y.size, x[1]-x[0]) #每個正弦波的能量 pows = np.abs(complex_array)#繪圖mp.subplot(1, 2, 1) mp.plot(x, y_merge, color = 'r', linestyle = '-.')mp.subplot(1, 2, 2) mp.plot(freqs[freqs > 0], pows[freqs > 0], color = 'b', linestyle = '--')mp.show()圖像:
由上圖可知,組成方波的正弦函數中,頻率越低能量越大,頻率越高能量越低。
總結
以上是生活随笔為你收集整理的numpy基础(part12)--快速傅里叶变换模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新鲜出炉的Go面试题(百度和米哈游)
- 下一篇: numpy基础(part13)--排序