flatmax@674
|
1
|
flatmax@598
|
2 // Author Matt Flax <flatmax@>
|
flatmax@597
|
3 //
|
flatmax@597
|
4 // This C++ file is part of an implementation of Lyon's cochlear model:
|
flatmax@597
|
5 // "Cascade of Asymmetric Resonators with Fast-Acting Compression"
|
flatmax@597
|
6 // to supplement Lyon's upcoming book "Human and Machine Hearing"
|
flatmax@597
|
7 //
|
flatmax@597
|
8 // Licensed under the Apache License, Version 2.0 (the "License");
|
flatmax@597
|
9 // you may not use this file except in compliance with the License.
|
flatmax@597
|
10 // You may obtain a copy of the License at
|
flatmax@597
|
11 //
|
flatmax@597
|
12 // http://www.apache.org/licenses/LICENSE-2.0
|
flatmax@597
|
13 //
|
flatmax@597
|
14 // Unless required by applicable law or agreed to in writing, software
|
flatmax@597
|
15 // distributed under the License is distributed on an "AS IS" BASIS,
|
flatmax@597
|
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
flatmax@597
|
17 // See the License for the specific language governing permissions and
|
flatmax@597
|
18 // limitations under the License.
|
flatmax@597
|
19 #ifndef CARFACCOMMON_H_INCLUDED
|
flatmax@597
|
20 #define CARFACCOMMON_H_INCLUDED
|
flatmax@597
|
21
|
flatmax@597
|
22 typedef float FP_TYPE; ///< The floating point type
|
flatmax@597
|
23 #define AGC_STAGE_COUNT 4 ///< The number of cascades in the AGC
|
flatmax@598
|
24 #define DEFAULT_SAMPLERATE 22050. ///< The default sample rate in Hz
|
flatmax@597
|
25
|
flatmax@597
|
26 #include <iostream>
|
flatmax@597
|
27 using namespace std;
|
flatmax@597
|
28 #include <Eigen/Dense>
|
flatmax@597
|
29 using namespace Eigen;
|
flatmax@597
|
30
|
flatmax@598
|
31 #include "PsychoAcoustics.H"
|
flatmax@598
|
32
|
flatmax@612
|
33 #define AGC_DESIGN_ITERATION_ERROR -100 ///< Error when designing the AGC filter taps
|
flatmax@612
|
34 #define AGC_DESIGN_TAPS_OOB_ERROR -101 ///< The number of taps requested have not been accounted for in the code yet.
|
flatmax@612
|
35 #define AGC_FIR_TAP_COUNT_ERROR -102 ///< The number of taps passed to the AGC::Design_FIR_coeffs method are not handled
|
flatmax@612
|
36
|
flatmax@597
|
37 /**
|
flatmax@597
|
38 \mainpage CARFAC C++
|
flatmax@597
|
39
|
flatmax@597
|
40 \author {Matt Flax <flatmax\@>}
|
flatmax@597
|
41 \date 2013.02.08
|
flatmax@597
|
42
|
flatmax@597
|
43 \section intro_sec Introduction
|
flatmax@597
|
44
|
flatmax@597
|
45 This C++ code implements Dick Lyon's CARFAC model for the peripheral hearing circuit.
|
flatmax@597
|
46
|
flatmax@597
|
47 \section code_philo Philosophy of the implementation
|
flatmax@597
|
48
|
flatmax@597
|
49 \subsection dd Matching the design document
|
flatmax@597
|
50
|
flatmax@597
|
51 As requested by the CARFAC design description, this codebase uses Eigen to compute
|
flatmax@597
|
52 matrix/vector operations.
|
flatmax@597
|
53
|
flatmax@597
|
54 \subsection oo Object oriented acritecture
|
flatmax@597
|
55
|
flatmax@597
|
56 Where possible common paradigms inherit from common Objects. This aims to minimise
|
flatmax@597
|
57 the amount of coding required to implement and modify CARFAC. For example, the EarComponent
|
flatmax@597
|
58 encapsulates the CAR, AGC and IHC where all of the have the common features of Coefficients,
|
flatmax@597
|
59 Parameters and State.
|
flatmax@597
|
60
|
flatmax@597
|
61 \subsection cc Common code
|
flatmax@597
|
62
|
flatmax@597
|
63 Where possible typedefs, definitions, includes and namespace inclusions which are common
|
flatmax@597
|
64 to the code, or usefull outside of class definitions are put in the CARFACCommon.H file.
|
flatmax@597
|
65
|
flatmax@597
|
66 \subsection fileNames File naming convention and header guards
|
flatmax@597
|
67
|
flatmax@597
|
68 C++ files in this codebase are named using the .C and .H suffixes (C code uses .c and .h).
|
flatmax@597
|
69
|
flatmax@597
|
70 Header guards are labeled using the files name with '_' characters, for example.H would become
|
flatmax@597
|
71 EXAMPLE_H_.
|
flatmax@597
|
72
|
flatmax@597
|
73 \subsection globalVars Global variables
|
flatmax@597
|
74
|
flatmax@597
|
75 In general the use of global variables is discouraged. Where possible the code must be instantiated
|
flatmax@597
|
76 many times on the same computer system and the use of global variables complicates having multiple
|
flatmax@597
|
77 instances of shared library classes.
|
flatmax@597
|
78
|
flatmax@597
|
79 \subsection cvns Class and variable naming convention
|
flatmax@597
|
80
|
flatmax@597
|
81 In general, classes begin with capitol letters and a variable name begis with a lower case character.
|
flatmax@597
|
82 The consider a class for example :
|
flatmax@597
|
83
|
flatmax@597
|
84 \code
|
flatmax@597
|
85 class ForExample { class def here };
|
flatmax@597
|
86
|
flatmax@597
|
87 ForExample forExample;
|
flatmax@597
|
88
|
flatmax@597
|
89 class OMG { class def here };
|
flatmax@597
|
90
|
flatmax@597
|
91 OMG omg; // here it is clear what is the type and what is the variable.
|
flatmax@597
|
92
|
flatmax@597
|
93 \endcode
|
flatmax@597
|
94
|
flatmax@597
|
95 The class 'ForExample' is defined, and the variable name 'forExample' may be used in the code,
|
flatmax@597
|
96 which clearly indicates the type of the variable.
|
flatmax@597
|
97
|
flatmax@597
|
98 The concept of labeling variables using 'p' for pointer, and type name references is not necessary,
|
flatmax@597
|
99 and in some cases discouraged. Consider for example, \code float *fs \endcode defining the pointer to the sample rate.
|
flatmax@597
|
100 If we were to use \code float * pFFs // don't do this - difficult to see that pFFs references fs - the sample rate \endcode , it becomes rather difficult to understand that pFFs actualy
|
flatmax@597
|
101 points to the sample rate.
|
flatmax@597
|
102
|
flatmax@597
|
103 A deeper argument for using simple variable names (in C++) is as follows. Good engineers program
|
flatmax@597
|
104 classes and methods which are short and concise. As monitors (LCDs) get larger, most of your methods
|
flatmax@597
|
105 and in some cases classes are visible in one or two pages of your monitor. Consequently if the exact
|
flatmax@597
|
106 type of a variable named 'fs' needs to be found, it is as simple as looking at the top of your monitor
|
flatmax@597
|
107 or scrolling up a little to find a method's input variable name/type. In the case of class member
|
flatmax@597
|
108 variables, a class 'SoundCard' is expected to define a sound card. Consequently certain member variables
|
flatmax@597
|
109 are expected to exist, for example, fs, inputChannels, outputChannels and so on. If the actual types
|
flatmax@597
|
110 of these variables have been forgotten, then the header file is referenced, and this is normally as
|
flatmax@597
|
111 simple as a few key strokes to change from the SoundCard.C file to the SoundCard.H file to inspect
|
flatmax@597
|
112 the names and types of available member variables.
|
flatmax@597
|
113
|
flatmax@674
|
114 \copyright {\code
|
flatmax@597
|
115 Author Matt Flax <flatmax@>
|
flatmax@597
|
116
|
flatmax@597
|
117
|
flatmax@597
|
118 This C++ file is part of an implementation of Lyon's cochlear model:
|
flatmax@597
|
119
|
flatmax@597
|
120 "Cascade of Asymmetric Resonators with Fast-Acting Compression"
|
flatmax@597
|
121
|
flatmax@597
|
122 to supplement Lyon's upcoming book "Human and Machine Hearing"
|
flatmax@597
|
123
|
flatmax@597
|
124
|
flatmax@597
|
125 Licensed under the Apache License, Version 2.0 (the "License");
|
flatmax@597
|
126
|
flatmax@597
|
127 you may not use this file except in compliance with the License.
|
flatmax@597
|
128
|
flatmax@597
|
129 You may obtain a copy of the License at
|
flatmax@597
|
130
|
flatmax@597
|
131
|
flatmax@597
|
132 http://www.apache.org/licenses/LICENSE-2.0
|
flatmax@597
|
133
|
flatmax@597
|
134
|
flatmax@597
|
135 Unless required by applicable law or agreed to in writing, software
|
flatmax@597
|
136
|
flatmax@597
|
137 distributed under the License is distributed on an "AS IS" BASIS,
|
flatmax@597
|
138
|
flatmax@597
|
139 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
flatmax@597
|
140
|
flatmax@597
|
141 See the License for the specific language governing permissions and
|
flatmax@597
|
142
|
flatmax@597
|
143 limitations under the License. \endcode}
|
flatmax@597
|
144 */
|
flatmax@597
|
145
|
flatmax@597
|
146 #endif // CARFACCOMMON_H_INCLUDED
|