alexbrandmeyer@668
|
1 % Author: Alex Brandmeyer
|
alexbrandmeyer@668
|
2 %
|
alexbrandmeyer@668
|
3 % This Matlab file is part of an implementation of Lyon's cochlear model:
|
alexbrandmeyer@668
|
4 % "Cascade of Asymmetric Resonators with Fast-Acting Compression"
|
alexbrandmeyer@668
|
5 % to supplement Lyon's upcoming book "Human and Machine Hearing"
|
alexbrandmeyer@668
|
6 %
|
alexbrandmeyer@668
|
7 % Licensed under the Apache License, Version 2.0 (the "License");
|
alexbrandmeyer@668
|
8 % you may not use this file except in compliance with the License.
|
alexbrandmeyer@668
|
9 % You may obtain a copy of the License at
|
alexbrandmeyer@668
|
10 %
|
alexbrandmeyer@668
|
11 % http://www.apache.org/licenses/LICENSE-2.0
|
alexbrandmeyer@668
|
12 %
|
alexbrandmeyer@668
|
13 % Unless required by applicable law or agreed to in writing, software
|
alexbrandmeyer@668
|
14 % distributed under the License is distributed on an "AS IS" BASIS,
|
alexbrandmeyer@668
|
15 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
alexbrandmeyer@668
|
16 % See the License for the specific language governing permissions and
|
alexbrandmeyer@668
|
17 % limitations under the License.
|
alexbrandmeyer@668
|
18
|
alexbrandmeyer@668
|
19 function CARFAC_GenerateTestData()
|
alexbrandmeyer@668
|
20 % function GenerateTestData()
|
alexbrandmeyer@668
|
21 % This function generates a set of text files in the AIMC repository that
|
alexbrandmeyer@668
|
22 % can be used to compare the output of the C++ version of CARFAC with that
|
alexbrandmeyer@668
|
23 % of the Matlab version.
|
alexbrandmeyer@668
|
24
|
alexbrandmeyer@668
|
25 % This designates a subdirectory of the C++ CARFAC folder to store the
|
alexbrandmeyer@668
|
26 % test data
|
alexbrandmeyer@668
|
27 data_dir = '../../../carfac/test_data/';
|
alexbrandmeyer@668
|
28
|
alexbrandmeyer@668
|
29 % These are some basic settings for the CARFAC design and test data.
|
alexbrandmeyer@668
|
30 n_ears = 1;
|
alexbrandmeyer@668
|
31 wav_fn = 'plan.wav';
|
alexbrandmeyer@668
|
32
|
alexbrandmeyer@668
|
33 seg_len = 441;
|
alexbrandmeyer@668
|
34 start_index = 13000;
|
alexbrandmeyer@668
|
35 end_index = start_index + seg_len - 1;
|
alexbrandmeyer@668
|
36 file_signal = wavread(wav_fn);
|
alexbrandmeyer@668
|
37 file_signal = file_signal(start_index:end_index, 1);
|
alexbrandmeyer@668
|
38
|
alexbrandmeyer@668
|
39 filename = 'file_signal_monaural_test.txt'
|
alexbrandmeyer@668
|
40 data = file_signal;
|
alexbrandmeyer@668
|
41 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
42
|
alexbrandmeyer@668
|
43 % This designs and initializes the CARFAC.
|
alexbrandmeyer@668
|
44 CF_struct = CARFAC_Design(n_ears);
|
alexbrandmeyer@668
|
45 CF_struct = CARFAC_Init(CF_struct);
|
alexbrandmeyer@668
|
46
|
alexbrandmeyer@668
|
47
|
alexbrandmeyer@668
|
48
|
alexbrandmeyer@668
|
49 % Now we go through the coefficient structures and store each set in a text
|
alexbrandmeyer@668
|
50 % file.
|
alexbrandmeyer@668
|
51
|
alexbrandmeyer@668
|
52 % r1 coeffs
|
alexbrandmeyer@668
|
53 filename = 'r1_coeffs.txt'
|
alexbrandmeyer@668
|
54 data = CF_struct.ears.CAR_coeffs.r1_coeffs;
|
alexbrandmeyer@668
|
55 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
56
|
alexbrandmeyer@668
|
57 % a0 coeffs
|
alexbrandmeyer@668
|
58 filename = 'a0_coeffs.txt'
|
alexbrandmeyer@668
|
59 data = CF_struct.ears.CAR_coeffs.a0_coeffs;
|
alexbrandmeyer@668
|
60 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
61
|
alexbrandmeyer@668
|
62 % c0 coeffs
|
alexbrandmeyer@668
|
63 filename = 'c0_coeffs.txt'
|
alexbrandmeyer@668
|
64 data = CF_struct.ears.CAR_coeffs.c0_coeffs;
|
alexbrandmeyer@668
|
65 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
66
|
alexbrandmeyer@668
|
67 % h coeffs
|
alexbrandmeyer@668
|
68 filename = 'h_coeffs.txt'
|
alexbrandmeyer@668
|
69 data = CF_struct.ears.CAR_coeffs.h_coeffs;
|
alexbrandmeyer@668
|
70 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
71
|
alexbrandmeyer@668
|
72 % g0 coeffs
|
alexbrandmeyer@668
|
73 filename = 'g0_coeffs.txt'
|
alexbrandmeyer@668
|
74 data = CF_struct.ears.CAR_coeffs.g0_coeffs;
|
alexbrandmeyer@668
|
75 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
76
|
alexbrandmeyer@668
|
77 % zr coeffs
|
alexbrandmeyer@668
|
78 filename = 'zr_coeffs.txt'
|
alexbrandmeyer@668
|
79 data = CF_struct.ears.CAR_coeffs.zr_coeffs;
|
alexbrandmeyer@668
|
80 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
81
|
alexbrandmeyer@668
|
82 % Now we store the IHC coefficients in an output vector.
|
alexbrandmeyer@668
|
83
|
alexbrandmeyer@668
|
84 coeff = CF_struct.ears.IHC_coeffs;
|
alexbrandmeyer@668
|
85 ihc_coeffs = [coeff.just_hwr; coeff.lpf_coeff; coeff.out_rate; ...
|
alexbrandmeyer@668
|
86 coeff.in_rate; coeff.one_cap; coeff.output_gain; ...
|
alexbrandmeyer@668
|
87 coeff.rest_output; coeff.rest_cap; coeff.ac_coeff];
|
alexbrandmeyer@668
|
88
|
alexbrandmeyer@668
|
89 filename = 'ihc_coeffs.txt'
|
alexbrandmeyer@668
|
90 data = ihc_coeffs;
|
alexbrandmeyer@668
|
91 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
92
|
alexbrandmeyer@668
|
93 % For each of the AGC Stages, we store a text file containing all of the
|
alexbrandmeyer@668
|
94 % coefficients.
|
alexbrandmeyer@668
|
95
|
alexbrandmeyer@668
|
96 agc_coeffs = CF_struct.ears.AGC_coeffs
|
alexbrandmeyer@668
|
97
|
alexbrandmeyer@668
|
98 for stage = 1:4
|
alexbrandmeyer@668
|
99 data = zeros(14,1);
|
alexbrandmeyer@668
|
100 data(1) = agc_coeffs(stage).n_ch;
|
alexbrandmeyer@668
|
101 data(2) = agc_coeffs(stage).n_AGC_stages;
|
alexbrandmeyer@668
|
102 data(3) = agc_coeffs(stage).AGC_stage_gain;
|
alexbrandmeyer@668
|
103 data(4) = agc_coeffs(stage).decimation;
|
alexbrandmeyer@668
|
104 data(5) = agc_coeffs(stage).AGC_epsilon;
|
alexbrandmeyer@668
|
105 data(6) = agc_coeffs(stage).AGC_polez1;
|
alexbrandmeyer@668
|
106 data(7) = agc_coeffs(stage).AGC_polez2;
|
alexbrandmeyer@668
|
107 data(8) = agc_coeffs(stage).AGC_spatial_iterations;
|
alexbrandmeyer@668
|
108 data(9) = agc_coeffs(stage).AGC_spatial_FIR(1);
|
alexbrandmeyer@668
|
109 data(10) = agc_coeffs(stage).AGC_spatial_FIR(2);
|
alexbrandmeyer@668
|
110 data(11) = agc_coeffs(stage).AGC_spatial_FIR(3);
|
alexbrandmeyer@668
|
111 data(12) = agc_coeffs(stage).AGC_spatial_n_taps;
|
alexbrandmeyer@668
|
112 data(13) = agc_coeffs(stage).AGC_mix_coeffs;
|
alexbrandmeyer@668
|
113 data(14) = agc_coeffs(1).detect_scale;
|
alexbrandmeyer@668
|
114 filename = ['agc_coeffs_' int2str(stage) '.txt']
|
alexbrandmeyer@668
|
115 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
116 end
|
alexbrandmeyer@668
|
117
|
alexbrandmeyer@668
|
118 % This section of code runs the single segment of data which was selected
|
alexbrandmeyer@668
|
119 % and stores the nap, bm, ohc and agc outputs of the CARFAC.
|
alexbrandmeyer@668
|
120
|
alexbrandmeyer@668
|
121 [CF_struct, nap_decim, nap, bm, ohc, agc] = CARFAC_Run(CF_struct, file_signal);
|
alexbrandmeyer@668
|
122
|
alexbrandmeyer@668
|
123 filename = 'monaural_test_nap.txt'
|
alexbrandmeyer@668
|
124 data = nap;
|
alexbrandmeyer@668
|
125 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
126
|
alexbrandmeyer@668
|
127 filename = 'monaural_test_bm.txt'
|
alexbrandmeyer@668
|
128 data = bm;
|
alexbrandmeyer@668
|
129 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
130
|
alexbrandmeyer@668
|
131 filename = 'monaural_test_ohc.txt'
|
alexbrandmeyer@668
|
132 data = ohc;
|
alexbrandmeyer@668
|
133 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');
|
alexbrandmeyer@668
|
134
|
alexbrandmeyer@668
|
135 filename = 'monaural_test_agc.txt'
|
alexbrandmeyer@668
|
136 data = agc;
|
alexbrandmeyer@668
|
137 dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); |