annotate filter/gamma_tone.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 Copyright (c) Applied Psychology Unit, Medical Research Council. 1988, 1989
tomwalters@0 3 ===========================================================================
tomwalters@0 4
tomwalters@0 5 Permission to use, copy, modify, and distribute this software without fee
tomwalters@0 6 is hereby granted for research purposes, provided that this copyright
tomwalters@0 7 notice appears in all copies and in all supporting documentation, and that
tomwalters@0 8 the software is not redistributed for any fee (except for a nominal shipping
tomwalters@0 9 charge). Anyone wanting to incorporate all or part of this software in a
tomwalters@0 10 commercial product must obtain a license from the Medical Research Council.
tomwalters@0 11
tomwalters@0 12 The MRC makes no representations about the suitability of this
tomwalters@0 13 software for any purpose. It is provided "as is" without express or implied
tomwalters@0 14 warranty.
tomwalters@0 15
tomwalters@0 16 THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
tomwalters@0 17 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE
tomwalters@0 18 A.P.U. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
tomwalters@0 19 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
tomwalters@0 20 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
tomwalters@0 21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
tomwalters@0 22 */
tomwalters@0 23
tomwalters@0 24 /*
tomwalters@0 25
tomwalters@0 26 ====================================================================
tomwalters@0 27 gamma_tone.c - backward compatable interface to new filter release
tomwalters@0 28 ====================================================================
tomwalters@0 29
tomwalters@0 30 J. Holdsworth - 28th January 1989.
tomwalters@0 31
tomwalters@0 32
tomwalters@0 33 Copywright (c) Applied Psychology Unit, Medical Research Council. 1989.
tomwalters@0 34 =======================================================================
tomwalters@0 35
tomwalters@0 36
tomwalters@0 37 Release 2: 5th July 1988.
tomwalters@0 38 Release 3: 20th September 1988.
tomwalters@0 39 Release 4: 28th January 1989.
tomwalters@0 40
tomwalters@0 41 */
tomwalters@0 42
tomwalters@0 43 #include <math.h>
tomwalters@0 44
tomwalters@0 45 #ifndef _STITCH_H_
tomwalters@0 46 #include "stitch.h"
tomwalters@0 47 #endif
tomwalters@0 48 #ifndef _GAMMA_TONE_H_
tomwalters@0 49 #include "gamma_tone.h"
tomwalters@0 50 #endif
tomwalters@0 51 #ifndef _FORMULAE_H_
tomwalters@0 52 #include "formulae.h"
tomwalters@0 53 #endif
tomwalters@0 54 #ifndef _RECURSE_H_
tomwalters@0 55 #include "recurse.h"
tomwalters@0 56 #endif
tomwalters@0 57 #ifndef _SCALES_H_
tomwalters@0 58 #include "scales.h"
tomwalters@0 59 #endif
tomwalters@0 60 #ifndef _PHASE_H_
tomwalters@0 61 #include "phase.h"
tomwalters@0 62 #endif
tomwalters@0 63
tomwalters@0 64 /* identify object file */
tomwalters@0 65
tomwalters@0 66 #ifndef lint
tomwalters@0 67 static char *gt_object_ident = GT_IDENT_STRING ;
tomwalters@0 68 #endif
tomwalters@0 69
tomwalters@0 70
tomwalters@0 71 /* base center frequency */
tomwalters@0 72
tomwalters@0 73 #define Pi ( 3.1415926535 )
tomwalters@0 74 #define TwoPi ( 2*Pi )
tomwalters@0 75
tomwalters@0 76 double bankBaseFrequency = 1000. ;
tomwalters@0 77 double filterDefaultGain = 4. ;
tomwalters@0 78 int filterDefaultInputBits = bits_significant ;
tomwalters@0 79
tomwalters@0 80
tomwalters@0 81 /* generate array of filter center frequencies between the frequencies specified */
tomwalters@0 82
tomwalters@0 83 double *GenerateCenterFrequencies( min_cf, max_cf, erb_density )
tomwalters@0 84 double min_cf, max_cf, erb_density ;
tomwalters@0 85 {
tomwalters@0 86 return ( GenerateScale( ErbScale( min_cf ), ErbScale( max_cf ), erb_density, ErbScale( bankBaseFrequency ), FofErbScale ) ) ;
tomwalters@0 87 }
tomwalters@0 88
tomwalters@0 89 int NumberCenterFrequencies( min_cf, max_cf, erb_density )
tomwalters@0 90 double min_cf, max_cf, erb_density ;
tomwalters@0 91 {
tomwalters@0 92 return ( NumberOnScale( ErbScale( min_cf ), ErbScale( max_cf ), erb_density, ErbScale( bankBaseFrequency ) ) ) ;
tomwalters@0 93 }
tomwalters@0 94
tomwalters@0 95 double *NumberedCenterFrequencies( min_cf, max_cf, channels )
tomwalters@0 96 double min_cf, max_cf ;
tomwalters@0 97 int channels ;
tomwalters@0 98 {
tomwalters@0 99 return ( NumberedScale( ErbScale( min_cf ), ErbScale( max_cf ), channels, FofErbScale ) ) ;
tomwalters@0 100 }
tomwalters@0 101
tomwalters@0 102 /* initialise gamma tone filter code */
tomwalters@0 103
tomwalters@0 104 FilterBankInfo *InitGammaToneFilterBank( samplerate, order, b_scalar, phase_comp, min_filter_cf )
tomwalters@0 105 double samplerate ;
tomwalters@0 106 int order ;
tomwalters@0 107 double b_scalar ;
tomwalters@0 108 int phase_comp ;
tomwalters@0 109 double min_filter_cf ;
tomwalters@0 110 {
tomwalters@0 111 DeclareNew( FilterBankInfo *, filter_info ) ;
tomwalters@0 112 extern int n_using_sin_table ;
tomwalters@0 113
tomwalters@0 114 filter_info->samplerate = samplerate ;
tomwalters@0 115 filter_info->order = order ;
tomwalters@0 116 filter_info->b_scalar = b_scalar ;
tomwalters@0 117 filter_info->phase_comp = phase_comp ;
tomwalters@0 118
tomwalters@0 119 /* store maximum required time shift for whole filter bank */
tomwalters@0 120 /* originally time advance was implemented as delay of */
tomwalters@0 121 /* maximum advance minus desired advance (still supported) */
tomwalters@0 122
tomwalters@0 123 if( filter_info->phase_comp >= 0 )
tomwalters@0 124 filter_info->max_desired_advance_time = 1. / min_filter_cf * filter_info->phase_comp ;
tomwalters@0 125 else
tomwalters@0 126 filter_info->max_desired_advance_time = ( filter_info->order - 1. ) / ( TwoPi * filter_info->b_scalar * Erb( min_filter_cf ) ) ;
tomwalters@0 127
tomwalters@0 128 return ( filter_info ) ;
tomwalters@0 129 }
tomwalters@0 130
tomwalters@0 131 FilterChannelInfo *InitGammaToneFilterChannel( filter_info, cf )
tomwalters@0 132 FilterBankInfo *filter_info ;
tomwalters@0 133 double cf ;
tomwalters@0 134 {
tomwalters@0 135 RecursiveFilterState *filter_state ;
tomwalters@0 136 double sample_delay ;
tomwalters@0 137
tomwalters@0 138 if( filter_info->phase_comp > 0 || filter_info->phase_comp == ENVELOPE_ALIGNMENT || filter_info->phase_comp == FINE_ALIGNMENT )
tomwalters@0 139 sample_delay = filter_info->max_desired_advance_time * filter_info->samplerate ;
tomwalters@0 140 else
tomwalters@0 141 sample_delay = 0. ;
tomwalters@0 142
tomwalters@0 143 filter_state = NewRecursiveFilter(
tomwalters@0 144 filter_info->samplerate,
tomwalters@0 145 cf,
tomwalters@0 146 Erb( cf ) * filter_info->b_scalar,
tomwalters@0 147 filterDefaultGain,
tomwalters@0 148 filter_info->order,
tomwalters@0 149 filter_info->phase_comp,
tomwalters@0 150 filterDefaultInputBits,
tomwalters@0 151 & sample_delay ) ;
tomwalters@0 152
tomwalters@0 153 return( ( FilterChannelInfo * ) NewPhaseCompensator(
tomwalters@0 154 ( FilterState ) filter_state,
tomwalters@0 155 ( FilterModule ) 0,
tomwalters@0 156 sample_delay ) ) ;
tomwalters@0 157 }
tomwalters@0 158
tomwalters@0 159 /* end processing of channel - free state varibales */
tomwalters@0 160
tomwalters@0 161 void EndChannel( channel_info )
tomwalters@0 162 FilterChannelInfo *channel_info ;
tomwalters@0 163 {
tomwalters@0 164 FreeCompensatedFilter( ( PhaseCompensatorState * ) channel_info ) ;
tomwalters@0 165
tomwalters@0 166 return ;
tomwalters@0 167 }
tomwalters@0 168
tomwalters@0 169 /* free up filter state variables and sin table if finished with it */
tomwalters@0 170
tomwalters@0 171 void EndFilter( filter_info )
tomwalters@0 172 FilterBankInfo *filter_info ;
tomwalters@0 173 {
tomwalters@0 174 Delete( filter_info ) ;
tomwalters@0 175
tomwalters@0 176 return ;
tomwalters@0 177 }
tomwalters@0 178