【心电信号】基于matlab GUI心电信号数字滤波处理【含Matlab源码 484期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥

博主简介:热衷于科研的Matlab仿真开发者,在专业领域不断精进中;个人主页:海神之光;赛题代码获取方式:参与赛题解法交流与学习]资源下载
⛳️座右铭:行百里者,半于九十。
更多Matlab信号处理 仿真内容点击👇
①Matlab信号处理 (进阶版)
②付费专栏Matlab信号处理(初级版)
⛳️关注海神之光,更多资源等你来!!
⛄一、心电信号数字滤波处理简介
心电信号作为一种基本生理信号表现为心脏电活动在体表的体现其强度较弱覆盖频段为0.05Hz至100Hz幅值范围从10微伏(胎儿)到5毫伏(成人)其中心电信号的信噪比较低且频率范围有限这使得其在采集放大与检测过程中容易受到各种外部干扰因素的影响常见的噪声干扰类型主要包括基线漂移肌电污染与工频污染其中基线漂移现象主要由人体呼吸与心跳活动中产生的兴奋所引起其频率低于0.5Hz属于低频干预;肌电污染则由身体肌肉的轻微颤动导致具有随机性覆盖范围宽泛在5Hz至2000Hz之间而工频污染则是由于室内照明设备与动力系统对身体分布电容的影响所致其频率稳定在50Hz这一特征因此对于不同类型的噪声干扰需要采用相应的去噪方法以确保准确识别出有用的心电信号特征只有通过有效的去噪处理才能保证后续分析工作的准确性目前采用数字滤波技术作为主要去噪手段其优势在于能够灵活调节滤波参数以适应不同情况下的信号需求
本软件旨在完成心电信号的数字滤波处理。具体而言

