FFT快速傅里葉變換的python實(shí)現(xiàn)過(guò)程解析
FFT是DFT的高效算法,能夠?qū)r(shí)域信號(hào)轉(zhuǎn)化到頻域上,下面記錄下一段用python實(shí)現(xiàn)的FFT代碼。
# encoding=utf-8 import numpy as np import pylab as pl # 導(dǎo)入和matplotlib同時(shí)安裝的作圖庫(kù)pylab sampling_rate = 8000 # 采樣頻率8000Hz fft_size = 512 # 采樣點(diǎn)512,就是說(shuō)以8000Hz的速度采512個(gè)點(diǎn),我們獲得的數(shù)據(jù)只有這512個(gè)點(diǎn)的對(duì)應(yīng)時(shí)刻和此時(shí)的信號(hào)值。 t = np.linspace(0, 1, sampling_rate) # 截取一段時(shí)間,截取是任意的,這里取了0~1秒的一段時(shí)間。 x = np.sin(2*np.pi*156.25*t) + 2*np.sin(2*np.pi*234.375*t) # 輸入信號(hào)序列,人工生成了一段信號(hào)序列,范圍在0~1秒 xs = x[:fft_size] # 由上所述,我們只采樣了512個(gè)點(diǎn),所以我們只獲得了前512個(gè)點(diǎn)的數(shù)據(jù) xf = np.fft.rfft(xs)/fft_size # 調(diào)用np.fft的函數(shù)rfft(用于實(shí)值信號(hào)fft),產(chǎn)生長(zhǎng)度為fft_size/2+1的一個(gè)復(fù)數(shù)向量,分別表示從0Hz~4000Hz的部分,這里之所以是4000Hz是因?yàn)镹yquist定理,采樣頻率8000Hz,則能恢復(fù)帶寬為4000Hz的信號(hào)。最后/fft_size是為了正確顯示波形能量 freqs = np.linspace(0, sampling_rate//2, fft_size//2 + 1) # 由上可知,我們得到了數(shù)據(jù),現(xiàn)在產(chǎn)生0~4000Hz的頻率向量,方便作圖 xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e1000)) # 防止幅值為0,先利用clip剪裁幅度,再化成分貝 pl.figure(figsize=(8, 4)) # 生成畫布 pl.subplot(211) # 生成子圖,211的意思是將畫布分成兩行一列,自己居上面。 pl.plot(t[:fft_size], xs) # 對(duì)真實(shí)波形繪圖 pl.xlabel(u"time(s)") pl.title(u"The Wave and Spectrum of 156.25Hz and 234.375Hz") pl.subplot(212) # 同理 pl.plot(freqs, xfp) # 對(duì)頻率和幅值作圖,xlabel是頻率Hz,ylabel是dB pl.xlabel(u"Hz") pl.subplots_adjust(hspace=0.4) # 調(diào)節(jié)繪圖參數(shù) pl.show()
代碼進(jìn)行了詳細(xì)標(biāo)注。有一個(gè)小細(xì)節(jié)是FFT對(duì)于取樣時(shí)間有要求。N點(diǎn)FFT進(jìn)行精確頻譜分析的要求是N個(gè)取樣點(diǎn)包含整數(shù)個(gè)取樣對(duì)象的波形。因此N點(diǎn)FFT能夠完美計(jì)算頻譜,對(duì)取樣對(duì)象的要求是n*Fs/N(n*采樣頻率/FFT長(zhǎng)度)在本例中Fs = 8000Hz,N=512 base_freq=15.625Hz 所以本例中給出了頻率為156.25Hz(n=10)和234.375Hz(n=15)做例子。
效果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用python實(shí)現(xiàn)unix2dos和dos2unix命令的例子
今天小編就為大家分享一篇使用python實(shí)現(xiàn)unix2dos和dos2unix命令的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08如何輕松實(shí)現(xiàn)Python數(shù)組降維?
歡迎來(lái)到Python數(shù)組降維實(shí)現(xiàn)方法的指南!這里,你將探索一種神秘又強(qiáng)大的編程技術(shù),想要提升你的Python編程技巧嗎?別猶豫,跟我一起深入探索吧!2024-01-01Python中參數(shù)打包和解包的實(shí)現(xiàn)
在Python中,打包和解包參數(shù)是一種操作方式,可以將多個(gè)參數(shù)打包成一個(gè)元組或字典,也可以將一個(gè)元組或字典解包成多個(gè)參數(shù),本文就來(lái)介紹一下如何使用2023-09-09簡(jiǎn)單了解python的break、continue、pass
這篇文章主要介紹了簡(jiǎn)單了解python的break、continue、pass,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07pytorch如何使用訓(xùn)練好的模型預(yù)測(cè)新數(shù)據(jù)
這篇文章主要介紹了pytorch如何使用訓(xùn)練好的模型預(yù)測(cè)新數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06python如何實(shí)現(xiàn)數(shù)據(jù)的線性擬合
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)數(shù)據(jù)的線性擬合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07