annotate C++/Ear.C @ 593:40934f897a56

Fixed certain minor documentation bugs. Added the CAR::designFilters and CAR::stageG methods. These methods design the CAR.coeff coefficients. They have been compared to be the same as the matlab coefficients. An Ear is now contructed with a specific FS or, it uses the default. Added the PsychoAcoustics class to do ERB and Hz conversions. Added the EarTest.C main which allows the construction of an Ear class for testing.
author flatmax
date Wed, 20 Feb 2013 22:30:19 +0000
parents 76c6b3fd0a05
children d838de2ce1b1
rev   line source
flatmax@592 1 // Copyright 2013 Matt R. Flax <flatmax\@> All Rights Reserved.
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@593 63 car.designFilters(fs, n_ch); //(car.param. fs, car.pole_freqs);
flatmax@593 64 //AGC.designAGC(CF_AGC_params, fs, n_ch);
flatmax@593 65 //IHC.designIHC(CF_IHC_params, fs, n_ch);
flatmax@593 66 }