МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
отчет
по лабораторной работе №8
по дисциплине «ПСОБМД»
Тема: Классификация ЭКГ с помощью ВКФ
Вариант 4
Студентка гр. 7501 |
|
Фалевская А.А. |
Студент гр. 7501 |
|
Исаков А.О. |
Преподаватель |
|
Ровша М.В. |
Санкт-Петербург
2020
Цель работы: ознакомление с использованием взаимной корреляционной функции для классификации форм сигналов.
Задание на выполнение работы:
Выполнить расчет ВКФ для фрагментов реальной ЭКГ, содержащих QRS-комплексы, относящиеся к фоновому ритму и к патологии.
Используя значение ВКФ, осуществить разбиение QRS-комплексов ЭКГ на два класса по сходству их форм.
Расчет ВКФ для фрагментов реальной записи ЭКГ
Текст программы Start.m для создания окна и вывода полученных сигналов:
clc
clear all
close all
global hAxes1 hAxes2 hAxes3 hAxes4 hAxes5 hAxes6 hAxes7 hAxes8 hEdit hBtn
x0=200;
y0=50;
w0=1100;
h0=700;
figure('Color',[1 1 1],'Position',[x0,y0,w0,h0])
x1=50;
y1=50;
dy=30;
dx=50;
w=250;
h=140;
hAxes6=axes('Units','pixels','Position',[x1,y1,w,h]);
hAxes3=axes('Units','pixels','Position',[x1,y1+h+dy,w,h]);
hAxes7=axes('Units','pixels','Position',[x1+w+dx,y1,w,h]);
hAxes4=axes('Units','pixels','Position',[x1+w+dx,y1+h+dy,w,h]);
hAxes8=axes('Units','pixels','Position',[x1+2*w+2*dx,y1,w,h]);
hAxes5=axes('Units','pixels','Position',[x1+2*w+2*dx,y1+h+dy,w,h]);
hAxes2=axes('Units','pixels','Position',[x1,y1+2*h+2*dy,w0-x1*2,h/2]);
hAxes1=axes('Units','pixels','Position',...
[x1,y1+2*h+3*dy+h/2,w0-x1*2,h0-(y1*2+2*h+3*dy+h/2)+20]);
x2=950;
y2=300;
w2=70;
h2=15;
hEdit=uicontrol('Style','edit','Position',[x2,y2,w2,h2],...
'Backgroundcolor',[1 1 1],'HorizontalAlignment','left');
hBtn=uicontrol('Style','pushbutton','String','Применить',...
'Position',[x2,y2-30,w2,h2],'Callback','Classtype');
% вывод сигнала в 1 окно
ECG=load('R08-04-1.txt');
Ver=load('R08-04-2.txt');
Fs=250;
N=length(ECG);
tmax=N/Fs;
T=1/Fs;
t=0:T:tmax-T;
axes(hAxes1);
plot(t,ECG);
grid minor;
% вывод порядковых номеров QRS-комплексов и идентификаторов во 2 окно
set(hAxes2,'XLim',[0 10]);
NQRS=length(Ver(:,1));
for i=1:NQRS
x=Ver(i,1)*T;
axes(hAxes2);
text(x,0.85,num2str(i));
text(x,0.6,num2str(Ver(i,2)),'Color','b');
end
% вывод образцов нормы и патологии QRS в окна 3 и 6
N0=1;
P0=2;
N1=3;
P1=5;
L=51;
Smax=(L-1)/2;
ind1=Ver(N0,1);
QRS_N0=ECG(ind1-Smax:ind1+Smax);
ind2=Ver(P0,1);
QRS_P0=ECG(ind2-Smax:ind2+Smax);
ind3=Ver(N1,1);
QRS_N1=ECG(ind3-Smax:ind3+Smax);
ind4=Ver(P1,1);
QRS_P1=ECG(ind4-Smax:ind4+Smax);
tc=-T*Smax:T:T*Smax;
axes(hAxes3);
plot(tc,QRS_N0);
grid minor;
ylim([-1,1]);
axes(hAxes6);
plot(tc,QRS_P0);
grid minor;
ylim([-1,1]);
% удаление линейного тренда
QRS_N0=detrend(QRS_N0);
QRS_P0=detrend(QRS_P0);
QRS_N1=detrend(QRS_N1);
QRS_P1=detrend(QRS_P1);
% построение графиков сравниваемых комплексов и их ВКФ
axes(hAxes5);
c=xcorr(QRS_N0,QRS_P1,Smax,'coeff');
plot(tc,QRS_N0)
hold on
plot(tc,QRS_P1,'g')
plot(tc,c,':r')
set(hAxes5,'YLim',[-1 1]);
grid minor
title('N-P');
axes(hAxes4);
c=xcorr(QRS_N0,QRS_N1,Smax,'coeff');
plot(tc,QRS_N0)
hold on
plot(tc,QRS_N1,'g')
plot(tc,c,':r')
set(hAxes4,'YLim',[-1 1]);
grid minor
title('N-N');
axes(hAxes7);
c=xcorr(QRS_P0,QRS_N1,Smax,'coeff');
plot(tc,QRS_P0)
hold on
plot(tc,QRS_N1,'g')
plot(tc,c,':r')
set(hAxes7,'YLim',[-1 1]);
grid minor
title('P-N');
axes(hAxes8);
c=xcorr(QRS_P0,QRS_P1,Smax,'coeff');
plot(tc,QRS_P0)
hold on
plot(tc,QRS_P1,'g')
plot(tc,c,':r')
set(hAxes8,'YLim',[-1 1]);
grid minor
title('P-P');
% создание массивов максимальых значений ВКФ
ds=5;
for i=1:NQRS
iQRS=Ver(i,1);
QRS=ECG(iQRS-Smax:iQRS+Smax);
QRS=detrend(QRS);
c=xcorr(QRS_N0,QRS,ds,'coeff');
cN(i)=max(c);
c1=xcorr(QRS_P0,QRS,ds,'coeff');
cP(i)=max(c1);
end
Графическое окно при запуске файла Start.m:
Разбиение QRS-комплексов на два класса по сходству их форм
Текст программы Classtype.m, для кнопки «Применить»:
global hAxes1 hAxes2 hAxes3 hAxes4 hAxes5 hAxes6 hAxes7 hAxes8 hEdit hBtn
str=get(hEdit,'String');
corLim = str2double(str);
for i=1:NQRS
if (cN(i)>=corLim)&&(cP(i)<corLim)
Class(i)=1;
elseif (cP(i)>=corLim)&&(cN(i)<corLim)
Class(i)=2;
else
Class(i)=0;
end
end
% вывод номеров классов в окно 2
NQRS=length(Ver(:,1));
axes(hAxes2)
set(hAxes2,'XLim',[0 tmax],'YLim',[0 1]);
rectangle('Position',[0.1,0.1,tmax,0.4],...
'EdgeColor','w','FaceColor','w');
for i=1:NQRS
x=Ver(i,1)*T;
axes(hAxes2);
text(x,0.35,num2str(Class(i)));
end
Графическое окно при нажатии на кнопку «Применить»:
Пороговое значение 0.95:
Пороговое значение 0.8 (нижний порог ошибки):
Пороговое значение 0.97 (верхний порог ошибки):
Вывод: в ходе данной лабораторной работы мы ознакомились с использованием взаимной корреляционной функции для классификации форм сигналов, были построены графики ВКФ для «норма-норма», «норма-патология», «патология-норма», «патология-патология». ВКФ «норма-норма» и «патология-патология» при нулевом сдвиге достигает своего максимума, что было ожидаемо.
Для значения порога 0.95 номера QRS-комплексов для нормы и патологий совпадают с рассчитанными ранее. Опытным путем были определены значения порога, при которых классификация комплексов выполняется без ошибок: (0.8; 0.97).