numpy基础(part12)--快速傅里叶变换模块
學(xué)習(xí)筆記,這個(gè)筆記以例子為主。
開(kāi)發(fā)工具:Spyder
文章目錄
- 快速傅里葉變換模塊(fft)
- 傅里葉變換相關(guān)函數(shù)
- 案例
快速傅里葉變換模塊(fft)
傅里葉變換在處理信號(hào)時(shí)效果較好,比如音頻,心電波。
什么是傅里葉變換?
法國(guó)科學(xué)家傅里葉提出,任何一條周期曲線,無(wú)論多么跳躍或不規(guī)則,都能表示成一組光滑正弦曲線疊加之和。
傅里葉變換既是基于傅里葉定理,對(duì)一條不規(guī)則的曲線進(jìn)行拆解,從而得到一組光滑正弦曲線函數(shù)的過(guò)程。
傅里葉變換的目的是可將時(shí)域(即時(shí)間域)上的信號(hào)轉(zhuǎn)變?yōu)轭l域(即頻率域)上的信號(hào),隨著域的不同,對(duì)同一個(gè)事物的了解角度也就隨之改變,因此在時(shí)域中某些不好處理的地方,在頻域就可以較為簡(jiǎn)單的處理。這就可以大量減少處理信號(hào)存儲(chǔ)量。比如:在存儲(chǔ)數(shù)據(jù)時(shí)用頻域的思想存儲(chǔ)音頻,則會(huì)大大節(jié)省空間,因?yàn)橹恍枰鎯?chǔ)一組正弦函數(shù)的參數(shù)。
- 時(shí)域圖和頻域圖
頻域圖中能量越低,正弦函數(shù)的振幅越小;頻率越高,正弦函數(shù)的最短周期經(jīng)歷時(shí)間越短。
假如有一時(shí)間域函數(shù):y = f(x),根據(jù)傅里葉的理論它可以被分解為一系列正弦函數(shù)的疊加,這些正弦函數(shù)的振幅A,頻率ω和初項(xiàng)?各不相同,比如:
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
所以,傅里葉變換可以把一個(gè)比較復(fù)雜的函數(shù)轉(zhuǎn)換為多個(gè)簡(jiǎn)單函數(shù)的疊加,看問(wèn)題的角度也從時(shí)間域轉(zhuǎn)到了頻率域,有的問(wèn)題處理起來(lái)就會(huì)比較簡(jiǎn)單。
傅里葉變換相關(guān)函數(shù)
導(dǎo)入快速傅里葉變換所需模塊:
import numpy.fft as nf通過(guò)采樣數(shù)與采樣周期求得傅里葉變換分解所得曲線的頻率序列,得到頻率(ω):
freqs = nf.fftfreq(采樣數(shù)量, 采樣周期)采樣數(shù)量:總共這個(gè)波有多少個(gè)點(diǎn)。
采樣周期:每單位長(zhǎng)度內(nèi)采集點(diǎn)數(shù)的倒數(shù),或者說(shuō)是頻率的倒數(shù),或者說(shuō)兩個(gè)點(diǎn)之間采樣需要的長(zhǎng)度。
原函數(shù)值的序列j經(jīng)過(guò)快速傅里葉變換得到一個(gè)復(fù)數(shù)數(shù)組,每一個(gè)復(fù)數(shù)可以代表一個(gè)正弦函數(shù),復(fù)數(shù)的模代表的是振幅(A)[也代表能量],復(fù)數(shù)的輔角代表初項(xiàng)位(?)
若得到復(fù)數(shù)3 + 4i, 則有如下示意圖:
由上圖可知,點(diǎn)3 +4i到原點(diǎn)的距離為振幅(A),它與x軸的夾角為初項(xiàng)位(φ)
nf.fft(原函數(shù)值序列) -> 目標(biāo)函數(shù)值序列<復(fù)數(shù)>我們也可以通過(guò)一個(gè)復(fù)數(shù)數(shù)組,經(jīng)過(guò)逆向傅里葉變換得到合成的函數(shù)值數(shù)組:
nf.ifft(目標(biāo)函數(shù)值序列<復(fù)數(shù)>)->原函數(shù)值序列案例
針對(duì)合成波做快速傅里葉變換,得到一組復(fù)數(shù)序列;再針對(duì)該復(fù)數(shù)序列做逆向傅里葉變換得到新的合成波并繪制。
傅里葉拆分(差分成多個(gè)代表正弦函數(shù)的復(fù)數(shù)):
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)部分結(jié)果(因?yàn)椴鸱殖傻恼液瘮?shù)太多了):
[ -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()圖像:
由結(jié)果可知,原序列與傅里葉拆分并合成之后的序列一致。
由上面的代碼可知,我們的采樣數(shù)量1000, 采樣周期為1/250π,為我們?cè)倮L制頻域圖:
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]) #每個(gè)正弦波的能量 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()圖像:
由上圖可知,組成方波的正弦函數(shù)中,頻率越低能量越大,頻率越高能量越低。
總結(jié)
以上是生活随笔為你收集整理的numpy基础(part12)--快速傅里叶变换模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新鲜出炉的Go面试题(百度和米哈游)
- 下一篇: numpy基础(part13)--排序