📌 目录

  1. 模块概览
  2. 卷积与相关(Convolution and Correlation)
  3. 滤波器设计(IIR 和 FIR)
  4. 频率响应分析
  5. 傅里叶变换与频谱分析
  6. 峰值检测
  7. 示例:低通滤波器滤除高频噪声
  8. 出站链接与参考资料

1. 模块概览

scipy.signal 提供了处理一维和二维信号的多种工具,包括:

  • 卷积、相关运算
  • 傅里叶变换相关工具
  • IIR 和 FIR 数字滤波器设计与应用
  • 峰值检测、脉冲分析
  • 滤波器频率响应分析、滤波器阶数估计

2. 卷积与相关

卷积:模拟系统响应

from scipy.signal import convolve
import numpy as np

x = [1, 2, 3]
h = [0, 1, 0.5]

y = convolve(x, h)
print("卷积结果:", y)

相关:信号相似性分析

from scipy.signal import correlate

corr = correlate(x, h)
print("相关结果:", corr)


3. 滤波器设计(IIR 和 FIR)

IIR 低通滤波器设计:

from scipy.signal import butter, lfilter

# 巴特沃斯低通滤波器(Butterworth)
b, a = butter(N=4, Wn=0.2)  # 4阶滤波器,截止频率为 0.2(Nyquist 频率的比例)

# 应用滤波器
filtered = lfilter(b, a, np.random.randn(100))

FIR 滤波器设计:

from scipy.signal import firwin, freqz

# 设计一个FIR低通滤波器
numtaps = 29
cutoff = 0.3
b = firwin(numtaps, cutoff)

# 查看频率响应
w, h = freqz(b)


4. 频率响应分析

用于可视化滤波器的频率特性:

import matplotlib.pyplot as plt

plt.plot(w, abs(h))
plt.title('频率响应')
plt.xlabel('频率 [rad/sample]')
plt.ylabel('增益')
plt.grid()
plt.show()


5. 傅里叶变换与频谱分析

from scipy.fft import fft, fftfreq

# 创建一个含噪信号
fs = 500  # 采样频率
t = np.arange(0, 1.0, 1/fs)
signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.random.randn(t.size)

# 傅里叶变换
yf = fft(signal)
xf = fftfreq(t.size, 1/fs)

plt.plot(xf[:len(xf)//2], np.abs(yf[:len(xf)//2]))
plt.title('频谱分析')
plt.show()


6. 峰值检测

from scipy.signal import find_peaks

data = np.sin(t * 10) + np.random.normal(0, 0.2, len(t))
peaks, _ = find_peaks(data, height=0.5)

plt.plot(t, data)
plt.plot(t[peaks], data[peaks], "x")
plt.title('峰值检测')
plt.show()


7. 示例:低通滤波器滤除高频噪声

# 原始信号(含高频噪声)
noisy = np.sin(2*np.pi*5*t) + 0.5*np.sin(2*np.pi*50*t)

# 应用低通滤波器
b, a = butter(4, 0.1)  # 截止频率为 0.1
filtered = lfilter(b, a, noisy)

plt.plot(t, noisy, label='原始信号')
plt.plot(t, filtered, label='滤波后')
plt.legend()
plt.show()


🔗 出站链接与参考资料

📘 官方文档

📚 推荐资源