📌 目录
- 模块简介
- 滤波器设计与应用
- 卷积与相关运算
- 傅里叶变换(
fft
) - 信号生成与分析
- 示例:滤波器设计与信号处理应用
- 出站链接与参考资料
1. 模块简介
scipy.signal
模块提供了广泛的信号处理功能,涵盖滤波器设计、傅里叶变换、卷积、相关性分析等常用操作。它广泛应用于通信、音频处理、图像处理等领域。
主要功能包括:
- 滤波器设计:设计数字滤波器,进行滤波操作
- 卷积与相关运算:信号的卷积、相关性分析
- 傅里叶变换:快速傅里叶变换(FFT)与逆傅里叶变换(IFFT)
- 信号生成与分析:生成各种类型的信号并进行频域分析
2. 滤波器设计与应用
低通滤波器设计
scipy.signal
提供了多种滤波器设计方法,如巴特沃斯(Butterworth)滤波器、切比雪夫滤波器等。
from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt
# 设计一个低通滤波器
def butter_lowpass(cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# 滤波器参数
order = 6
fs = 500.0 # 采样频率
cutoff = 100.0 # 截止频率
b, a = butter_lowpass(cutoff, fs, order)
# 信号生成
T = 0.05
t = np.arange(0, 1, T)
# 生成高频噪声信号
signal = np.sin(1.2 * np.pi * t) + 0.5 * np.sin(9 * 2 * np.pi * t)
# 应用低通滤波器
y = lfilter(b, a, signal)
# 可视化信号
plt.figure()
plt.plot(t, signal, label='原始信号')
plt.plot(t, y, label='滤波后信号')
plt.xlabel('时间 [s]')
plt.legend()
plt.title('低通滤波器应用')
plt.show()
滤波器设计方法:
butter
:巴特沃斯滤波器cheby1
、cheby2
:切比雪夫滤波器ellip
:椭圆滤波器
3. 卷积与相关运算
卷积和相关操作广泛应用于信号处理中,尤其是在滤波、特征提取和模板匹配中。
卷积操作
from scipy.signal import convolve
# 生成两个信号
x = np.array([1, 2, 3, 4, 5])
h = np.array([1, 0, -1])
# 卷积
y = convolve(x, h)
print("卷积结果:", y)
相关操作
相关性用于测量信号之间的相似度。
from scipy.signal import correlate
y_corr = correlate(x, h)
print("相关结果:", y_corr)
4. 傅里叶变换(fft
)
傅里叶变换用于将信号从时域转换到频域,广泛用于频谱分析。
from scipy.fft import fft, ifft
# 生成一个信号
N = 500
t = np.linspace(0, 1, N, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
# 计算信号的傅里叶变换
freq_signal = fft(signal)
# 计算频率轴
frequencies = np.fft.fftfreq(N, t[1] - t[0])
# 可视化频谱
plt.plot(frequencies, np.abs(freq_signal))
plt.title('频谱分析')
plt.xlabel('频率 [Hz]')
plt.ylabel('幅度')
plt.show()
fft
的结果包含复数部分,表示信号的幅度和相位。通过 np.abs
可以获取信号的频率谱。
5. 信号生成与分析
scipy.signal
提供了多种函数用于生成不同类型的信号,如正弦波、方波、脉冲信号等。
正弦波生成
from scipy.signal import chirp
# 生成线性调频信号(chirp信号)
t = np.linspace(0, 10, 1000)
signal = chirp(t, f0=100, f1=1000, t1=10, method='linear')
# 可视化生成的信号
plt.plot(t, signal)
plt.title('线性调频信号')
plt.xlabel('时间 [s]')
plt.ylabel('幅度')
plt.show()
方波与脉冲信号
from scipy.signal import square
# 生成一个方波信号
t = np.linspace(0, 10, 1000)
signal = square(2 * np.pi * 1 * t)
# 可视化
plt.plot(t, signal)
plt.title('方波信号')
plt.xlabel('时间 [s]')
plt.ylabel('幅度')
plt.show()
6. 示例:滤波器设计与信号处理应用
示例:信号去噪
from scipy.signal import butter, lfilter
# 设计低通滤波器
def butter_lowpass(cutoff, fs, order=5):
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# 生成带噪声的信号
fs = 500.0
cutoff = 100.0
order = 6
b, a = butter_lowpass(cutoff, fs, order)
t = np.arange(0, 1, 1/fs)
signal = np.sin(2*np.pi*50*t) + np.random.normal(0, 1, len(t))
# 去噪
filtered_signal = lfilter(b, a, signal)
# 可视化结果
plt.plot(t, signal, label='带噪声的信号')
plt.plot(t, filtered_signal, label='滤波后的信号', linewidth=2)
plt.xlabel('时间 [s]')
plt.legend()
plt.show()
🔗 出站链接与参考资料
📘 官方文档
scipy.signal
官方手册:
https://docs.scipy.org/doc/scipy/reference/signal.html
📚 实用教程与资源
- 数字信号处理基础:
https://realpython.com/python-signal-processing/ - SciPy 信号处理教程(全面):
https://scipy-lectures.org/advanced/scipy_signal/
发表回复