Skip to content

Latest commit

 

History

History
192 lines (169 loc) · 5.57 KB

filter_templates.h

File metadata and controls

192 lines (169 loc) · 5.57 KB
 
Jun 18, 2002
Jun 18, 2002
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
/*
* Extended Audio Converter for SDL (Simple DirectMedia Layer)
* Copyright (C) 2002 Frank Ranostaj
* Institute of Applied Physik
* Johann Wolfgang Goethe-Universität
* Frankfurt am Main, Germany
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Frank Ranostaj
* ranostaj@stud.uni-frankfurt.de
*
* (This code blatantly abducted for SDL_sound. Thanks, Frank! --ryan.)
*/
#ifndef Suffix
#error include filter_template.h with defined Suffix macro!
#else
#define CH(x) (Suffix((x)*))
/*-------------------------------------------------------------------------*/
Jun 21, 2002
Jun 21, 2002
34
35
36
/* this filter (Kaiser-window beta=6.8) gives a decent -80dB attentuation */
/*-------------------------------------------------------------------------*/
#define sum_d(v,dx) ((int) v[CH(dx)] + v[CH(1-dx)])
Jun 18, 2002
Jun 18, 2002
37
38
static Sint16* Suffix(doubleRate)( Sint16 *outp, Sint16 *inp, int length,
VarFilter* filt, int* cpos )
May 20, 2002
May 20, 2002
39
{
Jun 21, 2002
Jun 21, 2002
40
41
int out;
Sint16 *to;
Jun 12, 2002
Jun 12, 2002
42
Jun 21, 2002
Jun 21, 2002
43
to = inp - length;
Jun 12, 2002
Jun 12, 2002
44
Jun 21, 2002
Jun 21, 2002
45
while( inp > to )
Jun 12, 2002
Jun 12, 2002
46
{
Jun 21, 2002
Jun 21, 2002
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
out = 0;
out-= 9 * sum_d( inp, 16);
out+= 23 * sum_d( inp, 15);
out-= 46 * sum_d( inp, 14);
out+= 83 * sum_d( inp, 13);
out-= 138 * sum_d( inp, 12);
out+= 217 * sum_d( inp, 11);
out-= 326 * sum_d( inp, 10);
out+= 474 * sum_d( inp, 9);
out-= 671 * sum_d( inp, 8);
out+= 936 * sum_d( inp, 7);
out-= 1295 * sum_d( inp, 6);
out+= 1800 * sum_d( inp, 5);
out-= 2560 * sum_d( inp, 4);
out+= 3863 * sum_d( inp, 3);
out-= 6764 * sum_d( inp, 2);
out+= 20798 * sum_d( inp, 1);
Jun 12, 2002
Jun 12, 2002
64
Jun 18, 2002
Jun 18, 2002
65
66
outp[CH(1)] = ( 32770 * inp[CH(1)] + out) >> 16;
outp[CH(0)] = ( 32770 * inp[CH(0)] + out) >> 16;
Jun 21, 2002
Jun 21, 2002
67
68
inp -= CH(1);
Jun 18, 2002
Jun 18, 2002
69
outp -= CH(2);
Jun 12, 2002
Jun 12, 2002
70
}
Jun 18, 2002
Jun 18, 2002
71
return outp;
May 20, 2002
May 20, 2002
72
73
}
Jun 18, 2002
Jun 18, 2002
74
/*-------------------------------------------------------------------------*/
Jun 21, 2002
Jun 21, 2002
75
#define sum_h(v,dx) ((int) v[CH(dx)] + v[CH(-dx)])
Jun 18, 2002
Jun 18, 2002
76
77
static Sint16* Suffix(halfRate)( Sint16 *outp, Sint16 *inp, int length,
VarFilter* filt, int* cpos )
May 20, 2002
May 20, 2002
78
{
Jun 21, 2002
Jun 21, 2002
79
int out;
Jun 18, 2002
Jun 18, 2002
80
Sint16* to;
Jun 12, 2002
Jun 12, 2002
81
Jun 18, 2002
Jun 18, 2002
82
to = inp + length;
Jun 12, 2002
Jun 12, 2002
83
Jun 21, 2002
Jun 21, 2002
84
while( inp < to )
Jun 12, 2002
Jun 12, 2002
85
{
Jun 21, 2002
Jun 21, 2002
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
out = 0;
out-= 9 * sum_h( inp, 31);
out+= 23 * sum_h( inp, 29);
out-= 46 * sum_h( inp, 27);
out+= 83 * sum_h( inp, 25);
out-= 138 * sum_h( inp, 23);
out+= 217 * sum_h( inp, 21);
out-= 326 * sum_h( inp, 19);
out+= 474 * sum_h( inp, 17);
out-= 671 * sum_h( inp, 15);
out+= 936 * sum_h( inp, 13);
out-= 1295 * sum_h( inp, 11);
out+= 1800 * sum_h( inp, 9);
out-= 2560 * sum_h( inp, 7);
out+= 3863 * sum_h( inp, 5);
Jun 25, 2002
Jun 25, 2002
101
out-= 6764 * sum_h( inp, 3);
Jun 21, 2002
Jun 21, 2002
102
103
104
out+= 20798 * sum_h( inp, 1);
out+= 32770 * (int)inp[0];
Jun 18, 2002
Jun 18, 2002
105
outp[0] = out >> 16;
Jun 12, 2002
Jun 12, 2002
106
Jun 21, 2002
Jun 21, 2002
107
inp+= CH(2);
Jun 18, 2002
Jun 18, 2002
108
outp += CH(1);
Jun 12, 2002
Jun 12, 2002
109
}
Jun 18, 2002
Jun 18, 2002
110
return outp;
May 20, 2002
May 20, 2002
111
112
}
Jun 18, 2002
Jun 18, 2002
113
114
/*-------------------------------------------------------------------------*/
static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length,
Jun 25, 2002
Jun 25, 2002
115
VarFilter* filter, int* cpos )
May 20, 2002
May 20, 2002
116
{
Jun 21, 2002
Jun 21, 2002
117
const static int fsize = CH(2*_fsize);
Jun 25, 2002
Jun 25, 2002
118
Sint16 *f;
Jun 18, 2002
Jun 18, 2002
119
120
121
int out;
int i, pos;
Sint16* to;
Jun 12, 2002
Jun 12, 2002
122
Jun 21, 2002
Jun 21, 2002
123
124
inp -= fsize;
to = inp - length;
Jun 25, 2002
Jun 25, 2002
125
pos = *cpos;
May 20, 2002
May 20, 2002
126
Jun 18, 2002
Jun 18, 2002
127
while( inp > to )
Jun 12, 2002
Jun 12, 2002
128
{
Jun 18, 2002
Jun 18, 2002
129
out = 0;
Jun 25, 2002
Jun 25, 2002
130
131
132
133
134
135
136
137
f = filter->c[pos];
for( i = _fsize + 1; --i; inp+=CH(4), f+=4 )
{
out+= f[0] * (int)inp[CH(0)];
out+= f[1] * (int)inp[CH(1)];
out+= f[2] * (int)inp[CH(2)];
out+= f[3] * (int)inp[CH(3)];
}
Jun 18, 2002
Jun 18, 2002
138
outp[0] = out >> 16;
May 20, 2002
May 20, 2002
139
Jun 25, 2002
Jun 25, 2002
140
141
142
pos = ( pos + filter->denominator - 1 ) % filter->denominator;
inp -= CH( 4 * _fsize );
inp -= CH( filter->incr[pos] );
Jun 18, 2002
Jun 18, 2002
143
outp -= CH(1);
Jun 12, 2002
Jun 12, 2002
144
}
Jun 25, 2002
Jun 25, 2002
145
146
*cpos = pos;
Jun 18, 2002
Jun 18, 2002
147
return outp;
May 20, 2002
May 20, 2002
148
149
}
Jun 18, 2002
Jun 18, 2002
150
151
/*-------------------------------------------------------------------------*/
static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length,
Jun 25, 2002
Jun 25, 2002
152
VarFilter* filter, int* cpos )
May 20, 2002
May 20, 2002
153
{
Jun 21, 2002
Jun 21, 2002
154
const static int fsize = CH(2*_fsize);
Jun 25, 2002
Jun 25, 2002
155
Sint16 *f;
Jun 18, 2002
Jun 18, 2002
156
157
158
int out;
int i, pos;
Sint16 *to;
Jun 12, 2002
Jun 12, 2002
159
Jun 18, 2002
Jun 18, 2002
160
161
inp -= fsize;
to = inp + length;
Jun 25, 2002
Jun 25, 2002
162
pos = *cpos;
Jun 12, 2002
Jun 12, 2002
163
Jun 18, 2002
Jun 18, 2002
164
while( inp < to )
Jun 12, 2002
Jun 12, 2002
165
{
Jun 18, 2002
Jun 18, 2002
166
out = 0;
Jun 25, 2002
Jun 25, 2002
167
168
169
170
171
172
173
174
f = filter->c[pos];
for( i = _fsize + 1; --i; inp+=CH(4), f+=4 )
{
out+= f[0] * (int)inp[CH(0)];
out+= f[1] * (int)inp[CH(1)];
out+= f[2] * (int)inp[CH(2)];
out+= f[3] * (int)inp[CH(3)];
}
Jun 18, 2002
Jun 18, 2002
175
176
outp[0] = out >> 16;
Jun 25, 2002
Jun 25, 2002
177
178
inp -= CH( 4 * _fsize );
inp += CH( filter->incr[pos] );
Jun 18, 2002
Jun 18, 2002
179
outp += CH(1);
Jun 25, 2002
Jun 25, 2002
180
pos = ( pos + 1 ) % filter->denominator;
Jun 12, 2002
Jun 12, 2002
181
}
Jun 25, 2002
Jun 25, 2002
182
183
*cpos = pos;
Jun 18, 2002
Jun 18, 2002
184
return outp;
May 20, 2002
May 20, 2002
185
}
Jun 18, 2002
Jun 18, 2002
186
187
/*-------------------------------------------------------------------------*/
Jun 21, 2002
Jun 21, 2002
188
189
#undef sum_d
#undef sum_h
May 20, 2002
May 20, 2002
190
191
#undef CH
#endif /* Suffix */