5 % apply a zerophase FIR filter (coeffs designed with sptool)
6 % Least Sq. FIR LP & HP filters (cascaded): 70dB 0.05-40Hz 1dB ripple.
7 % Sampling Frequency of Fs = 128.
9 % Should work nicely for 16bit, 256Hz ECG. You may experince
10 % some ringing at turning points, but that
's FIR filters for you.
11 % You might like to try wavelets for a better filter
13 % These routines are made available under the GNU general public license.
14 % If you have not received a copy of this license, please download from
17 % Please distribute (and modify) freely, commenting where you have
18 % added modifications. The author would appreciate correspondence
19 % regarding corrections, modifications, improvements etc.
21 % G. Clifford : gari@ieee.org
26 % Data should be zeromeaned before calling this function
27 data = data - mean(data);
29 % set up transfer function
30 %0.00128 1.28 & 35-45Hz
33 -7.836313016322635e-03
34 -1.896972756320189e-02
35 -5.175330833579545e-03
37 -6.018872954550802e-04
38 -1.897562067220059e-02
41 -4.029205517855476e-02
44 -5.937364415063083e-02
45 -8.822946558472169e-02
49 -8.822946558472169e-02
50 -5.937364415063083e-02
53 -4.029205517855476e-02
56 -1.897562067220059e-02
57 -6.018872954550802e-04
59 -5.175330833579545e-03
60 -1.896972756320189e-02
61 -7.836313016322635e-03
66 -5.272437301928293e-04
67 -1.270087347478445e-04
68 -1.421348135287156e-04
69 -1.582961734171513e-04
70 -1.755764587237310e-04
71 -1.939486402411108e-04
72 -2.135296230579367e-04
73 -2.342715794110092e-04
74 -2.563093703085422e-04
75 -2.796160181433441e-04
76 -3.043014698229107e-04
77 -3.303453248658040e-04
78 -3.578455028268245e-04
79 -3.867214105939904e-04
80 -4.170888923036170e-04
81 -4.488811733969728e-04
82 -4.822063006316578e-04
83 -5.170197946280047e-04
84 -5.535253395139226e-04
85 -5.916625148888152e-04
86 -6.316044529097936e-04
87 -6.732081327790902e-04
88 -7.165788660268917e-04
89 -7.614673946729495e-04
90 -8.081236729920874e-04
91 -8.564379420809926e-04
92 -9.069404054062480e-04
93 -9.592891108521169e-04
94 -1.013520022388740e-03
95 -1.068455050967581e-03
96 -1.126689269663744e-03
97 -1.186204883152881e-03
98 -1.247380114262856e-03
99 -1.310856912732174e-03
100 -1.375900461340159e-03
101 -1.443041461735466e-03
102 -1.511885029416557e-03
103 -1.582738786552247e-03
104 -1.655320583005337e-03
105 -1.729893353369970e-03
106 -1.806203460527855e-03
107 -1.884446397624664e-03
108 -1.964430802275773e-03
109 -2.046262955654651e-03
110 -2.129750428836313e-03
111 -2.215037813560021e-03
112 -2.301981811742379e-03
113 -2.390672229028491e-03
114 -2.480975908659032e-03
115 -2.572931105092679e-03
116 -2.666360748382136e-03
117 -2.761304979221734e-03
118 -2.857698150519032e-03
119 -2.955598535068774e-03
120 -3.054901001596308e-03
121 -3.155478224722803e-03
122 -3.257211616317062e-03
123 -3.360192620167190e-03
124 -3.464496103258388e-03
125 -3.569633821553856e-03
126 -3.675798007866096e-03
127 -3.783106411027402e-03
128 -3.891012640258272e-03
129 -3.999917962979201e-03
130 -4.109378741483071e-03
131 -4.219573587392301e-03
132 -4.330206242883826e-03
133 -4.441415505603127e-03
134 -4.552895068871517e-03
135 -4.664787674933710e-03
136 -4.776796783833356e-03
137 -4.888968546054471e-03
138 -5.001078813544399e-03
139 -5.113207893538720e-03
140 -5.225099919404130e-03
141 -5.336816346211259e-03
142 -5.448125259639512e-03
143 -5.559029938118835e-03
144 -5.669293181689946e-03
145 -5.778976225031504e-03
146 -5.887879122882245e-03
147 -5.996012432011148e-03
148 -6.103126173593918e-03
149 -6.209214132300607e-03
150 -6.314120595416707e-03
151 -6.417882343141420e-03
152 -6.520214636498100e-03
153 -6.621088290402421e-03
154 -6.720450076732404e-03
155 -6.818237948419261e-03
156 -6.914128204056832e-03
157 -7.008372785989206e-03
158 -7.100533958060398e-03
159 -7.190766902504709e-03
160 -7.278807347187491e-03
161 -7.364733068710562e-03
162 -7.448280274431376e-03
163 -7.529573080376522e-03
164 -7.608284813103398e-03
165 -7.684521116446521e-03
166 -7.758085897312433e-03
167 -7.829019629435470e-03
168 -7.897106543328992e-03
169 -7.962444021838374e-03
170 -8.024797816710869e-03
171 -8.084212682808753e-03
172 -8.140518300829559e-03
173 -8.193808564001160e-03
174 -8.243881936890022e-03
175 -8.290796858484446e-03
176 -8.334367833865763e-03
177 -8.374699271329103e-03
178 -8.411637628938252e-03
179 -8.445234427388959e-03
180 -8.475297677477069e-03
181 -8.501979217581199e-03
182 -8.525132171625144e-03
183 -8.544799261897136e-03
184 -8.560853979448457e-03
185 -8.573474502979061e-03
186 -8.582371323167616e-03
187 -8.587790488764461e-03
188 9.914104520892446e-01
189 -8.587790488764461e-03
190 -8.582371323167616e-03
191 -8.573474502979061e-03
192 -8.560853979448457e-03
193 -8.544799261897136e-03
194 -8.525132171625144e-03
195 -8.501979217581199e-03
196 -8.475297677477069e-03
197 -8.445234427388959e-03
198 -8.411637628938252e-03
199 -8.374699271329103e-03
200 -8.334367833865763e-03
201 -8.290796858484446e-03
202 -8.243881936890022e-03
203 -8.193808564001160e-03
204 -8.140518300829559e-03
205 -8.084212682808753e-03
206 -8.024797816710869e-03
207 -7.962444021838374e-03
208 -7.897106543328992e-03
209 -7.829019629435470e-03
210 -7.758085897312433e-03
211 -7.684521116446521e-03
212 -7.608284813103398e-03
213 -7.529573080376522e-03
214 -7.448280274431376e-03
215 -7.364733068710562e-03
216 -7.278807347187491e-03
217 -7.190766902504709e-03
218 -7.100533958060398e-03
219 -7.008372785989206e-03
220 -6.914128204056832e-03
221 -6.818237948419261e-03
222 -6.720450076732404e-03
223 -6.621088290402421e-03
224 -6.520214636498100e-03
225 -6.417882343141420e-03
226 -6.314120595416707e-03
227 -6.209214132300607e-03
228 -6.103126173593918e-03
229 -5.996012432011148e-03
230 -5.887879122882245e-03
231 -5.778976225031504e-03
232 -5.669293181689946e-03
233 -5.559029938118835e-03
234 -5.448125259639512e-03
235 -5.336816346211259e-03
236 -5.225099919404130e-03
237 -5.113207893538720e-03
238 -5.001078813544399e-03
239 -4.888968546054471e-03
240 -4.776796783833356e-03
241 -4.664787674933710e-03
242 -4.552895068871517e-03
243 -4.441415505603127e-03
244 -4.330206242883826e-03
245 -4.219573587392301e-03
246 -4.109378741483071e-03
247 -3.999917962979201e-03
248 -3.891012640258272e-03
249 -3.783106411027402e-03
250 -3.675798007866096e-03
251 -3.569633821553856e-03
252 -3.464496103258388e-03
253 -3.360192620167190e-03
254 -3.257211616317062e-03
255 -3.155478224722803e-03
256 -3.054901001596308e-03
257 -2.955598535068774e-03
258 -2.857698150519032e-03
259 -2.761304979221734e-03
260 -2.666360748382136e-03
261 -2.572931105092679e-03
262 -2.480975908659032e-03
263 -2.390672229028491e-03
264 -2.301981811742379e-03
265 -2.215037813560021e-03
266 -2.129750428836313e-03
267 -2.046262955654651e-03
268 -1.964430802275773e-03
269 -1.884446397624664e-03
270 -1.806203460527855e-03
271 -1.729893353369970e-03
272 -1.655320583005337e-03
273 -1.582738786552247e-03
274 -1.511885029416557e-03
275 -1.443041461735466e-03
276 -1.375900461340159e-03
277 -1.310856912732174e-03
278 -1.247380114262856e-03
279 -1.186204883152881e-03
280 -1.126689269663744e-03
281 -1.068455050967581e-03
282 -1.013520022388740e-03
283 -9.592891108521169e-04
284 -9.069404054062480e-04
285 -8.564379420809926e-04
286 -8.081236729920874e-04
287 -7.614673946729495e-04
288 -7.165788660268917e-04
289 -6.732081327790902e-04
290 -6.316044529097936e-04
291 -5.916625148888152e-04
292 -5.535253395139226e-04
293 -5.170197946280047e-04
294 -4.822063006316578e-04
295 -4.488811733969728e-04
296 -4.170888923036170e-04
297 -3.867214105939904e-04
298 -3.578455028268245e-04
299 -3.303453248658040e-04
300 -3.043014698229107e-04
301 -2.796160181433441e-04
302 -2.563093703085422e-04
303 -2.342715794110092e-04
304 -2.135296230579367e-04
305 -1.939486402411108e-04
306 -1.755764587237310e-04
307 -1.582961734171513e-04
308 -1.421348135287156e-04
309 -1.270087347478445e-04
310 -5.272437301928293e-04
314 aff_lp = filtfilt(numerator_lp, denominator, data);
316 % Don't high pass filter it if you don
't want to remove the baseline
317 % fluctuations due to resp, BP? and electrode noise?
318 filtdata = filtfilt(numerator_hp, denominator, aff_lp);
320 % correct for amplitude distortion. !!!??????
321 %mean_s = mean(new_data);
322 %mean_a = mean(aff_hp);
323 %a = aff*(mean_s/mean_a);