32 static const complex<double>
d0_N3_L2[] = {
33 complex<double>(1.41650,1.00829),
34 complex<double>(1.41650,-1.00829),
35 complex<double>(1.86543,0),
38 static const complex<double>
d0_N4_L2[] = {
39 complex<double>(1.13228,1.28114),
40 complex<double>(1.13228,-1.28114),
41 complex<double>(1.78534,0.46763),
42 complex<double>(1.78534,-0.46763),
45 static const complex<double>
d0_N5_L2[] = {
46 complex<double>(0.86430,1.45389),
47 complex<double>(0.86430,-1.45389),
48 complex<double>(1.61433,0.83134),
49 complex<double>(1.61433,-0.83134),
50 complex<double>(1.87504,0),
54 complex<double>(1.40098,1.00236),
55 complex<double>(1.40098,-1.00236),
56 complex<double>(1.85132,0),
60 complex<double>(1.12075,1.27788),
61 complex<double>(1.12075,-1.27788),
62 complex<double>(1.76952,0.46611),
63 complex<double>(1.76952,-0.46611),
67 complex<double>(0.85480,1.43749),
68 complex<double>(0.85480,-1.43749),
69 complex<double>(1.61231,0.82053),
70 complex<double>(1.61231,-0.82053),
71 complex<double>(1.87415,0)
75 complex<double>(1.31553,0.97057),
76 complex<double>(1.31553,-0.97057),
77 complex<double>(1.77635,0),
81 complex<double>(1.04185,1.24034),
82 complex<double>(1.04185,-1.24034),
83 complex<double>(1.69747,0.44790),
84 complex<double>(1.69747,-0.44790),
89 complex<double>(0.77934,1.41423),
90 complex<double>(0.77934,-1.41423),
91 complex<double>(1.50941,0.80828),
92 complex<double>(1.50941,-0.80828),
93 complex<double>(1.77181,0)
97 static const complex<double> d3_N3_Linf[] = {
98 complex<double>(1.22886,0.93058),
99 complex<double>(1.22886,-0.93058),
100 complex<double>(1.70493,0),
104 complex<double>(0.94570,1.21064),
105 complex<double>(0.94570,-1.21064),
106 complex<double>(1.60161,0.42647),
107 complex<double>(1.60161,-0.42647),
111 complex<double>(0.69843,1.37655),
112 complex<double>(0.69843,-1.37655),
113 complex<double>(1.42631,0.77399),
114 complex<double>(1.42631,-0.77399),
115 complex<double>(1.69668,0)
121 void calc_poles(
int taps,
const double scale,
const complex<double> oldpoles[], complex<double> newpoles[])
123 if((taps < 3)||(taps>5))
124 throw "Invalid number of taps in calc_poles";
127 throw "NULL Pointer argument in calc_poles";
129 complex <double> d1_2, d2_2, d3_2, d4_2, d5_2;
142 double q, std, lambda;
144 complex <double> j(0,1), var;
145 complex <double> d1_s, d2_s, d3_s, d4_s, d5_s;
148 d1_s = exp(log(abs(d1_2))/q)*exp(j*arg(d1_2)/q);
149 d2_s = exp(log(abs(d2_2))/q)*exp(j*arg(d2_2)/q);
150 d3_s = exp(log(abs(d3_2))/q)*exp(j*arg(d3_2)/q);
152 d4_s = exp(log(abs(d4_2))/q)*exp(j*arg(d4_2)/q);
156 d5_s = exp(log(abs(d5_2))/q)*exp(j*arg(d5_2)/q);
160 var = d1_s*2.0/(d1_s-1.0)/(d1_s-1.0) + d2_s*2.0/(d2_s-1.0)/(d2_s-1.0) + d3_s*2.0/(d3_s-1.0)/(d3_s-1.0)+d4_s*2.0/(d4_s-1.0)/(d4_s-1.0)+d5_s*2.0/(d5_s-1.0)/(d5_s-1.0);
161 std = sqrt(var.real());
162 while( fabs(scale-std) > tol )
167 d1_s = exp(log(abs(d1_2))/q)*exp(j*arg(d1_2)/q);
168 d2_s = exp(log(abs(d2_2))/q)*exp(j*arg(d2_2)/q);
169 d3_s = exp(log(abs(d3_2))/q)*exp(j*arg(d3_2)/q);
171 d4_s = exp(log(abs(d4_2))/q)*exp(j*arg(d4_2)/q);
175 d5_s = exp(log(abs(d5_2))/q)*exp(j*arg(d5_2)/q);
179 var = d1_s*2.0/(d1_s-1.0)/(d1_s-1.0) + d2_s*2.0/(d2_s-1.0)/(d2_s-1.0) + d3_s*2.0/(d3_s-1.0)/(d3_s-1.0)+d4_s*2.0/(d4_s-1.0)/(d4_s-1.0)+d5_s*2.0/(d5_s-1.0)/(d5_s-1.0);
180 std = sqrt(var.real());
192 void calc_coeffs(
int taps,
const complex<double> poles[],
float *coeffs)
194 if((taps < 3)||(taps>5))
195 throw "Invalid number of taps in calc_coeffs";
198 throw "NULL Pointer argument in calc_coeffs";
200 complex <double> d1_s, d2_s, d3_s, d4_s, d5_s;
216 complex<double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s;
217 coeffs[1] = (float)real(-b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s));
218 coeffs[2] = (float)real(b*(d1_s + d2_s + d3_s));
219 coeffs[3] = (float)real(-b);
222 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3];
226 complex<double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s/d4_s;
227 coeffs[1] = (float)real(-b*(d3_s*d2_s*d1_s + d4_s*d2_s*d1_s + d4_s*d3_s*d1_s + d4_s*d3_s*d2_s));
228 coeffs[2] = (float)real(b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s + d4_s*d1_s + d4_s*d2_s + d4_s*d3_s));
229 coeffs[3] = (float)real(-b*(d1_s + d2_s + d3_s + d4_s));
230 coeffs[4] = (float)real(b);
232 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3] + coeffs[4];
236 complex <double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s/d4_s/d5_s;
237 coeffs[1] = (float)real(-b*(d4_s*d3_s*d2_s*d1_s + d5_s*d3_s*d2_s*d1_s + d5_s*d4_s*d2_s*d1_s + d5_s*d4_s*d3_s*d1_s + d5_s*d4_s*d3_s*d2_s));
238 coeffs[2] = (float)real(b*(d3_s*d2_s*d1_s + d4_s*d2_s*d1_s + d4_s*d3_s*d1_s + d4_s*d3_s*d2_s + d5_s*d2_s*d1_s + d5_s*d3_s*d1_s + d5_s*d3_s*d2_s + d5_s*d4_s*d1_s + d5_s*d4_s*d2_s + d5_s*d4_s*d3_s));
239 coeffs[3] = (float)real(-b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s + d4_s*d1_s + d4_s*d2_s + d4_s*d3_s + d5_s*d1_s + d5_s*d2_s + d5_s*d3_s + d5_s*d4_s));
240 coeffs[4] = (float)real(b*(d1_s + d2_s + d3_s + d4_s + d5_s));
241 coeffs[5] = (float)real(-b);
242 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3] + coeffs[4] + coeffs[5];
251 void calc_coeffs(
int taps,
const complex<double> poles[],
const double s,
float *coeffs)
254 if((taps < 3)||(taps>5))
255 throw "Invalid number of taps in calc_coeffs";
258 throw "NULL Pointer argument in calc_coeffs";
260 complex <double> d1_2, d2_2, d3_2, d4_2, d5_2;
273 double q, std, lambda;
275 complex <double> j(0,1), var;
276 complex <double> d1_s, d2_s, d3_s, d4_s, d5_s;
279 d1_s = exp(log(abs(d1_2))/q)*exp(j*arg(d1_2)/q);
280 d2_s = exp(log(abs(d2_2))/q)*exp(j*arg(d2_2)/q);
281 d3_s = exp(log(abs(d3_2))/q)*exp(j*arg(d3_2)/q);
283 d4_s = exp(log(abs(d4_2))/q)*exp(j*arg(d4_2)/q);
287 d5_s = exp(log(abs(d5_2))/q)*exp(j*arg(d5_2)/q);
291 var = d1_s*2.0/(d1_s-1.0)/(d1_s-1.0) + d2_s*2.0/(d2_s-1.0)/(d2_s-1.0) + d3_s*2.0/(d3_s-1.0)/(d3_s-1.0)+d4_s*2.0/(d4_s-1.0)/(d4_s-1.0)+d5_s*2.0/(d5_s-1.0)/(d5_s-1.0);
292 std = sqrt(var.real());
293 while( fabs(s-std) > tol )
298 d1_s = exp(log(abs(d1_2))/q)*exp(j*arg(d1_2)/q);
299 d2_s = exp(log(abs(d2_2))/q)*exp(j*arg(d2_2)/q);
300 d3_s = exp(log(abs(d3_2))/q)*exp(j*arg(d3_2)/q);
302 d4_s = exp(log(abs(d4_2))/q)*exp(j*arg(d4_2)/q);
306 d5_s = exp(log(abs(d5_2))/q)*exp(j*arg(d5_2)/q);
310 var = d1_s*2.0/(d1_s-1.0)/(d1_s-1.0) + d2_s*2.0/(d2_s-1.0)/(d2_s-1.0) + d3_s*2.0/(d3_s-1.0)/(d3_s-1.0)+d4_s*2.0/(d4_s-1.0)/(d4_s-1.0)+d5_s*2.0/(d5_s-1.0)/(d5_s-1.0);
311 std = sqrt(var.real());
317 complex<double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s;
318 coeffs[1] = (float)real(-b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s));
319 coeffs[2] = (float)real(b*(d1_s + d2_s + d3_s));
320 coeffs[3] = (float)real(-b);
323 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3];
327 complex<double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s/d4_s;
328 coeffs[1] = (float)real(-b*(d3_s*d2_s*d1_s + d4_s*d2_s*d1_s + d4_s*d3_s*d1_s + d4_s*d3_s*d2_s));
329 coeffs[2] = (float)real(b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s + d4_s*d1_s + d4_s*d2_s + d4_s*d3_s));
330 coeffs[3] = (float)real(-b*(d1_s + d2_s + d3_s + d4_s));
331 coeffs[4] = (float)real(b);
333 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3] + coeffs[4];
337 complex <double> b = complex<double>(1.0,0.0)/d1_s/d2_s/d3_s/d4_s/d5_s;
338 coeffs[1] = (float)real(-b*(d4_s*d3_s*d2_s*d1_s + d5_s*d3_s*d2_s*d1_s + d5_s*d4_s*d2_s*d1_s + d5_s*d4_s*d3_s*d1_s + d5_s*d4_s*d3_s*d2_s));
339 coeffs[2] = (float)real(b*(d3_s*d2_s*d1_s + d4_s*d2_s*d1_s + d4_s*d3_s*d1_s + d4_s*d3_s*d2_s + d5_s*d2_s*d1_s + d5_s*d3_s*d1_s + d5_s*d3_s*d2_s + d5_s*d4_s*d1_s + d5_s*d4_s*d2_s + d5_s*d4_s*d3_s));
340 coeffs[3] = (float)real(-b*(d2_s*d1_s + d3_s*d1_s + d3_s*d2_s + d4_s*d1_s + d4_s*d2_s + d4_s*d3_s + d5_s*d1_s + d5_s*d2_s + d5_s*d3_s + d5_s*d4_s));
341 coeffs[4] = (float)real(b*(d1_s + d2_s + d3_s + d4_s + d5_s));
342 coeffs[5] = (float)real(-b);
343 coeffs[0] = 1.0f + coeffs[1] + coeffs[2] + coeffs[3] + coeffs[4] + coeffs[5];
Functions for generic, 3 tap, iir filtering.
void calc_poles(int taps, const double scale, const complex< double > oldpoles[], complex< double > newpoles[])
5 tap second derivative filter with Linf norm approximation
void calc_coeffs(int taps, const complex< double > poles[], float *coeffs)
Compute the coefficients of the filter, given its poles.
const complex< double > d0_N4_L2[]
3 tap gaussian filter with L2 norm approximation
const complex< double > d1_N4_Linf[]
3 tap first derivative filter with Linf norm approximation
const complex< double > d0_N5_Linf[]
4 tap gaussian filter with Linf norm approximation
const complex< double > d0_N4_Linf[]
3 tap gaussian filter with Linf norm approximation
const complex< double > d0_N5_L2[]
4 tap gaussian filter with L2 norm approximation
const complex< double > d0_N3_Linf[]
5 tap gaussian filter with L2 norm approximation
const complex< double > d1_N5_Linf[]
4 tap first derivative filter with Linf norm approximation
const complex< double > d2_N5_Linf[]
4 tap second derivative filter with Linf norm approximation
const complex< double > d2_N4_Linf[]
3 tap second derivative filter with Linf norm approximation
const complex< double > d1_N3_Linf[]
5 tap gaussian filter with Linf norm approximation
const complex< double > d0_N3_L2[]
Coefficients for scale = 2 filters.