Python FFT 频域滤波

介绍

快速傅里叶变换(FFT)是一种将信号从时间域转换到频域的算法。在信号处理中,频域滤波是一种常用的技术,用于去除噪声、突出频率特征等。Python提供了强大且易于使用的FFT库,使频域滤波更加简便。

本文将介绍Python中的FFT库和频域滤波的基本原理,以及如何使用这些工具进行频域滤波。

FFT 基本原理

傅里叶变换是将一个信号从时间域转换到频域的过程。它将信号表示为不同频率的正弦和余弦波的线性组合。傅里叶变换可以分为离散傅里叶变换(DFT)和快速傅里叶变换(FFT)两种。

FFT是一种高效的DFT实现方法,利用了信号的对称性质,将计算复杂度从O(N^2)降低到O(Nlog(N))。这使得FFT成为处理大量数据的理想选择。

Python FFT 库

Python提供了多个FFT库,包括numpy.fftscipy.fftpack。这些库提供了方便且高效的FFT算法和相应的频域滤波工具。

numpy.fft

numpy.fft是Python中最常用的FFT库之一。它提供了快速的FFT算法和各种频域操作功能。以下是一个使用numpy.fft进行FFT和频域滤波的示例:

import numpy as np

# 生成信号
t = np.linspace(0, 1, 1000)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)

# 进行FFT
fft = np.fft.fft(x)

# 获取频率轴
freq = np.fft.fftfreq(len(x), t[1]-t[0])

# 频域滤波
mask = np.abs(freq) > 100
fft = fft * mask

# 反向FFT
filtered_x = np.fft.ifft(fft)

# 绘制原始信号和滤波后信号
import matplotlib.pyplot as plt

plt.plot(t, x, label='Original signal')
plt.plot(t, filtered_x, label='Filtered signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()
plt.show()

在这个示例中,我们首先生成了一个由两个正弦波叠加而成的信号。然后使用np.fft.fft函数进行FFT变换,并使用np.fft.fftfreq函数获取频率轴。接下来,我们通过创建一个布尔掩码来定义滤波器,将低频部分屏蔽掉。最后,使用np.fft.ifft函数进行反向FFT变换,恢复滤波后的信号。

scipy.fftpack

scipy.fftpack是另一个常用的FFT库,它提供了更多的FFT变换选项和频域滤波工具。以下是一个使用scipy.fftpack进行FFT和频域滤波的示例:

import numpy as np
from scipy.fftpack import fft, fftfreq, ifft

# 生成信号
t = np.linspace(0, 1, 1000)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)

# 进行FFT
fft = fft(x)

# 获取频率轴
freq = fftfreq(len(x), t[1]-t[0])

# 频域滤波
mask = np.abs(freq) > 100
fft = fft * mask

# 反向FFT
filtered_x = ifft(fft)

# 绘制原始信号和滤波后信号
import matplotlib.pyplot as plt

plt.plot(t, x, label='Original signal')
plt.plot(t, filtered_x, label='Filtered signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()
plt.show()

这个示例中的代码与numpy.fft示例非常相似,只是导入和函数调用的方式稍有不同。