📌 目录

  1. 模块简介
  2. 滤波器设计与应用
  3. 卷积与相关运算
  4. 傅里叶变换(fft
  5. 信号生成与分析
  6. 示例:滤波器设计与信号处理应用
  7. 出站链接与参考资料

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:巴特沃斯滤波器
  • cheby1cheby2:切比雪夫滤波器
  • 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()


🔗 出站链接与参考资料

📘 官方文档

📚 实用教程与资源