1. 算法背景与核心思想
在信号处理领域,如何从复杂信号中提取具有物理意义且稳定的特征一直是个关键挑战。传统傅里叶变换虽然能提供频域信息,但会丢失时域局部特性;而短时傅里叶变换和小波变换虽然能同时提供时频信息,但对信号平移和形变较为敏感。
散射变换(Scattering Transform)由Mallat教授团队提出,它通过级联小波变换和非线性模运算,构建了一个深度特征提取框架。这个框架具有以下独特优势:
- 平移不变性:信号在时间轴上的平移不会改变散射系数的整体分布
- 形变稳定性:信号的小幅形变只会导致散射系数的微小变化
- 信息完整性:通过多层分解保留了信号的多尺度能量分布特征
关键洞见:散射变换本质上是通过"小波变换+模运算"的迭代组合,逐步提取信号在不同尺度下的包络特征。这种结构类似于CNN中的"卷积+ReLU"组合,但具有更明确的数学解释性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现详解
2.1 信号生成与预处理
我们首先生成一个包含多个频率成分的测试信号:
python复制def generate_test_signal(duration=1.0, sr=8000):
"""
生成多频测试信号
参数:
duration: 信号时长(秒)
sr: 采样率
返回:
t: 时间序列
sig: 合成信号
"""
t = np.linspace(0, duration, int(sr*duration), endpoint=False)
# 基础频率成分
f1 = 50 # 低频成分
f2 = 250 # 中频成分
f3 = 800 # 高频成分
# 生成调幅信号
carrier = np.sin(2*np.pi*f1*t)
am_signal = (1 + 0.5*np.sin(2*np.pi*0.5*t)) * carrier
# 添加瞬态脉冲
impulse = np.zeros_like(t)
impulse[int(0.3*sr):int(0.305*sr)] = 1
# 合成最终信号
sig = am_signal + 0.3*np.sin(2*np.pi*f2*t) + 0.1*np.sin(2*np.pi*f3*t) + 0.5*impulse
# 能量归一化
sig = sig / np.max(np.abs(sig))
return t, sig
预处理阶段的关键步骤:
- 零填充(Zero-padding):将信号长度扩展到最近的2的幂次方,满足小波变换的计算要求
- 能量归一化:消除信号幅值对特征提取的影响
- 去除直流分量:确保信号均值为零,避免低频干扰
2.2 滤波器组构建
散射变换的核心是多分辨率滤波器组的设计。我们采用Morlet小波作为基础滤波器:
python复制def morlet_wavelet(fc, bw, sr, length):
"""
生成Morlet小波滤波器
参数:
fc: 中心频率
bw: 带宽系数
sr: 采样率
length: 滤波器长度
返回:
psi: 小波滤波器
"""
t = np.arange(length) - (length-1)/2
sigma =