图1 程序设计流程图
(1) 打开并选择数据_file:建立一个打开_file_dialog窗口,并在屏幕上展示其存储_path位置信息,默认情况下数据以.txt或.dat格式储存。
'Open and select file' operation采用button(push button)完成。
当click该button后会弹出图4所示的file dialog窗口,在edit text区域预览data file的位置信息。
(2) 信号通道的选取:基于所采集的心电信号数据共有12个通道,在进行心电信号分析时,只需从这些选项中进行选择。通过下拉菜单(pop-up menu)来实现信号的选择。
确定滤波器类型:可供选择的四种不同种类包括Butterworth型、ChebyshevⅠ型、ChebyshevⅡ型以及椭圆型。这些选项可通过下拉式菜单(pop-up menu)进行设置。
滤波器功能实现:通过采用三个单选按钮(radio button)分别完成带阻、高通和低通功能,并将这三个控制组件组织在一个按钮组中。
(5) 参数输入:采样频率 (Fs) 、通带截止频率 (Fp1, Fp2) 、阻带截止频率 (Fs1, Fs2) 、通带波动 (Rp) 、阻带衰减 (Rs) 从界面上输入, 显示这些参数指标的组件为文本标签 (static text) , 显示输入参数的组件为文本框 (edit text) , 当选择带阻时能显示全部参数指标, 当选择低通、高通时, 通过设置属性“visible”, 隐藏通带截止频率 (Fp2) 、阻带截止频率 (Fs2) , 使其编辑框不可见。
(6) 滤波结果显示:滤波前后的波形在相应的坐标轴上显示, 其中第一个坐标轴显示滤波前的原始心电信号signal, 第二个坐标轴显示signal经过带阻滤波后的信号波形s1, 第三个坐标轴显示s1经高通滤波后的信号波形s2, 第四个坐标轴显示s2经过低通滤波后的波形s3, 第五个坐标轴同时显示原始信号signal和经过三次滤波后的波形s3, 以便进行对比分析, 点击每个坐标轴旁边的“Run”按钮可显示坐标轴相对应的信号波形。
采用按钮(Push Button)实现该功能,在点击"滤波器性能演示"按钮时,默认会显示所选滤波器的幅度和相位响应;而当点击"Quit"按钮时,默认会关闭当前窗口并返回到编辑界面。
⛄二、部分源代码
function varargout = ECG(varargin)
% ECG MATLAB code for ECG.fig
% ECG, by itself, creates a new ECG or raises the existing
% singleton*.
%
% H = ECG returns the handle to a new ECG or the handle to
% the existing singleton*.
%
% ECG(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in ECG.M with the given input arguments.
%
% ECG(‘Property’,‘Value’,…) creates a new ECG or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before ECG_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to ECG_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help ECG
% Last Modified by GUIDE v2.5 22-May-2020 21:35:12
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @ECG_OpeningFcn, …
‘gui_OutputFcn’, @ECG_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
当nargout存在时,
[varargout{1:nargout}]将被赋值为gui_mainfcn(gui_State,(varargin{:}))的结果;
否则,
gui_mainfcn(gui_State,(varargin{:}))将被调用。
% End initialization code - DO NOT EDIT
Immediately prior to the ECG becoming visible, this function is executed.
% Choose default command line output for ECG
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% 该方法导致ECG等待用户回应(类似于UIRESUME的作用)
% 该函数用于处理图形窗口1的状态变化;
% 该函数输出的结果返回到命令行窗口。
function varargout = ECG_OutputFcn(hObject, eventdata, handles)
% 用于返回输出参数的元胞数组(见VARARGOUT)。
% 其中 hObject 是用于处理图形窗口的句柄。
% eventdata 保留字段 - 在未来版本中将被定义。
% handles 包含与图形窗口相关联的句柄及其用户数据。
% Obtain the default terminal output from the handles structure
function edit1_CallBack_Callback(hObject, eventdata, handles)
% edit1_CallBack_Callback: 处理edit1回调事件
% hObject handle to edit1_CallBack_Callback (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,‘String’) results in contents of edit1 as text
% str2double(get(hObject,‘String’)) yields the contents of edit1 as a double value
% — 在对象生成时触发,并在设置所有属性后执行此操作。
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject —— 对应于edit1对象的句柄(参考 GCBO)。
% eventdata —— 保留字段,在未来版本中将被定义
% handles —— 当前未使用的字段名,默认情况下会在所有CreateFcns调用完成后才会被创建
% 通常情况下,Windows平台上的编辑控件呈现出白色背景。
% 参考ISPC和COMPUTER的相关信息。
if ispc && isequal(get(hObject, 'BackgroundColor'), get(0, 'defaultUicontrolBackgroundColor'))
set(hObject, 'BackgroundColor', 'white');
end
此脚本用于在按下pushbutton1时执行特定操作。
函数pushbutton1_Callback负责处理pushbutton1的回调事件。
该函数接收三个输入参数:
- hObject:对应于pushbutton的handle对象
- eventdata:未来版本中将定义的事件数据
- handles:包含handles和用户数据的结构体
使用uigetfile函数允许用户选择一个MAT文件。
[FileName PathName] = uigetfile('.mat', 'MAT-files(.mat)', '选择文件')
% uu1=get(handles.radiobutton7,‘value’);
% uu2=get(handles.radiobutton8,‘value’);
% uu3=get(handles.radiobutton8,‘value’);
% if uu11
% MAX=max(EGC);
% set(handles.edit3,‘string’,MAX);
% end
% if uu12
% MIN=min(EGC);
% set(handles.edit4,‘string’,MIN);
% end
% if uu13
% MEAN=mean(EGC);
% set(handles.edit5,‘string’,MEAN);
% end
if bb1
disp([num2str(bb)]);
t=1/50:1/50:length(ECG)/50;
MEAN=mean(xin(qq,:));MAX=max(xin(qq,:)); MIN=min(xin(qq,:));
VAR=var(xin(qq,:),0,2);STD=std(xin(qq,:),0,2);
axes(handles.axes3);
grid on;plot(t,ECG);
xlabel(‘时间(s)’);ylabel(‘幅值(V)’);
title(‘原始心电信号时域显示’);
N=512;
y=fft(ECG,N);
mag=abs(y);
f=(0:length(y)-1)_Fs/length(y);
axes(handles.axes5);
plot(f,mag)
xlim([0,100]);
title(‘原始心电信号频谱图’)
xlabel(‘频率(Hz)’);ylabel(‘幅值’);
axes(handles.axes8);
histogram(ECG);xlabel(‘信号幅值’);ylabel(‘个数’);
title(‘不同区间心电信号的分布’);
elseif bb2
disp([num2str(bb)]);
%-----------------------------心电信号高通滤波器进行基线漂移纠正--------------------------------%
%还可采用椭圆滤波器或中值法(myMedfilt)等进行基线漂移纠正。
fp=1.4;fr=0.05;rp=1;rs=30;
wp=fp/(Fs/2);wr=fr/(Fs/2);
[n,wn]=buttord(wp,wr,rp,rs);
[b,a]=butter(n,wn,‘high’);
[hw,w]=freqz(b,a);
y2=filter(b,a,ECG);
axes(handles.axes1);
grid on;
t1=0:1/50:(length(y2)-1)/50;
plot(t1,y2)
title(‘基线漂移去除时域’)
xlabel(‘时间(s)’);ylabel(‘幅值(V)’);
y2=fft(y2,N);
mfb=abs(y2);
f=(0:length(y2)-1)*Fs/length(y2);
axes(handles.axes2);
grid on;
plot(f,mfb);
xlim([0,100]);
title(‘基线纠正后信号幅频’)
xlabel(‘频率(Hz)’);ylabel(‘幅值’);
elseif bb3
disp([num2str(bb)]);
fp=60;fs=100; %通带截止频率, 阻带截止频率
rp=1.4;rs=1.6; %通带、阻带衰减
wp=2_pi fp;ws=2 pi _fs;
[n,wn]=buttord(wp,ws,rp,rs,‘s’); %’s’是确定巴特沃斯模拟滤波器阶次和3dB 截止模拟频率
[z,P,k]=buttap(n); %设计归一化巴特沃斯模拟低通滤波器,z为极点,p为零点和k为增益
[bp,ap]=zp2tf(z,P,k); %转换为Ha§,bp为分子系数,ap为分母系数
[bs,as]=lp2lp(bp,ap,wp); %Ha§转换为低通Ha(s)并去归一化,bs为分子系数,as为分母系数
[hs,ws]=freqs(bs,as); %模拟滤波器的幅频响应
[bz,az]=bilinear(bs,as,Fs); %对模拟滤波器双线性变换
[h1,w1]=freqz(bz,az); %数字滤波器的幅频响应
m=filter(bz,az,ECG);
t1=0:1/50:(length(m)-1)/50;
axes(handles.axes1);
grid on;axis tight;
plot(t1,m)
title(‘低通滤波心电信号时域图’);
xlabel(‘时间(s)’);ylabel(‘幅值(V)’);
y1=fft(m,N);
mfa=abs(y1);
f=(0:length(y1)-1)_Fs/length(y1);
axes(handles.axes2);
grid on;axis tight;
plot(f,mfa);
xlim([0,100]);
title(‘低通滤波心电信号频谱图’);
xlabel(‘频率(Hz)’);ylabel(‘幅值’);
elseif bb==4
disp([num2str(bb)]);
%50Hz陷波器:由一个低通滤波器加上一个高通滤波器组成
%而高通滤波器由一个全通滤波器减去一个低通滤波器构成
Me=100; %滤波器阶数
L=100; %窗口长度
beta=100; %衰减系数
Fs=200;
wc1=49/Fs_pi; %wc1为高通滤波器截止频率,对应51Hz
wc2=50/Fs_pi ;%wc2为低通滤波器截止频率,对应49Hz
h=ideal_lp(0.132 _pi,Me)-ideal_lp(wc1,Me)+ideal_lp(wc2,Me); %h为陷波器冲击响应
w=kaiser(L,beta);
y=h._rot90(w); %y为50Hz陷波器冲击响应序列
y3=filter(y,1,ECG);
t1=0:1/50:(length(y3)-1)/50;
axes(handles.axes1);
grid on;axis tight;
plot(t1,y3)
title(‘去除工频干扰时域时域’)
xlabel(‘时间(s)’);ylabel(‘幅值(V)’);
y3=fft(y3,N);
mfc=abs(y3);
f=(0:length(y3)-1)_Fs/length(y3);
axes(handles.axes2);
grid on;axis tight;
plot(f,mfc);
xlim([0,100]);
title(‘去除工频干扰时域频域’);
xlabel(‘频率(Hz)’);ylabel(‘幅值’);
end
%%
%心率计算
%低通滤波
fp=60;fs=100; %通带截止频率,阻带截止频率
rp=1.4;rs=1.6; %通带、阻带衰减
wp=2_pi_fp;ws=2_pi _fs;
[n,wn]=buttord(wp,ws,rp,rs,‘s’); %’s’是确定巴特沃斯模拟滤波器阶次和3dB 截止模拟频率
[z,P,k]=buttap(n); %设计归一化巴特沃斯模拟低通滤波器,z为极点,p为零点和k为增益
[bp,ap]=zp2tf(z,P,k); %转换为Ha§,bp为分子系数,ap为分母系数
[bs,as]=lp2lp(bp,ap,wp); %Ha§转换为低通Ha(s)并去归一化,bs为分子系数,as为分母系数
[hs,ws]=freqs(bs,as); %模拟滤波器的幅频响应
[bz,az]=bilinear(bs,as,Fs); %对模拟滤波器双线性变换
[h1,w1]=freqz(bz,az); %数字滤波器的幅频响应
m=filter(bz,az,ECG);
fp=1.4;fr=0.05;rp=1;rs=30;
wp=fp/(fs/2);wr=fr/(fs/2);
[n,wn]=buttord(wp,wr,rp,rs);
[b,a]=butter(n,wn,‘high’);
[hw,w]=freqz(b,a);
y2=filter(b,a,m);
%高通滤波
fp=1.4;fr=0.05;rp=1;rs=30;
wp=fp/(Fs/2);wr=fr/(Fs/2);
[n,wn]=buttord(wp,wr,rp,rs);
[b,a]=butter(n,wn,‘high’);
[hw,w]=freqz(b,a);
y2=filter(b,a,m);
%带阻滤波
Me=100; %滤波器阶数
L=100; %窗口长度
beta=100; %衰减系数
wc1=49/Fs_pi; %wc1为高通滤波器截止频率,对应51Hz
wc2=50/Fs _pi ;%wc2为低通滤波器截止频率,对应49Hz
h=ideal_lp(0.132_pi,Me)-ideal_lp(wc1,Me)+ideal_lp(wc2,Me); %h为陷波器冲击响应
w=kaiser(L,beta);
y=h.rot90(w); %y为50Hz陷波器冲击响应序列
y3=filter(y,1,y2);
%------------------------R波检测及心率计算---------------------------------
a=1;b=[-0.000563925539225382,-0.000687497480673608,-0.000400105459896818,1.40107308696153e-18,0.000167430218323421,-4.18540736387490e-19,-0.000215512204999462,-2.31378858508372e-19,0.000825087119402599,0.00173867121147225,0.00170041274003132,-2.89185229056478e-18,-0.00281247259984511,-0.00484192899664537,-0.00404159503274541,6.02125250728051e-18,0.00516947529617596,0.00792307431385663,0.00588976752279114,-7.41129393462523e-18,-0.00583817525454588,-0.00764316928687033,-0.00463943332803296,-9.61260744539564e-19,0.00196521978920439,-2.40802770032636e-18,-0.00240551785915901,4.71696771800100e-18,0.00853358817557591,0.0172851206658474,0.0162833499451329,-1.24036605494920e-17,-0.0253107164699268,-0.0426277900469897,-0.0350794664744733,1.73330580157676e-17,0.0449057473944898,0.0701489638765231,0.0540262508439817,-3.98392673063995e-17,-0.0616816640708770,-0.0915638898806427,-0.0672043113722621,-2.75356818775531e-17,0.0700978687033445,0.0996538686301192,0.0700978687033445,-2.75356818775531e-17,-0.0672043113722621,-0.0915638898806427,-0.0616816640708770,-3.98392673063995e-17,0.0540262508439817,0.0701489638765231,0.0449057473944898,1.73330580157676e-17,-0.0350794664744733,-0.0426277900469897,-0.0253107164699268,-1.24036605494920e-17,0.0162833499451329,0.0172851206658474,0.00853358817557591,4.71696771800100e-18,-0.00240551785915901,-2.40802770032636e-18,0.00196521978920439,-9.61260744539564e-19,-0.00463943332803296,-0.00764316928687033,-0.00583817525454588,-7.41129393462523e-18,0.00588976752279114,0.00792307431385663,0.00516947529617596,6.02125250728051e-18,-0.00404159503274541,-0.00484192899664537,-0.00281247259984511,-2.89185229056478e-18,0.00170041274003132,0.00173867121147225,0.000825087119402599,-2.31378858508372e-19,-0.000215512204999462,-4.18540736387490e-19,0.000167430218323421,1.40107308696153e-18,-0.000400105459896818,-0.000687497480673608,-0.000563925539225382];
d=filter(b,a,y3);
t=(0:(length(d)-1))/Fs;
d1=sort(d,‘descend’);d2=0;
for i=201 :2200
d2=d1(i)+d2;
end;
d3=d2/2000;
[R_V,R_L]=findpeaks(d(12001:24000),‘minpeakdistance’,1,‘minpeakheight’,d3);
d3=d2/2000;
[R_V,R_L]=findpeaks(d(12001:24000),‘minpeakdistance’,1,‘minpeakheight’,d3);
%根据位置和采样频率来计算采样区间内的平均心率
H_Rate = 60(length(R_L)-1)/((R_L(length(R_L))-R_L(1))/200);
RR=num2str(H_Rate,3);
%算出采样的时间区间
%R_Time = R_L(length(R_L))/200;
% — Executes on button press in radiobutton7.
function radiobutton7_Callback(hObject, eventdata, handles)
% hObject handle to radiobutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global MAX;
set(handles.edit3, 'string', MAX);
% Hint: get(hObject,‘Value’) returns toggle state of radiobutton7
% 该单选按钮8被按下时执行此操作。
function radiobutton8_Callback(hObject, eventdata, handles)
% hObject handle to radiobutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global variable MIN;
set(handles.edit4,'string',MIN);
% Hint: get(hObject,'Value') returns toggle state of radiobutton8
此处为Radiobutton 9按钮按压时执行的代码块。
当Radiobutton 9按钮被按下时调用此函数。
该对象为Radiobutton 9(参考GUI设计中的 GCBO)。
此字段将未来版本的MATLAB用于定义。
该结构包含所有对象句柄和用户数据(见GUI布局)。
全局变量MEAN被引用。
将字符串属性设置为MEAN值。
function edit3CallBack(hObject, eventdata, handles)
% hObject handle to edit3
% This field corresponds to the edit3 field
% Note that this value is not used
% The structure contains information about handles and user data
% Hints: The get function for the hObject parameter with 'String' retrieves the text content from edit3.
% str2double applied to the result of get(hObject, 'String') yields a numeric value representing the content of edit3.
此注释指示:在对象创建过程中,在设置所有属性之后执行。
以下是MATLAB脚本中的创建事件函数edit3:
以下是MATLAB脚本中的创建事件函数edit3:
%
此处变量名对应于图形界面工具箱中编辑窗口的句柄变量。
%
此注释字段保留用于未来版本中的说明。
%
此处空字段表明所有创建事件函数调用后才生成此对象。
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER for details.
if ispc && isequal(get(hObject, 'BackgroundColor'), get(0, 'defaultUicontrolBackgroundColor'))
set(hObject, 'BackgroundColor', 'white');
end
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER for details.
If the system is PC and the control's background color matches the default UIC background color,
set the background color of this control to white.
end
⛄三、运行结果

⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献 [1]董兵, 超于毅, 李振新. 采用基于MATLAB的数字信号处理技术对心电信号进行滤波处理的研究[J]. 数字技术与应用. 2012年, 第10期
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
🍅 仿真咨询
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化
2 机器学习和深度学习方面
卷积神经网络(CNN)、长短时记忆网络(LSTM)、支持向量机模型(SVM)、基于最小二乘的支持向量机模型(LSSVM)、极限学习机模型(ELM)、核化极限学习机模型(KELM)、误差反向传播神经网络模型(BPNN)、径向基函数神经网络模型(RBFNN)、宽度学习算法、深度信念网(DBN)、随机森林(RF)、XGBOOST技术、长短期记忆网络模型(DELM)、循环卷积神经网络(TCN)实现风电预测技术、光伏预测技术、电池寿命预测方法、辐射源识别技术、交通流预测方法、负荷预测技术、股价预测方法、PM2.5浓度预测方法、电池健康状态预测技术以及水体光学参数反演方法等
3 图像处理方面
4 路径规划方面
5 无人机应用方面
6 无线传感器网络的位置布置及系统布局方面的技术改进
包括:传感器布置的效率提升(即传感器部署方案的改进)、通信协议层面的技术完善(如通信链路质量控制)、路由机制的性能调优(即路径选择算法的改善)、目标点定位精度的提升(基于此类技术的方法改进)、基于Dv-Hop的具体分布式定位算法改进、“无线传感器网络(WSN)中的覆盖区域扩展策略研究、“组播数据传输效率提升策略探讨以及基于接收信号强度(RSSI)的空间位置估计技术改进
7 信号处理方面
通过多维度的感知系统实现信息采集与分析,采用先进的加密算法对敏感数据进行保护,通过智能算法实现降噪效果,结合增强技术提升信噪比,基于雷达原理完成回波数据的精确解析,设计高效的水印信息嵌入与提取算法,实时采集并分析肌电与神经电活动特征,通过时序优化技术提升系统运行效率
8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置
9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长
10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合
