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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy的快速傅里叶变换

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 numpy的快速傅里叶变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

快速傅里葉變換(fft)

什么是傅里葉變換?

傅里葉定理: 任何一條周期曲線, 無論多么跳躍或不規(guī)則, 都能表示成一組光滑正弦曲線疊加之和. 傅里葉變換即是把這條周期曲線拆解成一組光滑正弦曲線的過程.

傅里葉變換的目的是將時域(時間域)上的信號轉(zhuǎn)變?yōu)轭l域(頻率域)上的信號, 隨著域的不同,對同一個事物的了解角度也隨之改變. 因此在時域中某些不好處理的地方, 放在頻域中就可以較為簡單的處理. 這樣可以大量減少處理的數(shù)據(jù)量.

傅里葉定理:
y=A1sin(ω1x+?1)+A2sin(ω2x+?2)+..+Cy = A_1sin(\omega_1x+\phi_1) + A_2sin(\omega_2x+\phi_2) + .. +C y=A1?sin(ω1?x+?1?)+A2?sin(ω2?x+?2?)+..+C
快速傅里葉變換相關(guān)API:

import numpy.fft as nf # 通過采樣數(shù)與采樣周期,得到fft分解所得曲線的頻率數(shù)組 # 采樣周期: x軸相鄰兩點的距離 freqs = nf.fftfreq(采樣數(shù)量, 采樣周期)# 通過原函數(shù)值序列, 經(jīng)過fft后, 得到復(fù)數(shù)數(shù)組 # 復(fù)數(shù)數(shù)組的長度即是拆解出正弦函數(shù)的個數(shù) # 復(fù)數(shù)數(shù)組每個元素的模,代表每個正弦曲線的振幅 # 復(fù)數(shù)數(shù)組每個元素的輔角,代表每個正弦曲線的相位角 復(fù)數(shù)序列 = nf.fft(原函數(shù)值序列)# 逆向傅里葉變換 原函數(shù)值序列 = nf.ifft(復(fù)數(shù)序列)

案例: 基于傅里葉變換, 拆解方波.

""" demo04_fft.py 傅里葉變換 """ import numpy as np import matplotlib.pyplot as mp import numpy.fft as nfx = np.linspace(-2*np.pi, 2*np.pi, 1000)# 疊加1000條曲線 y = np.zeros(x.size) for i in range(1, 1000):y += 4/(2*i-1)*np.pi * np.sin((2*i-1)*x)# 對y做傅里葉變換, 繪制頻域圖像 ffts = nf.fft(y) # 獲取傅里葉變換的頻率序列 freqs = nf.fftfreq(x.size, x[1]-x[0]) pows = np.abs(ffts)mp.figure('FFT', facecolor='lightgray') mp.subplot(121) mp.grid(linestyle=':') mp.plot(x, y,linewidth=2) mp.subplot(122) mp.grid(linestyle=':') mp.plot(freqs[freqs>0], pows[freqs>0], c='orangered') # 通過復(fù)數(shù)數(shù)組,經(jīng)過ifft操作, 得到原函數(shù) y2 = nf.ifft(ffts) mp.subplot(121) mp.plot(x, y2, linewidth=7, alpha=0.5)mp.show()

基于傅里葉變換的頻域濾波

含噪信號是高能信號與低能噪聲疊加的信號, 可以通過傅里葉變換的頻域濾波實現(xiàn)簡單降噪.

通過FFT使含噪信號轉(zhuǎn)換為含噪頻譜, 手動取出低能噪聲, 留下高能頻譜后,再通過IFFT生成高能信號.

  • 讀取音頻文件, 獲取音頻的基本信息: 采樣個數(shù)/采樣周期/每個采樣點的聲音值. 繪制音頻的時域: 時間/位移圖像.
  • sample_rate, noised_sigs = \wf.read('../da_data/noised.wav') print(noised_sigs.shape) times = np.arange(len(noised_sigs))/sample_ratemp.figure('Filter', facecolor='lightgray') mp.subplot(2,2,1) mp.title('Time Domain', fontsize=16) mp.ylabel('Signal', fontsize=12) mp.tick_params(labelsize=8) mp.grid(linestyle=':') mp.plot(times[:178], noised_sigs[:178], c='dodgerblue', label='Noised Sigs') mp.legend() mp.show()
  • 基于傅里葉變換, 獲取音頻頻域信息, 繪制頻域: 頻率/能量圖像.
  • freqs = nf.fftfreq(times.size, 1/sample_rate) noised_ffts = nf.fft(noised_sigs) noised_pows = np.abs(noised_ffts) mp.subplot(222) mp.title('Frequency Domain', fontsize=16) mp.ylabel('Power', fontsize=12) mp.tick_params(labelsize=8) mp.grid(linestyle=":") mp.semilogy(freqs[freqs>0], noised_pows[freqs>0],c='orangered', label='Noised') mp.legend()
  • 將低頻噪聲去除后繪制音頻頻域: 頻率/能量圖像.
  • noised_inds = np.where(freqs != fund_freq) filter_ffts = noised_ffts.copy() filter_ffts[noised_inds] = 0 filter_pows = np.abs(filter_ffts) mp.subplot(224) mp.title('Frequency Domain', fontsize=16) mp.ylabel('Power', fontsize=12) mp.tick_params(labelsize=8) mp.grid(linestyle=":") mp.plot(freqs[freqs>0], filter_pows[freqs>0],c='orangered', label='Filter') mp.legend()
  • 基于逆向傅里葉變換,生成時域的音頻信號, 繪制時域: 時間/位移圖像.
  • filter_sigs = nf.ifft(filter_ffts) mp.subplot(2,2,3) mp.title('Time Domain', fontsize=16) mp.ylabel('Signal', fontsize=12) mp.tick_params(labelsize=8) mp.grid(linestyle=':') mp.plot(times[:178], filter_sigs[:178], c='dodgerblue', label='Filter Sigs') mp.legend()
  • 生成音頻文件
  • wf.write('../da_data/filter.wav', sample_rate, filter_sigs.astype(np.int16))

    總結(jié)

    以上是生活随笔為你收集整理的numpy的快速傅里叶变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。