annotate trunk/matlab/bmm/carfac/CARFAC_GenerateTestData.m @ 668:933cf18d9a59

Fourth revision of Alex Brandmeyer's C++ implementation. Fixed more style issues, changed AGC structures to vectors, replaced FloatArray2d with vector<FloatArray>, implemented first tests using GTest to verify coefficients and monaural output against Matlab values (stored in aimc/carfac/test_data/). To run tests, change the path stored in carfac_test.h in TEST_SRC_DIR. Added CARFAC_GenerateTestData to the Matlab branch, fixed stage indexing in CARFAC_Cross_Couple.m to reflect changes in AGCCoeffs and AGCState structs.
author alexbrandmeyer
date Wed, 22 May 2013 21:30:02 +0000
parents
children 7f424c1a8b78
rev   line source
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',' ');