comparison filter_templates.h @ 371:1b463ef9bcc2

More work from Frank.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 25 Jun 2002 17:15:03 +0000
parents eda146d666d1
children 24a610dfbbfd
comparison
equal deleted inserted replaced
370:12023d47b716 371:1b463ef9bcc2
96 out+= 936 * sum_h( inp, 13); 96 out+= 936 * sum_h( inp, 13);
97 out-= 1295 * sum_h( inp, 11); 97 out-= 1295 * sum_h( inp, 11);
98 out+= 1800 * sum_h( inp, 9); 98 out+= 1800 * sum_h( inp, 9);
99 out-= 2560 * sum_h( inp, 7); 99 out-= 2560 * sum_h( inp, 7);
100 out+= 3863 * sum_h( inp, 5); 100 out+= 3863 * sum_h( inp, 5);
101 out-= 6764 * sum_h( inp, 3);
101 out+= 20798 * sum_h( inp, 1); 102 out+= 20798 * sum_h( inp, 1);
102 out+= 32770 * (int)inp[0]; 103 out+= 32770 * (int)inp[0];
103 104
104 outp[0] = out >> 16; 105 outp[0] = out >> 16;
105 106
109 return outp; 110 return outp;
110 } 111 }
111 112
112 /*-------------------------------------------------------------------------*/ 113 /*-------------------------------------------------------------------------*/
113 static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length, 114 static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length,
114 VarFilter* filt, int* cpos ) 115 VarFilter* filter, int* cpos )
115 { 116 {
116 const static int fsize = CH(2*_fsize); 117 const static int fsize = CH(2*_fsize);
117 Sint16 *filter; 118 Sint16 *f;
118 int out; 119 int out;
119 int i, pos; 120 int i, pos;
120 Sint16* to; 121 Sint16* to;
121 122
122 inp -= fsize; 123 inp -= fsize;
123 to = inp - length; 124 to = inp - length;
125 pos = *cpos;
124 126
125 while( inp > to ) 127 while( inp > to )
126 { 128 {
127 pos = *cpos;
128 out = 0; 129 out = 0;
129 filter = filt->c[pos]; 130 f = filter->c[pos];
130 for( i = 0; i < 4*_fsize; i++ ) 131 for( i = _fsize + 1; --i; inp+=CH(4), f+=4 )
131 out+= filter[i] * (int)inp[CH(i)]; 132 {
133 out+= f[0] * (int)inp[CH(0)];
134 out+= f[1] * (int)inp[CH(1)];
135 out+= f[2] * (int)inp[CH(2)];
136 out+= f[3] * (int)inp[CH(3)];
137 }
132 outp[0] = out >> 16; 138 outp[0] = out >> 16;
133 139
134 inp -= CH(filt->incr[pos]); 140 pos = ( pos + filter->denominator - 1 ) % filter->denominator;
141 inp -= CH( 4 * _fsize );
142 inp -= CH( filter->incr[pos] );
135 outp -= CH(1); 143 outp -= CH(1);
136 *cpos = ( pos + 1 ) % filt->denominator;
137 } 144 }
145
146 *cpos = pos;
138 return outp; 147 return outp;
139 } 148 }
140 149
141 /*-------------------------------------------------------------------------*/ 150 /*-------------------------------------------------------------------------*/
142 static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length, 151 static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length,
143 VarFilter* filt, int* cpos ) 152 VarFilter* filter, int* cpos )
144 { 153 {
145 const static int fsize = CH(2*_fsize); 154 const static int fsize = CH(2*_fsize);
146 Sint16 *filter; 155 Sint16 *f;
147 int out; 156 int out;
148 int i, pos; 157 int i, pos;
149 Sint16 *to; 158 Sint16 *to;
150 159
151 inp -= fsize; 160 inp -= fsize;
152 to = inp + length; 161 to = inp + length;
162 pos = *cpos;
153 163
154 while( inp < to ) 164 while( inp < to )
155 { 165 {
156 pos = *cpos;
157 out = 0; 166 out = 0;
158 filter = filt->c[pos]; 167 f = filter->c[pos];
159 for( i = 0; i < 4*_fsize; i++ ) 168 for( i = _fsize + 1; --i; inp+=CH(4), f+=4 )
160 out+= filter[i] * inp[CH(i)]; 169 {
170 out+= f[0] * (int)inp[CH(0)];
171 out+= f[1] * (int)inp[CH(1)];
172 out+= f[2] * (int)inp[CH(2)];
173 out+= f[3] * (int)inp[CH(3)];
174 }
161 outp[0] = out >> 16; 175 outp[0] = out >> 16;
162 176
163 inp += CH(filt->incr[pos]); 177 inp -= CH( 4 * _fsize );
178 inp += CH( filter->incr[pos] );
164 outp += CH(1); 179 outp += CH(1);
165 *cpos = ( pos + 1 ) % filt->denominator; 180 pos = ( pos + 1 ) % filter->denominator;
166 } 181 }
182
183 *cpos = pos;
167 return outp; 184 return outp;
168 } 185 }
169 186
170 /*-------------------------------------------------------------------------*/ 187 /*-------------------------------------------------------------------------*/
171 #undef sum_d 188 #undef sum_d