-
Notifications
You must be signed in to change notification settings - Fork 4
/
DataFilter.sc
84 lines (83 loc) · 2.15 KB
/
DataFilter.sc
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
//--abstract class for filtering OpenBCI data
DataFilter {
var <type, <sampleRate;
var <filt_b, <filt_a;
var nconst, clear, prev_x, prev_y;
var dataN, prev_xN, prev_yN, kN;
*keys {^this.constants.keys.asArray.sort}
*new {|type, sampleRate, bufferSize|
^super.new.initDataFilter(type, sampleRate, bufferSize);
}
initDataFilter {|argType, argSampleRate, argBufferSize|
type= argType;
if(this.class.constants.keys.includes(type).not, {
"type % not supported. only: %".format(type, this.class.constants.keys.asArray).warn;
type= this.class.constants.keys.asArray[0];
});
this.sampleRate_(argSampleRate.asInteger?250); //set a default
this.bufferSize_(argBufferSize?1250);
}
bufferSize_ {|val|
dataN= FloatArray.newClear(val);
}
sampleRate_ {|rate= 250|
var rates= this.class.constants[type].keys;
if(rates.includes(rate).not, {
"samplerate % not supported. only: %".format(rate, rates.asArray.sort).warn;
sampleRate= 250;
}, {
sampleRate= rate;
});
filt_b= this.class.constants[type][sampleRate].b; //TODO how to deal with freq and sr changes?
filt_a= this.class.constants[type][sampleRate].a;
nconst= filt_b.size;
clear= DoubleArray.newClear(nconst);
prev_xN= clear.copy;
prev_yN= clear.copy;
kN= 0;
}
filter {|data|
var i= 0, j, k= 0, l, out, size= data.size;
data= data.copy;
prev_x= clear.copy;
prev_y= clear.copy;
while({i<size}, {
k= (k-1).mod(nconst);
prev_x[k]= data[i];
out= filt_b[0]*prev_x[k];
j= 1;
while({j<nconst}, {
l= (j+k).mod(nconst);
out= out+(filt_b[j]*prev_x[l]);
out= out-(filt_a[j]*prev_y[l]);
j= j+1;
});
prev_y[k]= out;
data[i]= out;
i= i+1;
});
^data;
}
filterN {|newData|
var i= 0, j, l, out, size= dataN.size;
var nd= newData.asCollection;
var index= size-nd.size;
dataN= dataN.drop(nd.size).addAll(nd);
while({i<nd.size}, {
kN= (kN-1).mod(nconst);
prev_xN[kN]= dataN[index+i];
out= filt_b[0]*prev_xN[kN];
j= 1;
while({j<nconst}, {
l= (j+kN).mod(nconst);
out= out+(filt_b[j]*prev_xN[l]);
out= out-(filt_a[j]*prev_yN[l]);
j= j+1;
});
prev_yN[kN]= out;
dataN[index+i]= out;
i= i+1;
});
^dataN;
}
}