日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy基础(part12)--快速傅里叶变换模块

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)--快速傅里叶变换模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。