- •Содержание
- •1. Биомеханические основы сокращения сердца
- •2. Основные гемодинамические параметры деятельности сердца
- •3. Обзор методик определения времени изгнания сердца
- •3.1. Определение времени изгнания по электрокардиограмме
- •3.2. Определение времени изгнания с помощью поликардиографии
- •3.3. Определение времени изгнания по трансторакальной реограмме.
- •4. Разработка алгоритма обработки сигнала экг: выделение rr интервалов
- •5. Разработка алгоритма определения времени изгнания по трансторакальной реограмме
- •6. Реализация программ для выделения rr интервалов на экг и определения времени изгнания по сигналу трансторакальной реограммы в среде Delphi
- •7. Выводы
- •Список используемой литературы
- •Хемминг р.В. Цифровые фильтры: Пер. С англ. М.: Недра, 1987.
6. Реализация программ для выделения rr интервалов на экг и определения времени изгнания по сигналу трансторакальной реограммы в среде Delphi
Приведем основные используемые функции и процедуры:
////Нахождение максимального значения ЭКГ
function MaxEKG:real;
var j:integer;
begin
Result:=C[2,0];
for j:=1 to Length(C[2])-1 do
if C[2,j]>Result then Result:=C[2,j];
end;
////Нахождение максимального значения дифференцированной реограммы
function MaxDifReo:real;
var j:integer;
begin
Result:=C[5,0];
for j:=1 to Length(C[5])-1 do
if C[5,j]>Result then Result:=C[5,j]
end;
////нахождение порогового значения (для поиска R-зубцов)
procedure TForm1.PorR;
var j:integer; sum,max:real;
begin sum:=0;
for j:=0 to Length(C[2])-1 do
sum:=sum+C[2,j];
max:=C[2,0];
for j:=1 to Length(C[2])-1 do
if C[2,j]>max then max:=C[2,j];
PorogR:=Round(sum/(Length(C[2])-1)+max/2);
end;
////нахождение R-зубцов
procedure TForm1.MaxR;
var j,p,k:integer;
Ry,Rx:real;
begin
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clBlack;
Image1.Canvas.Pen.Color:=clBlack;
for j:=0 to Length(C[2])-1 do
if (C[2,j]<=PorogR) and (C[2,j+1]>PorogR) then
begin
for k:=j+1 to Length(C[2])-1 do
if ((C[2,k]>PorogR) and (C[2,k+1]<=PorogR)) then
begin
Rx:=j+1;
Ry:=C[2,j+1];
for p:=j+1 to k do
if C[2,p]>Ry then
begin
Ry:=C[2,p];
Rx:=p;
end;
Image1.Canvas.MoveTo(round((Rx)*w),round(a1+(-1)*Ry*q)+e);
Image1.Canvas.LineTo(round((Rx)*w),round(a1+(-1)*Ry*q)-e);
end;
end;
end;
////нахождение максимумов дифференцированной реограммы
procedure TForm1.MaxM;
var Mx,a,j,k,p:integer;
My:real;
begin
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clRed;
Image1.Canvas.Pen.Color:=clRed;
SetLength(ARR,1);
ARR[0]:=1;
a:=2;
for j:=0 to Length(C[5])-1 do
if ((C[5,j]<PorogM) and (C[5,j+1]>PorogM)) then
begin
for k:=j+1 to Length(C[5])-1 do
if ((C[5,k]>PorogM) and (C[5,k+1]<PorogM)) then
begin
Mx:=j+1;
My:=C[2,j+1];
for p:=j+1 to k do
if C[5,p]>My then
begin
My:=C[5,p];
Mx:=p;
end;
if Mx>ARR[a-2] then
begin
SetLength(ARR,a);
ARR[a-1]:=round(Mx);
a:=a+1; ////заполнение массива координатами точек максимума дифференцированной реограммы по оси Х
Image1.Canvas.MoveTo(round((Mx)*w3),round(a3+(-1)*My*q3)+e);
Image1.Canvas.LineTo(round((Mx)*w3),round(a3+(-1)*My*q3)-e);
end;
end;
end;
ARR[a-1]:=round(Length(C[5])-1);
end;
////Нахождение точек начала изгнания крови по диф. реограмме
procedure TForm1.GelZ;
var b,e9:integer;
Max,Px:real;
begin
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clBlue;
Image1.Canvas.Pen.Color:=clBlue;
Px:=1;
for b:=0 to Length(ARR)-2 do
begin
Max:=0.0000000001;
for e9:=ARR[b] to ARR[b+1] do
begin
if ((C[5,e9+1]-C[5,e9])/(1/Gc)>Max) and (C[5,e9]>0) then
begin
Max:=(C[5,e9+1]-C[5,e9])/(1/Gc);
Px:=e9;
end;
end;
Image1.Canvas.MoveTo(round((Px)*w3),round(a3+5)+e*2);
Image1.Canvas.LineTo(round((Px)*w3),round(a3+5)-e*2);
end;
end;
////Нахождение точек конца изгнания крови по диф. реограмме
procedure TForm1.GelY;
var b,e9,Px,Px2:integer;
Min1,Min2:real;
begin
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clBlack;
Image1.Canvas.Pen.Color:=clBlack;
Px:=1;
Px2:=1;
for b:=1 to Length(ARR)-1 do
begin
Min1:=C[5,ARR[b]];
for e9:=ARR[b] to ARR[b+1] do
if Min1>C[5,e9] then
begin
Min1:=C[5,e9];
Px:=e9;
end;
Min2:=C[5,ARR[b]];
for e9:=ARR[b] to Px-1 do
if ((Min2>C[5,e9]) and ((C[5,e9-1]<C[5,e9]) and (C[5,e9]<C[5,e9+1])) ) then
begin
Min2:=C[5,e9];
Px2:=e9;
end;
if Px2 = 1 then Px2:=Px;
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clGreen;
Image1.Canvas.Pen.Color:=clGreen;
Image1.Canvas.MoveTo(round((Px2)*w3),round(a3+5)+e*2);
Image1.Canvas.LineTo(round((Px2)*w3),round(a3+5)-e*2);
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.Font.Color:=clBlack;
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.MoveTo(round((Px)*w3),round(a3+5)+e*2);
Image1.Canvas.LineTo(round((Px)*w3),round(a3+5)-e*2);
end;
end;
Рисунок 10 – «Опорная» электрокардиограмма (EKG) с выделенными R-зубцами, трансторакальная реограмма (REO), 1-ая производной трансторакальной реограммы – диффреограмма (DIFF) с выделенными моментами начала и окончания изгнания.
