Hallo Leute,
ich bin gerade dabei den Bandpassfilter (5-11Hz) des
Pan/Tompkins-Algorithmus in C zu implementieren. Leider liefert er mir
nicht das gewünschte Ergebnis, sondern im Ausgangssignal ist immer noch
eine deutliche 50Hz-Schwingung zu erkennen und überhaupt kein
EKG-Signal. Allerdings erkenne ich in meiner Implementierung keinen
Fehler. Außerdem hatte ich den kompletten Algorithmus vorher schon mit
einem IIR-Butterworth-Bandpass 3.Ordnung am laufen, also kann es auch
nicht an dem Rest des Codes liegen.
Ich wollte nur den IIR-Bandpass durch den originalen Bandpass aus dem
Pan-Tompkins-Algorithmus ersetzen um einen linearen Phasengang zu
erhalten und so das Ergebnis etwas zu verbessern.
Der Bandpass besteht aus einem Hoch- und einem Tiefpass deren Funktionen
folgendermaßen gegeben sind:
Hochpass:
y(nT) = 32x(nT-16T) - 1/32[y(nT-T) + x(nT) - x(nT-32T)]
Tiefpass:
y(nT) = 2y(nT-T) - y(nT-2T) + x(nT) - 2x(nT-6T) + x(nT-12T)
Habe ich vielleicht doch einen Fehler übersehen?
1 | -----------------Filterfunktionen---------------------
|
2 | signed long lowpass(signed long *x, signed long *y)
|
3 | {
|
4 | y[0] = 2*y[1] - y[2] + ((x[0] - 2*x[6] + x[12]));
|
5 |
|
6 | return y[0];
|
7 |
|
8 | y[1] = y[2];
|
9 | y[0] = y[1];
|
10 | }
|
11 |
|
12 |
|
13 | signed long highpass(signed long *x, signed long *y)
|
14 | {
|
15 | y[0] = x[16] - (y[1] >> 5) - (x[0] >> 5) + (x[32] >> 5);
|
16 |
|
17 | return y[0];
|
18 |
|
19 | y[0] = y[1];
|
20 | }
|
21 |
|
22 | -------------------Aufruf in der Main----------------------
|
23 | x_lowpass[0] = data;
|
24 | data = lowpass(x_lowpass, y_lowpass);
|
25 | //alle Werte um eine Stelle weiterschieben
|
26 | for(l = 11; l > 0; l--)
|
27 | {
|
28 | x_lowpass[l] = x_lowpass[l+1];
|
29 | }
|
30 | x_lowpass[0] = x_lowpass[1];
|
31 |
|
32 | x_highpass[0] = data;
|
33 | data = highpass(x_highpass, y_highpass);
|
34 | //alle Werte um eine Stelle weiterschieben
|
35 | for(l = 31; l > 0; l--)
|
36 | {
|
37 | x_highpass[l] = x_highpass[l+1];
|
38 | }
|
39 | x_highpass[0] = x_highpass[1];
|