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