📌 目录

  1. scipy.signal 模块简介
  2. 信号处理基础
  3. 数字滤波:低通、高通、带通与带阻滤波器
  4. 卷积与相关
  5. 时域与频域分析
  6. 示例:滤波与信号分析
  7. 出站链接与参考资料

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()


🔗 出站链接与参考资料

📘 官方文档

🎓 教程与实战