📌 目录
scipy.signal
模块概述- 卷积与相关计算
- 信号生成与窗口函数
- 滤波器设计与应用
- 傅里叶变换与频谱分析
- 峰值检测与特征提取
- 示例:音频信号滤波
- 出站链接与参考资料
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)
使用此方法可以消除背景噪音或高频干扰。
🔗 出站链接与参考资料
📘 官方文档
🎓 学习资源
- 滤波器设计详解(SciPy Cookbook):
https://scipy-cookbook.readthedocs.io/items/FIRFilter.html - 峰值检测教程:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html - FFT 实践教程(Python):
https://realpython.com/python-scipy-fft/
发表回复