📌 目录

  1. scipy.signal 模块简介
  2. 滤波器设计:低通、高通、带通、带阻滤波器
  3. 傅里叶变换与频域分析
  4. 卷积与相关运算
  5. 滤波器应用与实际案例
  6. 示例:设计低通滤波器与傅里叶变换
  7. 出站链接与参考资料

1. scipy.signal 模块简介

scipy.signal 是 SciPy 中专门用于信号处理的模块,提供了丰富的工具用于滤波器设计、频域分析、卷积和相关运算等功能。它可以处理一维和二维信号数据,广泛应用于音频处理、通信系统、图像分析等领域。


2. 滤波器设计:低通、高通、带通、带阻滤波器

滤波器简介

滤波器是信号处理中的核心工具,用于去除或保留信号的某些频率成分。常见的滤波器类型包括低通、高通、带通和带阻滤波器。

低通滤波器

低通滤波器允许低于某个截止频率的信号通过,而滤除高于该频率的信号。

from scipy.signal import butter, filtfilt
import numpy as np
import matplotlib.pyplot as plt

# 创建一个低通滤波器
def lowpass_filter(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 = 50.0  # 截止频率
t = np.linspace(0, 1.0, int(fs), endpoint=False)
signal = np.sin(2 * np.pi * 7.0 * t) + 0.5 * np.random.randn(len(t))  # 信号加噪声

# 设计低通滤波器并滤波
b, a = lowpass_filter(cutoff, fs)
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.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('低通滤波器')
plt.show()

高通滤波器

高通滤波器允许高于某个截止频率的信号通过,滤除低频成分。

# 设计高通滤波器并滤波
def highpass_filter(cutoff, fs, order=5):
    nyquist = 0.5 * fs
    normal_cutoff = cutoff / nyquist
    b, a = butter(order, normal_cutoff, btype='high', analog=False)
    return b, a

# 设计并应用高通滤波器
b, a = highpass_filter(cutoff, fs)
high_pass_filtered_signal = filtfilt(b, a, signal)

# 绘制滤波前后信号
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='原始信号')
plt.plot(t, high_pass_filtered_signal, label='高通滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('高通滤波器')
plt.show()

带通与带阻滤波器

带通滤波器只允许在特定频带内的信号通过,带阻滤波器则滤除该频带的信号。

# 设计带通滤波器
def bandpass_filter(lowcut, highcut, fs, order=5):
    nyquist = 0.5 * fs
    low = lowcut / nyquist
    high = highcut / nyquist
    b, a = butter(order, [low, high], btype='band', analog=False)
    return b, a

# 带通滤波器示例
lowcut = 10.0
highcut = 50.0
b, a = bandpass_filter(lowcut, highcut, fs)
band_pass_filtered_signal = filtfilt(b, a, signal)

# 绘制滤波前后信号
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='原始信号')
plt.plot(t, band_pass_filtered_signal, label='带通滤波后信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('带通滤波器')
plt.show()


3. 傅里叶变换与频域分析

傅里叶变换将信号从时域转换到频域,是信号处理中的一个重要工具。它帮助我们分析信号的频率成分。

快速傅里叶变换(FFT)

from scipy.fft import fft, fftfreq

# 计算傅里叶变换
n = len(signal)
T = 1.0 / fs
x = np.linspace(0.0, n*T, n, endpoint=False)
yf = fft(signal)
xf = fftfreq(n, T)[:n//2]

# 绘制频谱
plt.plot(xf, 2.0/n * np.abs(yf[:n//2]))
plt.grid()
plt.xlabel('频率 [Hz]')
plt.ylabel('幅度')
plt.title('信号的傅里叶变换')
plt.show()


4. 卷积与相关运算

卷积和相关运算广泛应用于图像处理、信号滤波等领域。

卷积

卷积是信号处理中的一个基本操作,它用于计算一个信号与另一个信号(如滤波器)之间的重叠程度。

from scipy.signal import convolve

# 定义卷积核(滤波器)
kernel = np.ones(5) / 5  # 平滑滤波器

# 进行卷积
convolved_signal = convolve(signal, kernel, mode='same')

# 绘制卷积结果
plt.plot(t, signal, label='原始信号')
plt.plot(t, convolved_signal, label='卷积后的信号', linewidth=2)
plt.legend()
plt.xlabel('时间 [秒]')
plt.ylabel('幅度')
plt.title('信号卷积')
plt.show()


5. 滤波器应用与实际案例

信号处理中的滤波器可用于噪声去除、信号恢复、数据平滑等任务。例如,音频信号中的噪声可以通过设计合适的滤波器来去除,恢复清晰的音频信号。


6. 示例:设计低通滤波器与傅里叶变换

# 创建低通滤波器并滤波
b, a = lowpass_filter(cutoff, fs)
filtered_signal_fft = filtfilt(b, a, signal)

# 绘制滤波前后频谱
yf_filtered = fft(filtered_signal_fft)
plt.plot(xf, 2.0/n * np.abs(yf_filtered[:n//2]))
plt.grid()
plt.xlabel('频率 [Hz]')
plt.ylabel('幅度')
plt.title('滤波后的傅里叶变换')
plt.show()


🔗 出站链接与参考资料

📘 官方文档

🎓 教程与实战