korrigierter programmablauf
This commit is contained in:
parent
5242c074b3
commit
cd2631c610
Binary file not shown.
@ -65,71 +65,63 @@ Ein Echtzeit-QRS-Erkennungsalgorithmus wird in Simulink unter der Annahme entwic
|
|||||||
|
|
||||||
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:
|
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}
|
\begin{itemize}
|
||||||
\item FIR-Bandpassfilter mit einem Durchlassbereich von 5 bis 26 Hz
|
\item Fouriertransformation und Inverse Fouriertransformation um niedrige Frequenzen abzuschneiden
|
||||||
\item Ableitung des bandgefilterten Signals
|
\item Bandpassfilter mit einem Durchlassbereich von 5 bis 26 Hz
|
||||||
\item Bestimmung des Absolutwerts des Signals
|
\item Minimalen Abstand zwischen QRS-Spitzen bestimmen
|
||||||
\item Mittelwertbildung des Absolutwerts über ein 80 ms-Fenster
|
\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}
|
\end{itemize}
|
||||||
|
|
||||||
Die folgenden QRS-Erkennungsregeln beziehen sich auf einen PIC-basierten QRS-Detektor:
|
Die folgenden QRS-Erkennungsregeln beziehen sich auf einen PIC-basierten QRS-Detektor:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Alle Peaks, die größeren Peaks um weniger als 196 ms vorausgehen oder folgen, werden ignoriert.
|
\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 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 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.
|
\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}
|
\end{itemize}
|
||||||
|
|
||||||
\subsubsection{}
|
\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:
|
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]
|
\begin{lstlisting}[basicstyle=\tiny, language=matlab]
|
||||||
function [R_Positionen, Entscheidungssignal, Schwellwertverlauf, Lernphase] = QRS_Detektion (EKG_Signal, fa);
|
function [R_Positionen, Entscheidungssignal, Schwellwertverlauf, Lernphase] = QRS_Detektion (EKG_Signal, fa);
|
||||||
|
size = length(EKG_Signal); % Laenge des Signals
|
||||||
fs = fa; % 200; % sampling rate or frequency
|
% fourier transformation
|
||||||
% sze = length(EKG_Signal); % find the length of the data per second
|
signal = fft(EKG_Signal);
|
||||||
%necg = EKG_Signal/max(EKG_Signal); % normalize the maximum value to unity (amplitude)
|
% entfernen niedriger freqzenzen anhand Laenge und Rate
|
||||||
t = [1 : sze]/fs; % sampling rate time
|
signal(1 : round(size*5/fa))=0;
|
||||||
|
signal(end - round(size*5/fa) : end)=0;
|
||||||
% compute the undecimated wavelet transform of the 4-level using sym4
|
% inverse fourier transformation
|
||||||
% this ensures that the length of the signal remains the same
|
signal=real(ifft(signal));
|
||||||
wt = modwt(EKG_Signal, 4, 'sym4'); %4-level undecimated DWT using sym4
|
% bandpass fuer 5 bis 26 hz
|
||||||
wtrec = zeros(size(wt));
|
signal=bandpass(signal, [5 26], fa);
|
||||||
% do not need the approximated and high-frequency coefficients d1 and d2; extract d3 and d4
|
% skalierung des Signals auf skala 1-10
|
||||||
wtrec(3:4, :)= wt(3:4,:)
|
filtersignal=signal/(max(signal)/10);
|
||||||
% inverse discrete wavelet transform (IDWT), will have a signal that has only the r-peaks
|
% entfernen aller peaks unterhalb des thresholds 10/2=5
|
||||||
y=imodwt(wtrec, 'sym4'); %IDWT with only d3 and d4.
|
for data = 1:1:length(filtersignal)
|
||||||
y=abs(y).^2; %magnitude square
|
if filtersignal(data) < 5
|
||||||
% find the average of the signal; will be used as the threshold when finding the signal peak
|
filtersignal(data) = 0;
|
||||||
avg = mean(y); % getting average of y^2 as threshold
|
else
|
||||||
[Rpeaks, locs] = findpeaks(y,t, 'MinPeakHeight', 8*avg, 'MinPeakDistance', 50); % finding peaks
|
filtersignal(data)=1;
|
||||||
% find the location of the R-peaks in consideration of the length of the signal. It represents the number of beats
|
end
|
||||||
nohb = length(locs); %No. of beats
|
end
|
||||||
timelimit = length(EKG_Signal)/Fs; %getting the time function of the signal
|
% finde alle uebrigen peaks, die ueber dem threshold lagen
|
||||||
hbpermin = (nohb*60)/timelimit; %Getting Beat per minute.
|
positions=find(filtersignal);
|
||||||
disp(strcat('HeartRate= ', num2str(hbpermin))) %displaying the heartrate
|
% abstand der ersten beiden peaks
|
||||||
|
distance=positions(2)-positions(1);
|
||||||
%displaying ecg signal and detected R-peaks
|
% setzte den abstand auf das minimum zweier peaks in der reihe aller uebrigen peaks
|
||||||
subplot(211)
|
for data=1:1:length(positions)-1
|
||||||
plot(tx, EKG_Signal);
|
if positions(data+1)-positions(data)<distance
|
||||||
xlim([0, timelimit])
|
distance=positions(data+1)-positions(data);
|
||||||
grid on
|
end
|
||||||
xlabel('seconds')
|
end
|
||||||
ylabel('ECG signal')
|
% Mittel des Signals als Threshold
|
||||||
|
avg = mean(signal)
|
||||||
% plot filtered signal with detected peaks
|
% Absolute Peaks innerhalb des Zeitfensters finden
|
||||||
subplot(212)
|
[RPeaks, positions] = findpeaks(signal, 'MinPeakHeight', 1.5*avg, 'MinPeakDistance', distance, "MaxPeakWidth", 250);
|
||||||
plot(t,y)
|
R_Positionen = positions;
|
||||||
grid on
|
Entscheidungssignal = signal;
|
||||||
xlim([0, length(EKG_Signal)]);
|
Schwellwertverlauf = RPeaks;
|
||||||
hold on
|
Lernphase = 0; % Bedeutung nicht erklaert
|
||||||
plot(locs, Rpeaks, 'ro')
|
|
||||||
xlabel('samples')
|
|
||||||
title(strcat('R peaks found and heartrate: ', num2str(hbpermin)))
|
|
||||||
|
|
||||||
R_Positionen = locs;
|
|
||||||
Entscheidungssignal = y;
|
|
||||||
Schwellwertverlauf = avg;
|
|
||||||
Lernphase = 0; % Bedeutung unklar?
|
|
||||||
|
|
||||||
end
|
end
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user