📌 目录

  1. scipy.signal 模块概述
  2. 卷积与相关计算
  3. 信号生成与窗口函数
  4. 滤波器设计与应用
  5. 傅里叶变换与频谱分析
  6. 峰值检测与特征提取
  7. 示例:音频信号滤波
  8. 出站链接与参考资料

1. scipy.signal 模块概述

scipy.signal 提供了各种用于一维和二维信号处理的函数,包括卷积、滤波器设计、傅里叶变换、峰值检测、系统响应分析等。广泛应用于语音识别、图像处理、生物医学信号分析等领域。


2. 卷积与相关计算

卷积(Convolution)

from scipy import signal

a = [1, 2, 3]
b = [0, 1, 0.5]

conv = signal.convolve(a, b, mode='full')
print(conv)  # 输出卷积结果

相关函数(Correlation)

corr = signal.correlate(a, b, mode='full')
print(corr)  # 输出相关结果


3. 信号生成与窗口函数

正弦波生成

import numpy as np

fs = 500  # 采样率
t = np.linspace(0, 1, fs, endpoint=False)
x = np.sin(2 * np.pi * 5 * t)  # 5Hz 正弦波

窗口函数

win = signal.windows.hann(50)
print(win)


4. 滤波器设计与应用

巴特沃斯低通滤波器(Butterworth)

from scipy.signal import butter, filtfilt

b, a = butter(N=4, Wn=0.2)  # 四阶低通滤波器,截止频率 0.2 * Nyquist
filtered = filtfilt(b, a, x)  # 零相位滤波

频率响应可视化

import matplotlib.pyplot as plt

w, h = signal.freqz(b, a)
plt.plot(w, abs(h))
plt.title("频率响应")
plt.xlabel('频率 [radians / sample]')
plt.ylabel('增益')
plt.grid()
plt.show()


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

傅里叶变换

f = np.fft.fft(x)
frequencies = np.fft.fftfreq(len(x), d=1/fs)

plt.plot(frequencies[:fs // 2], np.abs(f)[:fs // 2])
plt.title("频谱分析")
plt.xlabel("频率 (Hz)")
plt.ylabel("幅度")
plt.grid()
plt.show()


6. 峰值检测与特征提取

from scipy.signal import find_peaks

peaks, _ = find_peaks(x, height=0.9)
print("峰值索引:", peaks)

此函数在心电图(ECG)分析、音频信号特征点提取中非常常用。


7. 示例:音频信号滤波

import soundfile as sf

# 加载音频
audio, sr = sf.read("audio.wav")

# 设计滤波器(低通)
b, a = butter(6, 0.1)
filtered_audio = filtfilt(b, a, audio)

# 保存结果
sf.write("filtered_audio.wav", filtered_audio, sr)

使用此方法可以消除背景噪音或高频干扰。


🔗 出站链接与参考资料

📘 官方文档

🎓 学习资源