📌 目录
scipy.signal
模块简介- 滤波器设计:低通、高通、带通、带阻滤波器
- 傅里叶变换与频域分析
- 卷积与相关运算
- 滤波器应用与实际案例
- 示例:设计低通滤波器与傅里叶变换
- 出站链接与参考资料
1. scipy.signal
模块简介
scipy.signal
是 SciPy 中专门用于信号处理的模块,提供了丰富的工具用于滤波器设计、频域分析、卷积和相关运算等功能。它可以处理一维和二维信号数据,广泛应用于音频处理、通信系统、图像分析等领域。
2. 滤波器设计:低通、高通、带通、带阻滤波器
滤波器简介
滤波器是信号处理中的核心工具,用于去除或保留信号的某些频率成分。常见的滤波器类型包括低通、高通、带通和带阻滤波器。
低通滤波器
低通滤波器允许低于某个截止频率的信号通过,而滤除高于该频率的信号。
from scipy.signal import butter, filtfilt
import numpy as np
import matplotlib.pyplot as plt
# 创建一个低通滤波器
def lowpass_filter(cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# 示例数据:带噪声的信号
fs = 500.0 # 采样频率
cutoff = 50.0 # 截止频率
t = np.linspace(0, 1.0, int(fs), endpoint=False)
signal = np.sin(2 * np.pi * 7.0 * t) + 0.5 * np.random.randn(len(t)) # 信号加噪声
# 设计低通滤波器并滤波
b, a = lowpass_filter(cutoff, fs)
filtered_signal = filtfilt(b, a, signal)
# 绘制滤波前后信号
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='原始信号')
plt.plot(t, filtered_signal, label='滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('低通滤波器')
plt.show()
高通滤波器
高通滤波器允许高于某个截止频率的信号通过,滤除低频成分。
# 设计高通滤波器并滤波
def highpass_filter(cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='high', analog=False)
return b, a
# 设计并应用高通滤波器
b, a = highpass_filter(cutoff, fs)
high_pass_filtered_signal = filtfilt(b, a, signal)
# 绘制滤波前后信号
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='原始信号')
plt.plot(t, high_pass_filtered_signal, label='高通滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('高通滤波器')
plt.show()
带通与带阻滤波器
带通滤波器只允许在特定频带内的信号通过,带阻滤波器则滤除该频带的信号。
# 设计带通滤波器
def bandpass_filter(lowcut, highcut, fs, order=5):
nyquist = 0.5 * fs
low = lowcut / nyquist
high = highcut / nyquist
b, a = butter(order, [low, high], btype='band', analog=False)
return b, a
# 带通滤波器示例
lowcut = 10.0
highcut = 50.0
b, a = bandpass_filter(lowcut, highcut, fs)
band_pass_filtered_signal = filtfilt(b, a, signal)
# 绘制滤波前后信号
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='原始信号')
plt.plot(t, band_pass_filtered_signal, label='带通滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('带通滤波器')
plt.show()
3. 傅里叶变换与频域分析
傅里叶变换将信号从时域转换到频域,是信号处理中的一个重要工具。它帮助我们分析信号的频率成分。
快速傅里叶变换(FFT)
from scipy.fft import fft, fftfreq
# 计算傅里叶变换
n = len(signal)
T = 1.0 / fs
x = np.linspace(0.0, n*T, n, endpoint=False)
yf = fft(signal)
xf = fftfreq(n, T)[:n//2]
# 绘制频谱
plt.plot(xf, 2.0/n * np.abs(yf[:n//2]))
plt.grid()
plt.xlabel('频率 [Hz]')
plt.ylabel('幅度')
plt.title('信号的傅里叶变换')
plt.show()
4. 卷积与相关运算
卷积和相关运算广泛应用于图像处理、信号滤波等领域。
卷积
卷积是信号处理中的一个基本操作,它用于计算一个信号与另一个信号(如滤波器)之间的重叠程度。
from scipy.signal import convolve
# 定义卷积核(滤波器)
kernel = np.ones(5) / 5 # 平滑滤波器
# 进行卷积
convolved_signal = convolve(signal, kernel, mode='same')
# 绘制卷积结果
plt.plot(t, signal, label='原始信号')
plt.plot(t, convolved_signal, label='卷积后的信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('信号卷积')
plt.show()
5. 滤波器应用与实际案例
信号处理中的滤波器可用于噪声去除、信号恢复、数据平滑等任务。例如,音频信号中的噪声可以通过设计合适的滤波器来去除,恢复清晰的音频信号。
6. 示例:设计低通滤波器与傅里叶变换
# 创建低通滤波器并滤波
b, a = lowpass_filter(cutoff, fs)
filtered_signal_fft = filtfilt(b, a, signal)
# 绘制滤波前后频谱
yf_filtered = fft(filtered_signal_fft)
plt.plot(xf, 2.0/n * np.abs(yf_filtered[:n//2]))
plt.grid()
plt.xlabel('频率 [Hz]')
plt.ylabel('幅度')
plt.title('滤波后的傅里叶变换')
plt.show()
🔗 出站链接与参考资料
📘 官方文档
- SciPy
signal
模块:
https://docs.scipy.org/doc/scipy/reference/signal.html butter
滤波器设计:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.htmlfiltfilt
函数:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
发表回复