comparison iirfilter.c @ 9945:12cf93d4b282 libavcodec

Eliminate use of complex.h from iirfilter.c
author alexc
date Fri, 10 Jul 2009 20:45:13 +0000
parents 2cd0d1447bd3
children 0de8fdd06303
comparison
equal deleted inserted replaced
9944:c5ca5e520fe1 9945:12cf93d4b282
23 * @file libavcodec/iirfilter.c 23 * @file libavcodec/iirfilter.c
24 * different IIR filters implementation 24 * different IIR filters implementation
25 */ 25 */
26 26
27 #include "iirfilter.h" 27 #include "iirfilter.h"
28 #include <complex.h>
29 #include <math.h> 28 #include <math.h>
30 29
31 /** 30 /**
32 * IIR filter global parameters 31 * IIR filter global parameters
33 */ 32 */
54 float stopband, float ripple) 53 float stopband, float ripple)
55 { 54 {
56 int i, j, size; 55 int i, j, size;
57 FFIIRFilterCoeffs *c; 56 FFIIRFilterCoeffs *c;
58 double wa; 57 double wa;
59 double complex p[MAXORDER + 1]; 58 double p[MAXORDER + 1][2];
60 59
61 if(filt_type != FF_FILTER_TYPE_BUTTERWORTH || filt_mode != FF_FILTER_MODE_LOWPASS) 60 if(filt_type != FF_FILTER_TYPE_BUTTERWORTH || filt_mode != FF_FILTER_MODE_LOWPASS)
62 return NULL; 61 return NULL;
63 if(order <= 1 || (order & 1) || order > MAXORDER || cutoff_ratio >= 1.0) 62 if(order <= 1 || (order & 1) || order > MAXORDER || cutoff_ratio >= 1.0)
64 return NULL; 63 return NULL;
72 71
73 c->cx[0] = 1; 72 c->cx[0] = 1;
74 for(i = 1; i < (order >> 1) + 1; i++) 73 for(i = 1; i < (order >> 1) + 1; i++)
75 c->cx[i] = c->cx[i - 1] * (order - i + 1LL) / i; 74 c->cx[i] = c->cx[i - 1] * (order - i + 1LL) / i;
76 75
77 p[0] = 1.0; 76 p[0][0] = 1.0;
77 p[0][1] = 0.0;
78 for(i = 1; i <= order; i++) 78 for(i = 1; i <= order; i++)
79 p[i] = 0.0; 79 p[i][0] = p[i][1] = 0.0;
80 for(i = 0; i < order; i++){ 80 for(i = 0; i < order; i++){
81 double complex zp; 81 double zp[2];
82 double th = (i + (order >> 1) + 0.5) * M_PI / order; 82 double th = (i + (order >> 1) + 0.5) * M_PI / order;
83 zp = cexp(I*th) * wa; 83 double a_re, a_im, c_re, c_im;
84 zp = (zp + 2.0) / (zp - 2.0); 84 zp[0] = cos(th) * wa;
85 zp[1] = sin(th) * wa;
86 a_re = zp[0] + 2.0;
87 c_re = zp[0] - 2.0;
88 a_im =
89 c_im = zp[1];
90 zp[0] = (a_re * c_re + a_im * c_im) / (c_re * c_re + c_im * c_im);
91 zp[1] = (a_im * c_re - a_re * c_im) / (c_re * c_re + c_im * c_im);
85 92
86 for(j = order; j >= 1; j--) 93 for(j = order; j >= 1; j--)
87 p[j] = zp*p[j] + p[j - 1]; 94 {
88 p[0] *= zp; 95 a_re = p[j][0];
96 a_im = p[j][1];
97 p[j][0] = a_re*zp[0] - a_im*zp[1] + p[j-1][0];
98 p[j][1] = a_re*zp[1] + a_im*zp[0] + p[j-1][1];
99 }
100 a_re = p[0][0]*zp[0] - p[0][1]*zp[1];
101 p[0][1] = p[0][0]*zp[1] + p[0][1]*zp[0];
102 p[0][0] = a_re;
89 } 103 }
90 c->gain = creal(p[order]); 104 c->gain = p[order][0];
91 for(i = 0; i < order; i++){ 105 for(i = 0; i < order; i++){
92 c->gain += creal(p[i]); 106 c->gain += p[i][0];
93 c->cy[i] = creal(-p[i] / p[order]); 107 c->cy[i] = (-p[i][0] * p[order][0] + -p[i][1] * p[order][1]) /
108 (p[order][0] * p[order][0] + p[order][1] * p[order][1]);
94 } 109 }
95 c->gain /= 1 << order; 110 c->gain /= 1 << order;
96 111
97 return c; 112 return c;
98 } 113 }