基于希尔伯特变换的心音信号包络提取系统
项目简介
本项目是一个基于MATLAB开发的生物医学信号处理系统,专注于非平稳心音信号(PCG)的分析。系统的核心功能是利用希尔伯特变换(Hilbert Transform)算法构建解析信号,从而精确提取心音信号的瞬时振幅包络。
该程序能够有效地平滑高频振荡,描绘出心音能量随时间变化的轮廓,为后续的第一心音(S1)和第二心音(S2)定位、心率计算及病理性杂音识别提供了可靠的信号基础。系统内置了高保真的心音模拟生成器,无需外部数据即可直接演示完整的信号处理流程,并提供直观的可视化结果。
与代码实现一致的功能特性
本系统严格按照 main.m 中的代码逻辑实现,具备以下核心功能:
- 心音信号模拟生成:内置算法能够生成包含S1、S2成分、环境白噪声以及呼吸基线漂移的模拟心音信号,模拟采样率为2000Hz。
- 信号预处理:应用巴特沃斯(Butterworth)带通滤波器去除低频基线漂移和高频干扰,并利用零相位滤波技术防止信号时移。
- 瞬时包络提取:利用希尔伯特变换计算解析信号,通过求模值获取未经平滑的瞬时包络。
- 包络平滑处理:采用低通滤波技术对原始包络进行平滑,去除高频抖动,突出心音的主体轮廓。
- 自适应阈值展示:计算平滑包络的统计均值,并生成自适应阈值线,辅助观察心音定位。
- 多视图可视化:在一个窗口中通过三个子图分别展示预处理对比、包络提取效果及平滑后的阈值分析。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(信号处理工具箱,用于
butter, filtfilt, hilbert 等函数)
使用方法
- 确保MATLAB已安装并包含信号处理工具箱。
- 打开MATLAB环境,将工作目录切换至项目所在文件夹。
- 直接运行
main 函数。 - 程序将自动执行以下操作:
* 生成5秒长的模拟心音数据。
* 执行滤波、变换和包络提取算法。
* 在控制台输出采样率和最大包络幅值。
* 弹出包含三个子图的图形窗口,展示处理结果。
算法逻辑与代码实现细节
程序 main.m 的执行流程严格遵循以下五个步骤:
1. 数据获取与模拟
程序首先初始化参数,设置采样率(Fs)为
2000Hz,信号时长为
5秒。
代码调用内部辅助函数
generate_simulated_pcg 生成模拟数据。该部分为了模拟真实环境,叠加了且幅度为0.05的高斯白噪声以及0.25Hz的低频正弦呼吸干扰。
2. 信号预处理
为了提取有效的心音成分,代码构建了一个
4阶巴特沃斯带通滤波器。
- 通带范围:25Hz - 400Hz,覆盖了心音的主要频率成分。
- 零相位滤波:使用
filtfilt 函数替代标准的 filter 函数,确保滤波后的信号不会产生相位延迟,保证了时间轴上的精准对齐。 - 归一化:将滤波后的信号除以其绝对值的最大值,使其幅值范围归一化到 [-1, 1] 之间,便于跨样本比较。
3. 基于希尔伯特变换的包络提取
这是系统的核心算法部分。
- 构建解析信号:使用
hilbert() 函数对预处理后的实数信号 $x(t)$ 进行变换,得到复数解析信号 $z(t) = x(t) + j cdot H{x(t)}$。 - 提取模值:计算解析信号的模(绝对值),即
abs(analytic_signal)。该模值代表了信号的瞬时振幅包络,能够反映心音强度的瞬时变化。
4. 包络平滑处理
原始的希尔伯特包络通常包含大量的高频毛刺。代码通过二级滤波进行优化:
- 低通滤波:设计了一个截止频率为 15Hz 的 2阶巴特沃斯低通滤波器。
- 平滑及去噪:再次利用
filtfilt 对包络进行处理,得到了平滑且边缘清晰的心音轮廓(smoothed_envelope)。
5. 结果可视化与分析
程序生成一个图形窗口,包含三个子图:
- 子图1(预处理对比):同时绘制原始含噪信号(灰色)和带通滤波后的信号(蓝色),展示去噪效果。
- 子图2(包络提取):在滤波信号上方叠加绘制红色的希尔伯特瞬时包络线,直观展示包络对波峰的追踪能力。
- 子图3(阈值分析):展示最终的平滑包络(黑色粗线),并计算
mean(smoothed_envelope) * 1.5 作为自适应阈值,绘制出品红色的虚线。这演示了如何通过简单的阈值逻辑来定位S1和S2心音。
辅助函数说明
代码包含一个名为 generate_simulated_pcg 的内部函数,其实现逻辑如下:
- 基于70 BPM (次/分) 的心率计算心动周期。
- 使用 Gabor小波(正弦波乘以高斯窗)来模拟心音成分:
*
S1 (第一心音):设定频率50Hz,位于周期起始段。
*
S2 (第二心音):设定频率70Hz,位于周期约35%处。
- 通过循环叠加多个周期的波形,并最终加入噪声与漂移,形成完整的时域信号。