基于希尔伯特变换的心音信号包络提取系统
项目介绍
本项目实现了一套基于希尔伯特变换(Hilbert Transform)的心音信号(PCG)分析与包络提取流程。由于心音信号具有非平稳、瞬时性强且成分复杂的特点,传统的幅度提取方法容易受到高频噪声和基线漂移的影响。本系统通过构建解析信号的方法,能够从复杂的生理信号中准确提取出反映心脏瓣膜开闭能量变化的瞬时幅度包络,为心音分段、心率计算及病理特征识别提供高精度的基础数据。
功能特性
- 多维度信号仿真:内置心音合成模块,模拟产生具有特定周期(如75 BPM)的第一心音(S1)和第二心音(S2),并加入高斯白噪声与呼吸基线漂移成分。
- 精密预处理:采用零相移数字滤波技术,针对性消除低频环境干扰和高频电噪声。
- 解析信号转换:利用希尔伯特变换将实值心音信号扩展至复数域,获取瞬时物理量的完整描述。
- 包络优化平滑:通过二次滤波技术对原始幅值进行修剪,保留能量主干,消除微小波动纹波。
- 特征自动识别:系统具备自动寻峰功能,可定位S1与S2的峰值位置并计算统计指标。
- 全流程可视化:提供从原始信号到最终特征提取的四个关键阶段对比图表。
系统要求
- 环境软件:MATLAB R2016b 及以上版本。
- 工具箱需求:Signal Processing Toolbox(信号处理工具箱)。
实现逻辑与步骤
1. 信号仿真与建模
系统设置采样频率为2000Hz,模拟时长为4秒的心跳过程。利用衰减正弦波模型构建S1(主频50Hz)和S2(主频80Hz)。为了模拟真实的监测环境,程序在纯净信号中叠加了0.5Hz的简谐波作为呼吸干扰(基线漂移),并加入0.05倍振幅的高斯随机噪声。
2. 预处理滤波
采用4阶巴特沃斯(Butterworth)带通滤波器,截止频率设定为25Hz至400Hz。这一步骤的核心在于利用 filtfilt 函数实现双向滤波,在有效保留S1、S2主要频率成分的同时,确保信号在时域上不产生相位偏移,从而保证后续包络提取的位置准确性。
3. 希尔伯特包络计算
核心变换阶段。程序对滤波后的信号执行希尔伯特变换,构造出解析信号 $z(t) = x(t) + jhat{x}(t)$。
- 虚部提取:获取解析信号的虚部(正交分量),观察信号在复平面上的投影特征。
- 瞬时幅度获取:计算解析信号的模(Magnitude),即 $sqrt{x^2(t) + hat{x}^2(t)}$,得到初步的瞬时幅值包络。
4. 包络平滑与归一化
初步提取的包络往往包含大量反映高频信号波动的微小锯齿。系统使用一个10Hz截止频率的低通滤波器对包络进行二次平滑处,提取出纯净的能量特征曲线。随后,程序对数值进行归一化处理(0.0到1.0范围内),便于跨样本的特征比对。
5. 特征定位与统计
利用寻峰算法在优化后的包络线上搜索局部极大值。通过设置最小峰值高度阈值(0.25)和最小峰值间距(0.15秒)来排除误检。最终计算心跳次数、平均峰值等参数并输出至控制台。
关键算法分析
- filtfilt (零相移滤波):与常规滤波不同,此方法通过正反两次滤波相互抵消相位滞后,对于心音这种对时序极度敏感的信号至关重要。
- hilbert (希尔伯特变换):该算法本质上是将信号的所有频率分量移动-90度相位。在本项目中,它被用于从实值波动信号中剥离出“振幅包络”,相比于简单的取绝对值法,希尔伯特包络更加平滑且物理意义明确。
- findpeaks (峰值检测):结合了时域约束(MinPeakDistance)和空域约束(MinPeakHeight),有效区分了S1与S2信号,并能过滤心动周期内的干扰跳变。
使用方法
- 在MATLAB编辑器中打开项目主程序文件。
- 直接运行脚本,系统将自动生成模拟信号并执行处理流程。
- 查看弹出的波形图窗口:
* 第一幅图核对滤波器对基线漂移的抑制效果;
* 第二幅图展示希尔伯特变换产生的正交分量;
* 第三幅图对比平滑前后的包络质量;
* 第四幅图查看S1、S2特征点标注。
- 观察命令行窗口输出的心跳次数估计及平均幅值统计结果。