1. 项目概述
在医疗信号处理领域,心电信号(ECG)的预处理一直是关键挑战。传统滤波方法在处理基线漂移和肌电干扰时往往力不从心,而形态学滤波凭借其独特的结构元素操作,能够有效保留信号特征的同时去除噪声。这次我将分享在MATLAB R2018环境下实现的完整处理流程,包含从理论到落地的所有细节。
2. 核心原理剖析
2.1 形态学滤波的数学基础
形态学滤波建立在集合论基础上,通过结构元素(structuring element)对信号进行"探测"。对于离散信号f(n)和结构元素g(m),基本运算包括:
- 膨胀(Dilation):(f⊕g)(n)=max
- 腐蚀(Erosion):(fΘg)(n)=min
实际应用中多采用开运算(先腐蚀后膨胀)和闭运算(先膨胀后腐蚀)的组合。开运算能有效消除脉冲噪声,而闭运算可以填补信号缺口。
2.2 ECG信号特性分析
典型ECG信号包含:
- P波(心房除极):0.08-0.11s
- QRS波群(心室除极):0.06-0.10s
- T波(心室复极):0.05-0.25s
噪声主要来自: - 基线漂移(<0.5Hz)
- 工频干扰(50/60Hz)
- 肌电噪声(20-1000Hz)
关键提示:结构元素宽度应大于噪声周期但小于QRS波宽度,通常取采样率的15%-25%
3. MATLAB实现详解
3.1 环境准备
matlab复制% 检查版本
ver('signal')
% 加载示例数据
load('ecg.mat');
fs = 1000; % 采样率
t = (0:length(ecg)-1)/fs;
3.2 形态学滤波核心代码
matlab复制function filtered_ecg = morph_filter(ecg, fs)
% 结构元素设计
se_length = round(0.2*fs); % 200ms窗口
se = ones(se_length,1);
% 多级滤波
ecg_open = imopen(ecg, se);
ecg_close = imclose(ecg_open, se);
