186 lines
11 KiB
TeX
186 lines
11 KiB
TeX
\documentclass[a4paper,12pt,titlepage]{scrartcl}
|
|
\usepackage[sc]{mathpazo} % Schrift - wie Funcky und in PDF zu Fonts beschrieben
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[a-1b]{pdfx}
|
|
\usepackage[ngerman]{babel}
|
|
\usepackage[amssymb]{SIunits}
|
|
\usepackage{graphicx}
|
|
\usepackage{subfigure}
|
|
\usepackage{float}
|
|
\usepackage[iso,german]{isodate} %his package provides commands to switch between different date formats
|
|
\usepackage{hyperref}
|
|
\usepackage{listings}
|
|
|
|
\usepackage{fancyhdr}
|
|
\renewcommand{\headrulewidth}{0.5pt}
|
|
\renewcommand{\footrulewidth}{0.5pt}
|
|
%Abstand zwischen Absätzen, Zeilenabstände
|
|
\voffset26pt
|
|
\parskip6pt
|
|
%\parindent1cm %Rückt erste Zeile eines neuen Absatzes ein
|
|
\usepackage{setspace}
|
|
\onehalfspacing
|
|
|
|
\begin{document}
|
|
\pagenumbering{roman}
|
|
\titlehead
|
|
{
|
|
\small
|
|
{
|
|
Technische Universität Ilmenau\\
|
|
Fakulät IA\\
|
|
Fachgebiet Biosignalverarbeitung\\
|
|
|
|
Praktikum EKG-Signalanalyse\\
|
|
WS 2021/22}
|
|
}
|
|
|
|
\title {Versuchsprotokoll}
|
|
\subtitle{EKG-Signalanalyse}
|
|
\author{}
|
|
\date{\today\\*[60pt]}
|
|
\maketitle %Erstellt das Titelblatt wie oben definiert
|
|
|
|
%Einstellungen zur Kopf- und Fußzeile
|
|
\pagestyle{fancy}
|
|
\fancyhead[R]{Praktikumsbericht: EKG-Signalanalyse}
|
|
\pagenumbering{arabic}
|
|
\newpage
|
|
|
|
\section{Vorbereitungsaufgaben}
|
|
\subsection{EKG-Vorverarbeitung}
|
|
Entwickeln Sie eine Strategie zur EKG-Vorverarbeitung (Filterung)! Bedenken Sie dabei, dass die EKG-Vorverarbeitung maßgeblichen Einfluss auf die Qualität der QRS-Detektion hat.
|
|
|
|
\subsection{QRS-Detektion}
|
|
\subsubsection{}
|
|
\textbf{Entwickeln Sie einen Algorithmus zur adaptiven QRS-Detektion, von dem Sie ein möglichst gutes Detektionsergebnis erwarten! Achten Sie dabei besonders auf dessen prinzipielle Online-Fähigkeit. 250 ms Zeitvorlauf sollen dabei nicht überschritten werden, d.h. zur Entscheidungsfindung, ob ein Abtastwert zum Zeitpunkt t eine R-Zacke darstellt oder nicht, können maximal die Abtastwerte der nächsten 250 ms einbezogen werden. Notieren und erklären Sie die verwendeten Operatoren/Formeln und beschreiben Sie den Block der Entscheidungsfindung in einem Programmablaufplan bzw. Entscheidungsbaum!}
|
|
|
|
Wir definieren drei Signale: $f_1$ stellt das hochfrequente Rauschen dar, bei $f_2$ handelt es sich um das QRS und Frequenz $f_3$ ist der langsam schwankender Inhalt des EKGs. Die Beziehung zwischen diesen drei Frequenzen ist $f_1>f_2>f_3$.
|
|
Ziel ist es, alle R-Peaks zu erhalten und alle anderen Frequenzen zu eliminieren, also $f_1$ und $f_3$ eliminieren aber $f_2$ beibehalten. Dies wird als Bandpassfilterung bezeichnet. Sie wird mithilfe der Wavelet-Transformation erreicht. Die Wavelet-Transformation gruppiert Signale mit denselben Frequenzbändern. Daher kann eine Bandpassfilterung durchgeführt werden, indem einige Frequenzbänder eliminiert werden.
|
|
|
|
Diese Bandpassfilterung kann durch die Eliminierung von Wavelet-Koeffizienten einiger niedriger Skalen (hohe Frequenzen) und höherer Skalen (niedrige Frequenzen) von EKG-Signalen erreicht werden. Zu diesem Zweck wird eine nicht dezimierte Wavelet-Transformation verwendet, um Wavelet-Koeffizienten zu erhalten.
|
|
|
|
Ein Echtzeit-QRS-Erkennungsalgorithmus wird in Simulink unter der Annahme entwickelt, dass die Abtastfrequenz des EKG-Eingangssignals immer 200 Hz (oder 200 Samples/s) beträgt. Die aufgezeichneten realen EKG-Daten können jedoch unterschiedliche Abtastfrequenzen haben, die von 200 Hz bis 1000 Hz reichen. Um die unterschiedlichen Abtastfrequenzen zu überbrücken, wird ein Abtastratenwandlerblock verwendet, der die Abtastrate in 200 Hz umwandelt. Ein Pufferblock wird eingefügt, um sicherzustellen, dass die Länge des EKG-Eingangssignals ein Vielfaches des berechneten Dezimierungsfaktors des Abtastratenwandlerblocks ist.
|
|
|
|
Das EKG-Signal wird gefiltert, um eine gefensterte Schätzung der Energie im QRS-Frequenzband zu erhalten. Die Erkennungsschwelle wird automatisch auf der Grundlage der mittleren Schätzung der durchschnittlichen QRS-Spitze und der durchschnittlichen Rauschspitze angepasst. Die Filterung erfolgt in folgenden Schritten:
|
|
\begin{itemize}
|
|
\item Fouriertransformation und Inverse Fouriertransformation um niedrige Frequenzen abzuschneiden
|
|
\item Bandpassfilter mit einem Durchlassbereich von 5 bis 26 Hz
|
|
\item Minimalen Abstand zwischen QRS-Spitzen bestimmen
|
|
\item Bestimmung des Absolutwerts und Mittelwertbildung des Absolutwerts
|
|
\item Signalspitzen zwischen dem minimalen und maximalen QRS Abstand, die über dem Mittelwert liegen, finden
|
|
\end{itemize}
|
|
|
|
Die folgenden QRS-Erkennungsregeln beziehen sich auf einen PIC-basierten QRS-Detektor:
|
|
\begin{itemize}
|
|
\item Alle Peaks, die größeren Peaks um weniger als 250 ms vorausgehen oder folgen, werden ignoriert.
|
|
\item Wenn eine Spitze auftritt, prüfe, ob das Rohsignal sowohl positive als auch negative Steigungen enthält. Wenn dies der Fall ist, melde, dass ein Peak gefunden wurde. Andernfalls handelt es sich um eine Grundlinienverschiebung.
|
|
\item Ist der Peak größer als die Erkennungsschwelle, wird er als QRS-Komplex klassifiziert. Andernfalls wird er als Rauschen eingestuft.
|
|
\item Wenn innerhalb von 1,5 R-zu-R-Intervallen kein QRS erkannt wurde, aber eine Spitze vorhanden ist, die größer als die halbe Erkennungsschwelle ist, und diese Spitze mindestens 360 ms auf die vorhergehende Erkennung folgt, wird diese Spitze als QRS-Komplex eingestuft.
|
|
\end{itemize}
|
|
|
|
\subsubsection{}
|
|
Entwickeln Sie zu diesem Algorithmus die zugehörige(n) MATLAB-Funktion(en) und bringen Sie den Quelltext schriftlich zum Praktikum mit! Benutzen Sie die gegebene Funktionsschnittstelle:
|
|
\begin{lstlisting}[basicstyle=\tiny, language=matlab]
|
|
function [R_Positionen, Entscheidungssignal, Schwellwertverlauf, Lernphase] = QRS_Detektion (EKG_Signal, fa);
|
|
size = length(EKG_Signal); % Laenge des Signals
|
|
% fourier transformation
|
|
signal = fft(EKG_Signal);
|
|
% entfernen niedriger freqzenzen anhand Laenge und Rate
|
|
signal(1 : round(size*5/fa))=0;
|
|
signal(end - round(size*5/fa) : end)=0;
|
|
% inverse fourier transformation
|
|
signal=real(ifft(signal));
|
|
% bandpass fuer 5 bis 26 hz
|
|
signal=bandpass(signal, [5 26], fa);
|
|
% skalierung des Signals auf skala 1-10
|
|
filtersignal=signal/(max(signal)/10);
|
|
% entfernen aller peaks unterhalb des thresholds 10/2=5
|
|
for data = 1:1:length(filtersignal)
|
|
if filtersignal(data) < 5
|
|
filtersignal(data) = 0;
|
|
else
|
|
filtersignal(data)=1;
|
|
end
|
|
end
|
|
% finde alle uebrigen peaks, die ueber dem threshold lagen
|
|
positions=find(filtersignal);
|
|
% abstand der ersten beiden peaks
|
|
distance=positions(2)-positions(1);
|
|
% setzte den abstand auf das minimum zweier peaks in der reihe aller uebrigen peaks
|
|
for data=1:1:length(positions)-1
|
|
if positions(data+1)-positions(data)<distance
|
|
distance=positions(data+1)-positions(data);
|
|
end
|
|
end
|
|
% Mittel des Signals als Threshold
|
|
avg = mean(signal)
|
|
% Absolute Peaks innerhalb des Zeitfensters finden
|
|
[RPeaks, positions] = findpeaks(signal, 'MinPeakHeight', 1.5*avg, 'MinPeakDistance', distance, "MaxPeakWidth", 250);
|
|
R_Positionen = positions;
|
|
Entscheidungssignal = signal;
|
|
Schwellwertverlauf = RPeaks;
|
|
Lernphase = 0; % Bedeutung nicht erklaert
|
|
end
|
|
\end{lstlisting}
|
|
|
|
\section{Praktikumsaufgaben}
|
|
\subsection{EKG-Ableitung mit Hilfe des Biosignalverstärkers ,,g.BSamp'' und ,,g.ECGbox''}
|
|
Leiten Sie jeweils ein 5 minütiges EKG eines Studenten innerhalb der folgenden vier Phasen ab. Achten Sie dabei auf die Auswahl der Kanäle!
|
|
\begin{itemize}
|
|
\item Lagetyp-Phase: Proband liegt und atmet normal (alle Kanäle)
|
|
\item Ruhe-Phase: Proband liegt und atmet normal (Kanal mit größter R-Zacke)
|
|
\item RESP-Phase: Proband liegt und atmet langsam tief ein und tief aus (Kanal mit größter R- Zacke)
|
|
\item STEH-Phase: Proband steht und atmet normal (Kanal mit größter R-Zacke)
|
|
\end{itemize}
|
|
|
|
\subsection{Bestimmung der elektrischen Herzachse}
|
|
Mit Hilfe des Matlab-GUI „Datenanzeigen“ können die abgeleiteten Signale dargestellt und ausgewertet werden. Für die Bestimmung des Lagetyps gehen Sie wie folgt vor:
|
|
\begin{itemize}
|
|
\item Laden Sie die abgeleiteten Daten und filtern Sie diese, falls nötig
|
|
\item Wählen Sie einen Artefakt-freien Signalabschnitt
|
|
\item Suchen Sie die höchste der R-Zacke
|
|
\item Bestimmen Sie die Amplitude der Zacken zu einem Zeitpunkt in den Ableitungen I, II und III,benutzen Sie dazu den „Data-Cursor“ von Matlab.
|
|
\item Tragen Sie die Funktionswerte in das vorgefertigte Protokoll ein und bilden Sie von mindestens zwei Vektoren graphisch den Summenvektor
|
|
\item Mit Hilfe des Cabrera-Kreises können Sie nun den Lagetyp bestimmen.
|
|
\end{itemize}
|
|
|
|
\subsection{EKG-Vorverarbeitung}
|
|
Unter dem Menü-Punkt EKG-Vorverarbeitung stehen Ihnen Methoden zur Signal-Vorverarbeitung (Filterung) bereits fertig zur Verfügung.
|
|
Überprüfen Sie die Wirksamkeit der von Ihnen vorgeschlagenen Vorverarbeitungsmethoden und deren Parametereinstellungen anhand der EKG-Signale der MIT-Datenbank: 100, 106, 107, 208 und 222 visuell! Überlagern Sie die Signale mit einem Drift und einer 50 Hz-Sinusschwingung!
|
|
|
|
\subsection{QRS-Detektion mit Hilfe von MATLAB}
|
|
\subsubsection{}
|
|
Implementieren Sie Ihren entwickelten Algorithmus zur QRS-Detektion in die Funktion QRS\_Detektion.m
|
|
|
|
\subsubsection{}
|
|
Evaluieren Sie Ihren QRS-Detektor anhand der folgenden EKG-Signale der MIT-Datenbank: 100, 106, 107, 208 und 222! Notieren Sie die Detektionsquote! Wo liegen die Stärken bzw. die Schwächen Ihres Detektors?
|
|
|
|
\subsubsection{}
|
|
Versuchen Sie anhand der Ergebnisse dieses ersten Detektionstests den Detektionsalgorithmus bzw. (falls angebracht) auch Ihre EKG-Vorverarbeitung zu optimieren! Wiederholen Sie den Detektionstest! Inwieweit konnten die Detektionseigenschaften verbessert werden?
|
|
|
|
\subsection{Analyse der Herzfrequenzvariabilität}
|
|
\subsubsection{}
|
|
Analysieren Sie die aufgezeichneten EKG-Signale während der drei Phasen (RUHE, RESP und STEH)!
|
|
|
|
Interpretieren Sie die Unterschiede in den Ergebnissen der einzelnen Phasen der HRV-Analyse!
|
|
|
|
\subsubsection{}
|
|
Vergleichen Sie die HRV-Ergebnisse des Praktikumsprobanden mit den Ergebnissen eines Polyneuropathie-Patienten (Datei: zwickau.dat).
|
|
|
|
|
|
\section{Hilfreiche Links und Infos}
|
|
\href{https://eleceng.dit.ie/dorran/matlab/resources/Matlab%20Signal%20Processing%20Examples.pdf}{eleceng.dit.ie}
|
|
|
|
\href{https://biomedicalsignalandimage.blogspot.com/2016/02/matlab-code-to-plot-ecg-signal.html}{biomedicalsignalandimage.blogspot.com}
|
|
|
|
\href{https://github.com/Aburas98/MATLAB/}{GitHub.com/Aburas98}
|
|
|
|
\href{https://www.section.io/engineering-education/electrocardiograms-qrs-peak-and-heart-rate-detection-using-dwt-in-matlab/}{}section.io
|
|
|
|
\href{https://de.mathworks.com/help/dsp/ug/real-time-ecg-qrs-detection.html}{Mathworks.com}
|
|
|
|
\end{document}
|
|
|