数字信号处理学习笔记(二)|快速傅里叶变换
快速傅里葉變換(FFT)
一、FFT出現(xiàn)的原因
對(duì)x(n)進(jìn)行N點(diǎn)DFT計(jì)算,一共有N2 次乘法,N2次加法
如果N=1024,則有2*1048576次計(jì)算,計(jì)算量過于龐大。
FFT的思想就是:不斷把長(zhǎng)序列的DFT分解成幾個(gè)短序列的DFT,并利用WNkn的周期性和對(duì)稱性來減少DFT的運(yùn)算次數(shù)。
二、DIT-FFT
(1)8點(diǎn)DFT一次時(shí)域抽取分解運(yùn)算
經(jīng)過一次分解后,計(jì)算1個(gè)N點(diǎn)DFT共需要計(jì)算兩個(gè)N/2點(diǎn)DFT和N/2個(gè)蝶形運(yùn)算。而計(jì)算一個(gè)N/2點(diǎn)DFT需要(N/2)2次復(fù)數(shù)乘法和N/2(N/2-1)次復(fù)數(shù)加法。僅僅經(jīng)過一次分解,就使運(yùn)算量減少近一半。
(2)8點(diǎn)DFT二次時(shí)域抽取分解運(yùn)算
經(jīng)過第二次分解,又將N/2點(diǎn)DFT分解為2個(gè)N/4點(diǎn)DFT和N/4個(gè)蝶形運(yùn)算,而1點(diǎn)DFT就是時(shí)域序列本身。
(3)DIT-FFT與DFT運(yùn)算量的比較
設(shè)N=2M ,有M級(jí)蝶形。每一級(jí)都由N/2個(gè)蝶形運(yùn)算構(gòu)成。每一級(jí)運(yùn)算都需要N/2次復(fù)數(shù)乘和N次復(fù)數(shù)加
下圖顯示了DIT-FFT與DFT運(yùn)算量的比較,可以直觀看出FFT算法的優(yōu)越性。N越大時(shí),優(yōu)越性就越明顯。
三、用Python實(shí)現(xiàn)FFT算法
import numpy as np from scipy.fftpack import fft, ifft import matplotlib.pyplot as plt from matplotlib.pylab import mplmpl.rcParams['font.sans-serif'] = ['SimHei'] # 顯示中文 mpl.rcParams['axes.unicode_minus'] = False # 顯示負(fù)號(hào)# 采樣點(diǎn)選擇1400個(gè) x = np.linspace(0, 1, 1400)# 設(shè)置需要采樣的信號(hào),頻率分量有200,400和600 y = 7 * np.sin(2 * np.pi * 200 * x) + 5 * np.sin(2 * np.pi * 400 * x) + 3 * np.sin(2 * np.pi * 600 * x)fft_y = fft(y) # 快速傅里葉變換N = 1400 x = np.arange(N) # 頻率個(gè)數(shù) half_x = x[range(int(N / 2))] # 取一半?yún)^(qū)間abs_y = np.abs(fft_y) # 取復(fù)數(shù)的絕對(duì)值,即復(fù)數(shù)的模(雙邊頻譜) angle_y = np.angle(fft_y) # 取復(fù)數(shù)的角度 normalization_y = abs_y / N # 歸一化處理(雙邊頻譜) normalization_half_y = normalization_y[range(int(N / 2))] # 由于對(duì)稱性,只取一半?yún)^(qū)間(單邊頻譜)plt.subplot(411) plt.plot(x[0:50],y[0:50]) plt.title('原始波形')plt.subplot(412) plt.plot(x, angle_y, 'violet') plt.title('雙邊相位譜', fontsize=9, color='violet')plt.subplot(413) plt.plot(x, normalization_y, 'g') plt.title('雙邊振幅譜', fontsize=9, color='green')plt.subplot(414) plt.plot(half_x, normalization_half_y, 'blue') plt.title('單邊振幅譜', fontsize=9, color='blue')plt.show()總結(jié)
以上是生活随笔為你收集整理的数字信号处理学习笔记(二)|快速傅里叶变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java –什么是瞬态字段?
- 下一篇: linux服务器安装zookeeper本