Mercurial > hg > aim92
comparison tools/freqs.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:5242703e91d3 |
---|---|
1 /************************************************************************** | |
2 | |
3 Filter-bank routines. | |
4 ====================== | |
5 | |
6 Filter-bank parameters in model headers are as follows: | |
7 (These may be converted, using the given routines, into values which are then | |
8 passed as args into the routines below. All the values are double except for | |
9 the number of channels which is an int. Remember to cast Freq as double). | |
10 | |
11 String name Conversion Value Comment | |
12 ------------- ----------- --------- ------------------------------------- | |
13 channels_afb Optionint() channels Number of channels in filter | |
14 mincf_afb Freq() mincf Minimum center frequency (Hz) | |
15 maxcf_afb Freq() maxcf Maximum center frequency (Hz) | |
16 dencf_afb atof() dencf Filter density (filters/critical band) | |
17 bwmin_afb Freq() bwmin Minimum filter bandwith | |
18 quality_afb Freq() quality Ultimate qualtity factor of filters | |
19 | |
20 | |
21 | |
22 Initialize global filter parameters. | |
23 | |
24 SetErbParameters( bwmin, quality ) | |
25 double bwmin, quality ; | |
26 | |
27 Return array of centre frequencies for given density. | |
28 | |
29 double *GenerateCenterFrequencies( mincf, maxcf, dencf ) | |
30 double mincf, maxcf, dencf ; | |
31 | |
32 (This uses routine GenerateScale() to compute the scale, and uses | |
33 routine ErbScale() to convert the parameters (mincf etc) into Erbs). | |
34 | |
35 Return array of centre frequencies for given number of channels. | |
36 | |
37 double *NumberedCenterFrequencies( mincf, maxcf, channels ) | |
38 double mincf, maxcf ; | |
39 int channels ; | |
40 | |
41 (This uses routine NumberedScale() to compute the scale, and uses | |
42 routine ErbScale() to convert the parameters (mincf etc) into Erbs). | |
43 | |
44 Return number of channels for given density. | |
45 | |
46 int NumberCenterFrequencies( mincf, maxcf, dencf ) | |
47 double mincf, maxcf, dencf ; | |
48 | |
49 Basic utilities: | |
50 | |
51 ErbScale() Convert freq in Hz to Erbs. | |
52 | |
53 | |
54 Example of application | |
55 ---------------------- | |
56 | |
57 #include "freqs.c" | |
58 | |
59 int channels = 0 ; | |
60 double mincf = 220. ; | |
61 double maxcf = 4400. ; | |
62 double dencf = 4. ; | |
63 double bwmin = 24.7 ; | |
64 double quality = 9.265 ; | |
65 | |
66 SetErbParameters( bwmin, quality ) ; | |
67 | |
68 if (channels==0) { | |
69 frequencies = GenerateCenterFrequencies( mincf, maxcf, dencf ) ; | |
70 channels = NumberCenterFrequencies( mincf, maxcf, dencf ) ; | |
71 } | |
72 else | |
73 frequencies = NumberedCenterFrequencies( mincf, maxcf, channels ) ; | |
74 | |
75 | |
76 **************************************************************************/ | |
77 | |
78 extern void SetErbParameters() ; | |
79 | |
80 extern double Erb(), ErbScale(), FofErbScale() ; | |
81 | |
82 extern double *GenerateCenterFrequencies() ; | |
83 extern int NumberCenterFrequencies() ; | |
84 extern double *NumberedCenterFrequencies() ; | |
85 extern double *GenerateScale() ; | |
86 extern int NumberOnScale() ; | |
87 extern double *NumberedScale() ; | |
88 | |
89 /* Defaults */ | |
90 | |
91 static double limit = 24.7 ; | |
92 static double Q = 9.265 ; | |
93 | |
94 /********************** filter/gamma_tone.c *******************************/ | |
95 | |
96 double bankBaseFrequency = 1000. ; | |
97 | |
98 double *GenerateCenterFrequencies( min_cf, max_cf, erb_density ) | |
99 double min_cf, max_cf, erb_density ; | |
100 { | |
101 return ( GenerateScale( ErbScale( min_cf ), ErbScale( max_cf ), erb_density, ErbScale( bankBaseFrequency ), FofErbScale ) ) ; | |
102 } | |
103 | |
104 int NumberCenterFrequencies( min_cf, max_cf, erb_density ) | |
105 double min_cf, max_cf, erb_density ; | |
106 { | |
107 return ( NumberOnScale( ErbScale( min_cf ), ErbScale( max_cf ), erb_density, ErbScale( bankBaseFrequency ) ) ) ; | |
108 } | |
109 | |
110 double *NumberedCenterFrequencies( min_cf, max_cf, channels ) | |
111 double min_cf, max_cf ; | |
112 int channels ; | |
113 { | |
114 return ( NumberedScale( ErbScale( min_cf ), ErbScale( max_cf ), channels, FofErbScale ) ) ; | |
115 } | |
116 | |
117 | |
118 /********************** filter/scales.c ************************************/ | |
119 | |
120 double *GenerateScale( min, max, density, base, inverse ) | |
121 double min, max, density, base, (*inverse)() ; | |
122 { | |
123 unsigned n_scale = NumberOnScale( min, max, density, base ) ; | |
124 double *scale ; | |
125 double scale_start ; | |
126 int i ; | |
127 | |
128 scale = (double *)malloc( (n_scale+1) * sizeof(double) ) ; | |
129 | |
130 if( min != max ) { | |
131 | |
132 scale_start = base - floor( ( base - min ) * density ) / density ; | |
133 | |
134 /* fill array scale points 1./density apart */ | |
135 | |
136 for( i=0 ; i < n_scale ; i++ ) | |
137 scale[ i ] = scale_start + i / density ; | |
138 | |
139 scale[ i++ ] = 0. ; | |
140 } | |
141 else { | |
142 scale[0] = min ; | |
143 scale[1] = 0. ; | |
144 } | |
145 | |
146 /* convert scale space back to units required */ | |
147 | |
148 if( inverse != (double ( * )()) 0 ) | |
149 for( i=0 ; i < n_scale ; i++ ) | |
150 scale[ i ] = inverse( scale[ i ] ) ; | |
151 | |
152 return ( scale ) ; | |
153 } | |
154 | |
155 int NumberOnScale( min, max, density, base ) | |
156 double min, max, density, base ; | |
157 { | |
158 if( min != max ) | |
159 return ( ( int ) ( ( floor( ( base - min ) * density ) + 1. + ( floor( ( max - base ) * density ) ) ) ) ) ; | |
160 else | |
161 return ( 1 ) ; | |
162 } | |
163 | |
164 | |
165 double *NumberedScale( min, max, channels, inverse ) | |
166 double min, max ; | |
167 int channels ; | |
168 double (*inverse)() ; | |
169 { | |
170 double *scale ; | |
171 int chan ; | |
172 | |
173 scale = (double *)malloc( (channels+1) * sizeof(double) ) ; | |
174 | |
175 scale[ 0 ] = min ; | |
176 for( chan=1 ; chan < channels ; chan++ ) | |
177 scale[ chan ] = min + chan * (max-min) / ( channels - 1 ) ; | |
178 | |
179 if( inverse != (double ( * )()) 0 ) | |
180 for( chan=0 ; chan < channels ; chan++ ) | |
181 scale[ chan ] = inverse( scale[ chan ] ) ; | |
182 | |
183 scale[ channels ] = 0. ; | |
184 | |
185 return ( scale ) ; | |
186 } | |
187 | |
188 /********************** filter/formulae.c ************************************/ | |
189 | |
190 | |
191 void SetErbParameters( new_limit, new_Q ) | |
192 double new_limit, new_Q ; | |
193 { | |
194 limit = new_limit ; | |
195 Q = new_Q ; | |
196 | |
197 return ; | |
198 } | |
199 | |
200 double ErbScale( frequency ) | |
201 double frequency ; | |
202 { | |
203 return ( log( 1. + frequency / Q / limit ) * Q ) ; | |
204 } | |
205 | |
206 double FofErbScale( E ) | |
207 double E ; | |
208 { | |
209 return ( ( exp( E / Q ) - 1 ) * Q * limit ) ; | |
210 } | |
211 | |
212 | |
213 |