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
|