annotate 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
rev   line source
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