二、生理信号处理 ——1.心电信号(含Matlab代码及数据)
发布时间
阅读量:
阅读量
本文介绍了如何通过预处理和滤波技术对心电信号进行处理以去除噪声干扰。主要内容包括:1) 通过陷波滤波器去除50Hz工频干扰;2) 使用带通滤波器消除基线漂移;3) 添加白噪声以模拟实际环境;4) 应用维纳滤波进一步减少噪声影响;5) 通过均方误差(MSE)评估信号质量(MSE1=0.0153、MSE2=0.0069),结果显示维纳滤波后信号更接近原始信号。实验数据来源于MIT-BIH arrhythmia数据库的心电图数据,并通过rdmat函数读取和分析。
本文适合快速了解心电信号,并能够进行数据的滤波处理。
一. 心电数据预处理(消除工频干扰、基线漂移)
- 心电数据及rdmat函数见文章底部
1. 导入心电数据
## 心电图导入及读取
clc;
[TIME,M,Fs,siginfo]=rdmat('100m');# 通过读取函数ramat对心电图进行处理
Fs=1500;# 采样频率
plot(TIME,M);

2. 选取前1000个数据点进行后续处理
ecg = M(1:1000);
TIME = TIME(1:1000);
plot(TIME,ecg)

3. 去除心电信号中的50Hz频率干扰(国内通常为50Hz)——陷波滤波器
## Butterworth 陷波滤波器-去除工频干扰
# 设计滤波器
d = designfilt('bandstopiir','FilterOrder',2, ...
'HalfPowerFrequency1',49,'HalfPowerFrequency2',51, ...
'DesignMethod','butter','SampleRate',Fs);
#应用滤波器去除50Hz干扰
ecg_50 = filtfilt(d,ecg);
4. 去除心电信号中的低频信号(5Hz以下)——消除基线漂移
##bandpass滤波器-解决基线漂移
fmaxd_1=5;# 截止频率为5Hz
fmaxn_1=fmaxd_1/(Fs/2);
[B,A]=butter(1,fmaxn_1,'low');
ecg_low=filtfilt(B,A,ecg_50);# 通过5Hz低通滤波器的信号
ecg1=ecg_50-ecg_low; # 减去5Hz低频信号
plot(TIME,ecg1)
xlabel('t(s)');
ylabel('mv');
title('期望信号');

5. 添加随机噪声
- wgn函数:随机添加白噪声
##添加随机噪声信号
Noise_White = (0.1*wgn(1,length(TIME),2))';
plot(Noise_White)
title('噪声信号');

6. 噪声干扰后信号
##噪声干扰后信号
Mix_Signal = ecg1 + Noise_White;
plot(TIME,Mix_Signal)
xlabel('t(s)');
ylabel('mv');
title('噪声干扰后信号');

二. 滤波处理(维纳滤波)
- h为维纳滤波运行后得到的数值,运行下文中维纳滤波器设计部分可得:
一、信号处理——3. 维纳滤波(含Matlab代码)_蛮有趣的_的博客-
说明
##维纳滤波
Signal_Filter = filter(h,1,Mix_Signal);# 将输入信号通过维纳滤波器
figure(1)
plot(TIME,Signal_Filter)
xlabel('t(s)');
ylabel('mv');
title('维纳滤波后信号');

三. 均方误差
- 引入噪声后信号相对原信号的统计均方误差:
mse1 = 0.0153
- 滤波后的信号相对原信号的统计均方误差:
mse2 = 0.0069
应用维纳滤波后,信号更接近于原始信号。
- 心电数据及rdmat函数
链接:<>
心电数据原始来源:MIT-BIH Arrhythmia Database(mitdb)
全部评论 (0)
还没有任何评论哟~
