您的位置:

Python FFT函数介绍与应用

引言

快速傅里叶变换(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模块,我们可以方便地实现信号分析、图像处理等功能。