基于香农能量算法的心音信号包络提取 (Shannon Energy Envelope Extraction)
项目介绍
本项目实现了一套基于香农(Shannon)能量算法的心音信号(PCG)包络提取系统。作为心音分析与自动诊断的前端预处理环节,该算法能够有效抑制背景噪声,放大心音信号中的关键成分(如第一心音S1和第二心音S2),并提取出光滑的包络曲线。这一处理过程对于后续的心音切分、特征提取以及病理性杂音识别具有重要的意义。
本项目完全基于MATLAB编写,包含了从信号模拟生成、预处理、核心特征计算到最终包络平滑的全流程实现。
功能特性
- 高保真信号模拟:内置心音生成算法,能够模拟包含S1、S2成分的心音信号,并叠加高斯白噪声、50Hz工频干扰以及低频基线漂移,以此模拟真实的采集环境。
- 信号预处理:集成归一化处理与高阶巴特沃斯带通滤波器,有效滤除呼吸音(极低频)和环境高频噪声。
- 香农能量计算:利用香农能量算法的非线性特性,增强信号中的有效成分,显著抑制低幅度的随机噪声。
- 包络平滑提取:采用零相位滑动平均滤波技术,从能量序列中提取出平滑且无相位延迟的心音包络。
- 全流程可视化:提供四个维度的波形对比显示,直观展示从原始含噪信号到最终包络的处理效果。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(信号处理工具箱)
使用方法
直接运行主脚本即可启动程序。程序将自动执行以下步骤:
- 生成一段时长为5秒、采样率为2000Hz的模拟心音信号。
- 依次执行归一化、带通滤波、香农能量计算和平滑处理。
- 弹出一个包含四个子图的图形窗口,展示处理过程中的各阶段波形。
算法实现细节与逻辑分析
本项目主要包含以下核心处理模块,其逻辑严格对应代码实现:
1. 信号获取与生成
程序并没有加载外部音频文件,而是通过内置算法生成模拟数据:
- 设定采样率为2000Hz,时长5秒。
- 模拟60 BPM的心率(周期1秒),在特定时间点生成由阻尼正弦波构成的S1(50Hz)和S2(70Hz)。
- 在纯净信号上叠加了三种干扰:0.05强度的随机高斯白噪声、0.02强度的50Hz工频干扰以及0.1强度的0.2Hz低频基线漂移(模拟呼吸波)。
2. 预处理阶段
为了提高后续算法的稳定性,首先对原始信号进行处理:
- 幅度归一化:将原始信号幅度线性缩放到 [-1, 1] 区间,消除不同信号源的量级差异。
- 带通滤波:设计了一个4阶巴特沃斯(Butterworth)带通滤波器。
*
通带范围:20Hz - 400Hz。这一范围涵盖了心音的主要频率成分,能够有效去除低频基线漂移(呼吸影响)和高频电子噪声。
*
零相位滤波:使用
filtfilt 函数进行滤波,确保输出信号相对于输入信号没有相位延迟,保证了心音发生时刻的准确性。
- 二次归一化:滤波后的信号再次被归一化,为香农能量计算做准备。
3. 香农(Shannon)能量提取(核心算法)
这是本项目的核心部分,旨在将时域信号转换为能量序列,突出高能量的心音成分。
- 算法公式:利用公式 E = -x^2 * log(x^2) 进行计算。
- 实现逻辑:
1. 计算归一化信号的平方(x^2)。
2. 为了防止对0取对数导致计算错误,在平方值上添加了一个极小值(epsilon = 1e-10)。
3. 计算对数值并乘以平方值,最后乘以-1将原本为负的结果转换为正能量值。
4. 对可能因浮点误差产生的微小负值进行截断处理(置零)。
- 原理:该非线性变换能够对中高强度的信号(S1, S2)进行放大,同时极大地衰减低幅度的背景噪声。
4. 包络平滑与提取
香农能量序列通常包含较多毛刺,需要平滑处理以获得清晰的包络。
- 滑动窗口:设定时间窗口为0.05秒(50ms),对应2000Hz采样率下的约100个采样点。
- 移动平均滤波:构建均值滤波器,再次利用
filtfilt 对能量序列进行零相位滤波。这相当于在时域上进行平滑卷积,填补了能量波峰间的缝隙。 - 最终归一化:将提取出的包络线归一化到 [0, 1] 区间,便于在绘图中与原始波形进行幅值对比。
5. 结果可视化
程序最后绘制了一个名为“基于香农能量的心音包络提取”的图表,包含四个子图:
- 原始心音信号:展示包含各类噪声和漂移的初始波形。
- 带通滤波信号:展示去除基线漂移和高频噪声后的干净波形。
- 香农能量序列:展示经非线性变换后的能量脉冲序列。
- 最终心音包络:将红色的平滑包络曲线叠加在灰色的滤波波形上,清晰展示了算法对S1和S2轮廓的提取能力。