annotate C++/Ear.C @ 662:7e18c84ca2b7

Small cleanup of eigen usage in SAI implementation.
author ronw@google.com
date Tue, 16 Jul 2013 19:56:11 +0000
parents c692afd86cc9
children
rev   line source
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 }