📌 目录
scipy.signal
模块简介- 信号处理基础
- 数字滤波:低通、高通、带通与带阻滤波器
- 卷积与相关
- 时域与频域分析
- 示例:滤波与信号分析
- 出站链接与参考资料
1. scipy.signal
模块简介
scipy.signal
模块提供了用于信号处理的函数,包括滤波器设计、卷积、傅里叶变换、信号生成等功能。信号处理在很多领域中都起着重要作用,如音频处理、图像分析、数据降噪等。
2. 信号处理基础
信号处理主要包括时域和频域两大领域。时域信号是随时间变化的信号,而频域信号则通过傅里叶变换表达信号的频率成分。scipy.signal
提供了多种工具来处理这些信号,例如滤波器设计、卷积运算、频谱分析等。
3. 数字滤波:低通、高通、带通与带阻滤波器
低通滤波器
低通滤波器允许低于某个截止频率的信号通过,而衰减高于该频率的信号。在 scipy.signal
中,butter
函数用于设计巴特沃斯低通滤波器。
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt
import numpy as np
# 生成一个信号,包含噪声
fs = 1000 # 采样频率
t = np.linspace(0, 1.0, fs)
signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.random.randn(len(t))
# 设计低通滤波器
cutoff = 100 # 截止频率
b, a = butter(4, cutoff / (0.5 * fs), btype='low')
# 应用滤波器
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.show()
高通滤波器
高通滤波器则允许高于某个截止频率的信号通过,低于该频率的信号被衰减。
# 设计高通滤波器
cutoff = 10 # 截止频率
b, a = butter(4, cutoff / (0.5 * fs), btype='high')
# 应用滤波器
high_pass_filtered_signal = filtfilt(b, a, signal)
# 绘制滤波后的高通信号
plt.figure(figsize=(10, 6))
plt.plot(t, high_pass_filtered_signal, label='高通滤波信号', linewidth=2)
plt.legend()
plt.show()
带通与带阻滤波器
带通滤波器允许在特定频率范围内的信号通过,带阻滤波器则衰减特定频率范围内的信号。
# 设计带通滤波器
low_cutoff = 30
high_cutoff = 150
b, a = butter(4, [low_cutoff / (0.5 * fs), high_cutoff / (0.5 * fs)], btype='bandpass')
# 应用滤波器
band_pass_filtered_signal = filtfilt(b, a, signal)
# 绘制带通滤波后的信号
plt.figure(figsize=(10, 6))
plt.plot(t, band_pass_filtered_signal, label='带通滤波信号', linewidth=2)
plt.legend()
plt.show()
4. 卷积与相关
卷积
卷积是信号处理中常用的运算,特别是在滤波操作中。它用于计算一个信号与另一个信号(通常是滤波器)的响应。
from scipy.signal import convolve
# 定义一个滤波器
filter_kernel = np.array([1, 2, 1])
# 对信号进行卷积
convolved_signal = convolve(signal, filter_kernel, mode='same')
# 绘制卷积结果
plt.figure(figsize=(10, 6))
plt.plot(t, convolved_signal, label='卷积结果', linewidth=2)
plt.legend()
plt.show()
相关
相关是对两个信号进行滑动计算,通常用于检测信号之间的相似性。
from scipy.signal import correlate
# 对信号进行相关计算
correlated_signal = correlate(signal, signal)
# 绘制相关结果
plt.figure(figsize=(10, 6))
plt.plot(correlated_signal, label='相关结果', linewidth=2)
plt.legend()
plt.show()
5. 时域与频域分析
时域分析
时域分析涉及信号随时间变化的行为。常见的时域分析包括绘制信号波形、信号的统计特性等。
频域分析
频域分析使用傅里叶变换将信号从时域转换为频域,便于分析信号的频率成分。scipy.signal
提供了 freqz
函数来计算滤波器的频率响应。
from scipy.signal import freqz
# 计算滤波器的频率响应
w, h = freqz(b, a, worN=8000)
# 绘制频率响应
plt.figure(figsize=(10, 6))
plt.plot(0.5 * fs * w / np.pi, np.abs(h), 'b')
plt.plot(cutoff, 0.5 * np.sqrt(2), 'ko')
plt.axvline(cutoff, color='k')
plt.xlim(0, 0.5 * fs)
plt.title("滤波器频率响应")
plt.xlabel('频率 (Hz)')
plt.ylabel('增益')
plt.grid(True)
plt.show()
6. 示例:滤波与信号分析
滤波器应用示例
以下是使用低通滤波器去除信号中的噪声的完整示例:
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt
import numpy as np
# 创建一个包含噪声的信号
fs = 1000 # 采样频率
t = np.linspace(0, 1.0, fs)
signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.random.randn(len(t))
# 设计低通滤波器
cutoff = 100 # 截止频率
b, a = butter(4, cutoff / (0.5 * fs), btype='low')
# 应用滤波器
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.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
🎓 教程与实战
- SciPy 信号处理教程:
https://scipy-lectures.org/advanced/signal/ - Python 信号处理实战:
https://realpython.com/python-scipy-signal-processing/
发表回复