-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy pathFilter.cpp
95 lines (74 loc) · 2.5 KB
/
Filter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "Filter.h"
Filter::Filter(){}
Filter::~Filter(){}
void Filter::zeroPhase(std::vector<double> b, std::vector<double> a, ECGSignalChannel &inputSignal, ECGSignalChannel &outputSignal, int order)
{
this->filter(b, a, inputSignal, outputSignal, order);
auto signalLength = inputSignal->signal->size;
ECGSignalChannel reverseSignal = ECGSignalChannel(new WrappedVector);
reverseSignal->signal = gsl_vector_alloc(signalLength);
for (int i=0; i<signalLength; i++)
{
auto y1 = gsl_vector_get(outputSignal -> signal, signalLength-i-1);
gsl_vector_set (reverseSignal -> signal, i, y1);
//x[i]=y[NP-i-1];
}
this->filter(b, a, reverseSignal, outputSignal, order);
for (int i=0; i<signalLength; i++)
{
auto y1 = gsl_vector_get(outputSignal -> signal, signalLength-i-1);
gsl_vector_set (reverseSignal -> signal, i, y1);
//x[i]=y[NP-i-1];
}
for (int i=0; i<signalLength; i++)
{
auto y1 = gsl_vector_get(reverseSignal-> signal, i);
gsl_vector_set (outputSignal -> signal, i, y1);
//y[i]=x[i];
}
}
void Filter::filter(std::vector<double> b, std::vector<double> a, ECGSignalChannel &inputSignal, ECGSignalChannel &outputSignal, int order)
{
auto signalLength = inputSignal -> signal->size;
//y[0]=b[0]*x[0];
auto x1 = gsl_vector_get(inputSignal -> signal, 0);
gsl_vector_set (outputSignal -> signal, 0, x1*b[0]);
for (int i=1; i<order+1; i++)
{
//y[i]=0.0;
gsl_vector_set (outputSignal -> signal, i, 0.0);
for (int j=0; j<i+1; j++)
{
//y[i]=y[i]+b[j]*x[i-j];
auto y1 = gsl_vector_get(outputSignal -> signal, i);
auto x1 = gsl_vector_get(inputSignal -> signal, i-j);
gsl_vector_set (outputSignal -> signal, i, y1+b[j]*x1);
}
for (int j=0; j<i; j++)
{
//y[i]=y[i]-a[j+1]*y[i-j-1];
auto y_i1 = gsl_vector_get(outputSignal -> signal, i);
auto y1 = gsl_vector_get(outputSignal -> signal, i-j-1);
gsl_vector_set (outputSignal -> signal, i, y_i1-a[j+1]*y1);
}
}
for (int i=order+1;i<signalLength;i++)
{
//y[i]=0.0;
gsl_vector_set (outputSignal -> signal, i, 0.0);
for (int j=0; j<order+1; j++)
{
//y[i]=y[i]+b[j]*x[i-j];
auto y1 = gsl_vector_get(outputSignal -> signal, i);
auto x1 = gsl_vector_get(inputSignal -> signal, i-j);
gsl_vector_set (outputSignal -> signal, i, y1+b[j]*x1);
}
for (int j=0; j<order; j++)
{
//y[i]=y[i]-a[j+1]*y[i-j-1];
auto y_i1 = gsl_vector_get(outputSignal -> signal, i);
auto y1 = gsl_vector_get(outputSignal -> signal, i-j-1);
gsl_vector_set (outputSignal -> signal, i, y_i1-a[j+1]*y1);
}
}
}