flatmax@632
|
1
|
flatmax@593
|
2 // Author Matt Flax <flatmax@>
|
flatmax@592
|
3 //
|
flatmax@592
|
4 // This C++ file is part of an implementation of Lyon's cochlear model:
|
flatmax@592
|
5 // "Cascade of Asymmetric Resonators with Fast-Acting Compression"
|
flatmax@592
|
6 // to supplement Lyon's upcoming book "Human and Machine Hearing"
|
flatmax@592
|
7 //
|
flatmax@592
|
8 // Licensed under the Apache License, Version 2.0 (the "License");
|
flatmax@592
|
9 // you may not use this file except in compliance with the License.
|
flatmax@592
|
10 // You may obtain a copy of the License at
|
flatmax@592
|
11 //
|
flatmax@592
|
12 // http://www.apache.org/licenses/LICENSE-2.0
|
flatmax@592
|
13 //
|
flatmax@592
|
14 // Unless required by applicable law or agreed to in writing, software
|
flatmax@592
|
15 // distributed under the License is distributed on an "AS IS" BASIS,
|
flatmax@592
|
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
flatmax@592
|
17 // See the License for the specific language governing permissions and
|
flatmax@592
|
18 // limitations under the License.
|
flatmax@592
|
19 /**
|
flatmax@592
|
20 \author {Matt Flax <flatmax\@>}
|
flatmax@592
|
21 \date 2013.02.08
|
flatmax@592
|
22 */
|
flatmax@592
|
23
|
flatmax@592
|
24 #include "Ear.H"
|
flatmax@592
|
25
|
flatmax@593
|
26 Ear::Ear(FP_TYPE fs_) {
|
flatmax@593
|
27 fs=fs_; // set the specified sample rate
|
flatmax@593
|
28 design();
|
flatmax@592
|
29 }
|
flatmax@592
|
30
|
flatmax@593
|
31 Ear::Ear(void) {
|
flatmax@593
|
32 fs=DEFAULT_SAMPLERATE; // Use the default sample rate
|
flatmax@593
|
33 design();
|
flatmax@592
|
34 }
|
flatmax@593
|
35
|
flatmax@593
|
36 Ear::~Ear(void) {
|
flatmax@593
|
37 }
|
flatmax@593
|
38
|
flatmax@593
|
39 void Ear::design(void) {
|
flatmax@593
|
40
|
flatmax@593
|
41 // first figure out how many filter stages (PZFC/car.AC channels):
|
flatmax@593
|
42 FP_TYPE pole_Hz = car.param.first_pole_theta * fs / (2.*M_PI);
|
flatmax@593
|
43 n_ch = 0;
|
flatmax@593
|
44 while (pole_Hz > car.param.min_pole_Hz) {
|
flatmax@593
|
45 n_ch = n_ch + 1;
|
flatmax@593
|
46 pole_Hz = pole_Hz - car.param.ERB_per_step *
|
flatmax@593
|
47 PsychoAcoustics::Hz2ERB(pole_Hz, car.param.ERB_break_freq, car.param.ERB_Q);
|
flatmax@593
|
48 }
|
flatmax@593
|
49 // Now we have n_ch, the number of channels, so can make the array
|
flatmax@593
|
50 // and compute all the frequencies again to put into it:
|
flatmax@593
|
51 car.pole_freqs.resize(n_ch, NoChange);
|
flatmax@593
|
52 pole_Hz = car.param.first_pole_theta * fs / (2.*M_PI);
|
flatmax@593
|
53 for (int ch = 0; ch<n_ch; ch++) {
|
flatmax@593
|
54 car.pole_freqs[ch] = pole_Hz;
|
flatmax@593
|
55 pole_Hz = pole_Hz - car.param.ERB_per_step *
|
flatmax@593
|
56 PsychoAcoustics::Hz2ERB(pole_Hz, car.param.ERB_break_freq, car.param.ERB_Q);
|
flatmax@593
|
57 }
|
flatmax@593
|
58 // now we have n_ch, the number of channels, and pole_freqs array
|
flatmax@593
|
59
|
flatmax@593
|
60 max_channels_per_octave = (FP_TYPE)(log(2.) / log(car.pole_freqs[0]/car.pole_freqs[1]));
|
flatmax@593
|
61
|
flatmax@593
|
62 // convert to include an ear_array, each w coeffs and state...
|
flatmax@601
|
63 car.designFilters(fs, n_ch);
|
flatmax@601
|
64 AGC.designAGC(fs, n_ch);
|
flatmax@593
|
65 //IHC.designIHC(CF_IHC_params, fs, n_ch);
|
flatmax@593
|
66 }
|