获取完整数据和代码,请直接加
kang20224
不要在面包多直接拍
咱们平时测量到的信号,比如心电图(ECG)、语音或者机器振动信号,总会混进各种噪声。为了还原干净信号,就需要“去噪”。最经典的办法是用一个低通滤波器(比如 Butterworth)把高频噪声切掉,但有时候信号本身也含有高频成分,一刀切会失真。后来人们发现小波变换特别厉害:它能同时看信号的“整体轮廓”和“局部细节”,像用放大镜一样一层层剥开,把噪声和有用信号在频带上分离开。
小波去噪有两种常用变种:DWT(离散小波变换) 和 SWT(静态小波变换)。DWT 快但不随平移变化稳定,SWT 慢但能避免信号平移带来的抖动。我们这堆代码就是拿一个真实 ECG 信号,先加已知大小的白噪声,然后分别用 Butterworth 滤波、DWT 和 SWT 去噪,看谁把噪声剃得更干净、留下的信号更保真。最后还用“信噪比改善(ΔSNR)”给各个方法打分,选出一位冠军。这样就能客观地评价哪种方法在哪种参数下最好使。
算法步骤
准备干净信号:从 .wav 或 .mat 文件里读一段真实采集的 ECG 信号,记住它本来长啥样。
制造带噪信号:按照我们设定的“目标信噪比”(比如 0 dB、10 dB),给干净信号加上高斯白噪声,造出一个“脏信号”。
Butterworth 低通滤波:用一个固定截止频率的 4 阶或 6 阶 Butterworth 低通滤波器,把脏信号过一遍,得到滤波后的信号。计算它的输出信噪比,以及比输入提高了多少(ΔSNR)。
DWT 小波去噪:
对每种小波基(比如 db4、sym8、coif5)做多级小波分解。
根据第一层细节系数估计噪声标准差,用 Donoho 公式算出全局阈值(或每层独立阈值)。
对每一层的细节系数做软阈值处理,把小的系数(多半是噪声)砍掉。
用处理后的小波系数重构信号,得到去噪结果。
记录每个小波基的 ΔSNR,选最好的一个作为 DWT 的代表。
SWT 小波去噪:
跟 DWT 类似,但用“静态小波变换”,保证分解后信号长度不变。
这里要特别注意:SWT 要求信号长度能被 2^level 整除,否则会报错。所以我们先用 while 循环把分解层数往下降,直到满足整除条件。
阈值处理和重构跟 DWT 差不多,最后也选最佳小波基。
找出全场最佳:把 Butterworth 和所有 DWT、SWT 的 ΔSNR 放在一起比,谁最高谁就是“最佳方法”。同时保存它的去噪音频,供人耳验证。
画图汇报:
画出干净、带噪、Butterworth、最佳 DWT、最佳 SWT 的时域波形(叠在一起看效果)。
画一个条形图,把每种方法的 ΔSNR 全列出来,谁高谁低一目了然。
画出这些信号的频谱,看看噪声在频域里被怎么压制了。
把当前运行的所有参数(目标 SNR、滤波器参数、小波层数等)都写在图下面,方便复盘。
[开始] ↓ [加载纯净信号 s] ↓ [添加高斯白噪声,得带噪信号 x_noisy] ↓ ┌─────────────────────────────────────────────────┐ │ 并行处理三条支路 │ ├──────────────┬──────────────┬───────────────────┤ │ Butterworth │ DWT │ SWT │ │ 滤波 │ 去噪 │ 去噪 │ ├──────────────┼──────────────┼───────────────────┤ │ 输出 x_filt │ 对每个小波基 │ 对每个小波基 │ │ │ 分解、阈值 │ 调整层数整除条件 │ │ │ 重构、选最佳 │ 分解、阈值、重构 │ │ │ │ 选最佳 │ └──────────────┴──────────────┴───────────────────┘ ↓ ↓ ↓ [收集三个结果:x_filt, best_dwt, best_swt] ↓ [计算各方法的 SNR 改善 ΔSNR] ↓ [找出全局最佳方法(ΔSNR 最大)] ↓ [绘图输出:时域波形对比、ΔSNR 条形图、频谱对比] ↓ [保存去噪音频、汇总数据到 CSV/EXCEL] ↓ [结束]