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