南昌航空大学学士学位论文
附录
程序:
模块连接
function varargout = bishe(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @bishe_OpeningFcn, ... 'gui_OutputFcn', @bishe_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
% End initialization code - DO NOT EDIT
% --- Executes just before bishe is made visible.
function bishe_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;
% Update handles structure guidata(hObject, handles);
% UIWAIT makes bishe wait for user response (see UIRESUME) % uiwait(handles.figure1);
30
南昌航空大学学士学位论文
% --- Outputs from this function are returned to the command line. function varargout = bishe_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
读取信号
[filename,filepath]=uigetfile('C:\\Users\\Administrator\\Desktop\\ECG1.txt'); filename=[filepath,filename];
[t,b]=textread(filename,'%f%f','headerlines',2); input=b(1:1000); rate=b(100);
axes(handles.axes2); plot(b)
滤波处理
[filename,filepath]=uigetfile('C:\\Users\\Administrator\\Desktop\\ECG1.txt'); filename=[filepath,filename];
[t,b]=textread(filename,'%f%f','headerlines',2); n=3600;
m=(fft(b,n)); fs=800;%采样频率
f=fs/n*(0:n-1);%定位坐标
wp=[0.9 50]/400; %通带数字频率转换成模拟频率
ws=[0.3 100]/400; %通带截至数字频率转换成模拟频率 rp=3; %通带最大衰减 rs=10; %阻带最小衰减
[N,wc]=buttord(wp,ws,rp,rs,'s'); %确定最小阶数N和频率参数Wc [Bz,Az]=butter(N,wc);%得巴特沃斯归一化原型 [H,w]=freqz(Bz,Az); %生成频率响应参数
f1=w/pi*fs/2; %采样频率转换成模拟采样频率 y=filter(Bz,Az,b);%使用filter函数对信号进行滤波 N=50; %定义窗函数的长度 wc=0.3;
window=blackman(N);%根据N的值产生一个布拉克曼窗window
hn=fir1(N-1,wc,window);%可以指定窗函数向量 window。如果缺省 window参数,则 fir1默认为 hamming窗。
y1=filter(hn,1,y);%使用filter函数对信号进行滤波 % 滤波器滤波后图形
31
南昌航空大学学士学位论文
axes(handles.axes1); plot(t,y1); a=y1(20:500); rate=y1(100);
axes(handles.axes4); plot(a);
局部放大
[filename,filepath]=uigetfile('C:\\Users\\Administrator\\Desktop\\ECG1.txt');
filename=[filepath,filename];
[t,b]=textread(filename,'%f%f','headerlines',2);
a=b(20:500); rate=b(100);
axes(handles.axes3); plot(a);
RQS波复检及心率计算
[filename,filepath]=uigetfile('C:\\Users\\Administrator\\Desktop\\ECG1.txt');
filename=[filepath,filename];
[t,b]=textread(filename,'%f%f','headerlines',2);
input=b(1:1000); rate=b(100); sig=input;
lensig=length(sig);
wtsig1=cwt(sig,6,'mexh'); lenwtsig1=length(wtsig1); wtsig1(1:20)=0;
wtsig1(lenwtsig1-20:lenwtsig1)=0; y=wtsig1;
yabs=abs(y);
sigtemp=y;
siglen=length(y); sigmax=[];
for i=1:siglen-2
32
南昌航空大学学士学位论文
if (y(i+1)>y(i)&y(i+1)>y(i+2))
sigmax=[sigmax;abs(sigtemp(i+1)),i+1]; end; end;
%打印原信号及变换信号
%取阈值,阈值为相对幅值的差的60%
thrtemp=sort(sigmax); thrlen=length(sigmax); thr=0;
for i=(thrlen-7):thrlen thr=thr+thrtemp(i); end;
thrmax=thr/8; %最大幅度平均值,8个最大幅值点的平均值
zerotemp=sort(y); zerovalue=0; for i=1:100
zerovalue=zerovalue+zerotemp(i); end;
zerovalue=zerovalue/100; %最小幅度平均值,对消幅度,100个最小幅值点的平均值
thr=(thrmax-zerovalue)*0.3; %最大、最小幅度的差值的30%为判别R波的阈值
%定位R波 rvalue=[]; for i=1:thrlen
if sigmax(i,1)>thr
rvalue=[rvalue;sigmax(i,2)]; end; end;
rvalue_1=rvalue;
%排除误检,如果相邻两个极大值间距小于0.4,则去掉幅度较小的一个
lenvalue=length(rvalue); for k=1:lenvalue
for i=2:lenvalue;
33
南昌航空大学学士学位论文
if (rvalue(i)-rvalue(i-1))<100
if yabs(rvalue(i))>yabs(rvalue(i-1)) rvalue(i-1)=0; else
rvalue(i)=0; end; end; end;
%排除误检,如果相邻两个极大值间距大于1.2,则复检 rvalue=sort(rvalue); id = find(rvalue==0) ; rvalue(id,:)=[]; N4=length(rvalue); for j=1:20 for i=2:N4
if (rvalue(i)-rvalue(i-1)) > 300 for jj= rvalue(i-1): rvalue(i)-1 if sigmax(jj,1) > sigmax(jj+1,1) B=sigmax(jj,2); else B=sigmax(jj+1,2); end end
c1=rvalue(1:i-1);c2=rvalue(i:N3); rvalue=[c1;B;c2]; end end end
r1=find(rvalue~=0); rvalue=rvalue(r1);
lenvalue=length(rvalue); end
%打印纠正及校准前后的R波信号 axes(handles.axes2);
plot(1:lensig,wtsig1,rvalue_1,wtsig1(rvalue_1),'r.'); axes(handles.axes1);
plot(1:lensig,sig,rvalue,sig(rvalue),'r.'); lenr=length(rvalue);
v=60/4*1000*(lenr-1)/(rvalue(lenr)-rvalue(1)) m=floor(v);
set(handles.text5,'string',m);
34
相关推荐: