引言
快速傅里葉變換(Fast Fourier Transform,FFT)是一種高效的傅里葉變換算法,廣泛應用於信號處理、圖像處理以及數字信號處理等領域。Python中提供了numpy.fft模塊用於計算快速傅里葉變換。
正文
一、FFT函數介紹
FFT函數是numpy.fft模塊中最主要的函數之一。它的基本用法如下:
import numpy as np # 定義一個n個採樣點的信號,採樣周期為T T = 1/800.0 n = 800 t = np.linspace(0, n*T, n) x = np.sin(50.0 * 2.0*np.pi*t) # 計算信號的快速傅里葉變換 y = np.fft.fft(x)
在上面的例子中,我們定義了一個採樣周期為T,採樣點數為n的信號x,並計算了其快速傅里葉變換y。在實際應用中,我們可以通過FFT函數計算信號的頻譜密度、功率譜等特徵。
二、FFT函數的參數說明
FFT函數的完整參數列表如下:
numpy.fft.fft(x, n=None, axis=-1, norm=None)
其中,x是要進行FFT變換的一維或多維數組;n是FFT變換的長度,如果不指定默認為x的長度;axis指定進行FFT變換的軸,默認為最後一個軸;norm指定歸一化方式,默認不進行歸一化。
三、FFT函數的應用
1. 信號濾波
在信號處理中,濾波是一種常用的技術,可以通過濾波消除信號中的噪聲、干擾等。在FFT中,我們可以通過將信號進行傅里葉變換後,濾掉不需要的頻率成分,再將變換之後的信號進行反變換,得到濾波之後的信號。
import numpy as np import matplotlib.pyplot as plt # 生成帶噪聲的信號 t = np.linspace(0, 1, 1000) x = np.sin(2*np.pi*15*t) + 0.5*np.sin(2*np.pi*40*t) xn = x + np.random.randn(len(x))*0.08 # 計算信號的快速傅里葉變換 y = np.fft.fft(xn) # 已知需要濾除的頻率為40Hz,使用布特沃斯濾波器濾除其它頻率成分 from scipy.signal import butter, lfilter b, a = butter(4, 2*30/1000.0, 'lowpass') yf = lfilter(b, a, y) # 計算濾波之後的信號,並進行繪圖 xf = np.fft.ifft(yf) plt.plot(t, xn, 'b', label='With Noise') # 帶噪聲的信號 plt.plot(t, xf, 'r', label='Filtered') # 濾波之後的信號 plt.legend() plt.grid() plt.show()
2. 信號分析
在信號處理中,我們常常需要對信號進行頻域分析,以便更好地理解信號的特徵,提取有效信息。FFT提供了一種有效的手段,可以計算信號的頻譜密度、功率譜等特徵。
import numpy as np import matplotlib.pyplot as plt # 生成一段信號 T = 1/2000.0 n = 2000 t = np.linspace(0, n*T, n) x = np.sin(50.0 * 2.0*np.pi*t) y = np.sin(80.0 * 2.0*np.pi*t) z = x + y # 計算信號的快速傅里葉變換 freqs = np.fft.fftfreq(len(z), T) y = np.fft.fft(z) # 計算信號的功率譜,並進行繪圖 ps = np.abs(y)**2 idx = np.argsort(freqs) plt.plot(freqs[idx], ps[idx]) plt.xlabel('Frequency') plt.ylabel('Power Spectrum') plt.show()
3. 圖像處理
FFT可以應用於圖像處理領域,例如圖像去噪、圖像增強、圖像匹配等。對於二維圖像,我們可以通過對每一行和每一列進行一次一維FFT變換,實現對圖像進行二維FFT變換。
import numpy as np import cv2 import matplotlib.pyplot as plt # 讀取一張圖像 img = cv2.imread("lena.png", 0) # 對圖像進行二維FFT變換 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) magnitude_spectrum = 20*np.log(np.abs(fshift)) # 將中心點移動到圖像中心 rows, cols = img.shape crow, ccol = rows/2, cols/2 fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 f_ishift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f_ishift) img_back = np.real(img_back) # 進行繪圖 plt.subplot(131),plt.imshow(img, cmap = 'gray') plt.title('Input Image'), plt.xticks([]), plt.yticks([]) plt.subplot(132),plt.imshow(magnitude_spectrum, cmap = 'gray') plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) plt.subplot(133),plt.imshow(img_back, cmap = 'gray') plt.title('Image after HPF'), plt.xticks([]), plt.yticks([]) plt.show()
結論
FFT是一種重要的信號處理技術,廣泛應用於多個領域。通過numpy.fft模塊,我們可以方便地實現信號分析、圖像處理等功能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/310105.html