alexbrandmeyer@626: % Author: Alex Brandmeyer alexbrandmeyer@626: % alexbrandmeyer@626: % This Matlab file is part of an implementation of Lyon's cochlear model: alexbrandmeyer@626: % "Cascade of Asymmetric Resonators with Fast-Acting Compression" alexbrandmeyer@626: % to supplement Lyon's upcoming book "Human and Machine Hearing" alexbrandmeyer@626: % alexbrandmeyer@626: % Licensed under the Apache License, Version 2.0 (the "License"); alexbrandmeyer@626: % you may not use this file except in compliance with the License. alexbrandmeyer@626: % You may obtain a copy of the License at alexbrandmeyer@626: % alexbrandmeyer@626: % http://www.apache.org/licenses/LICENSE-2.0 alexbrandmeyer@626: % alexbrandmeyer@626: % Unless required by applicable law or agreed to in writing, software alexbrandmeyer@626: % distributed under the License is distributed on an "AS IS" BASIS, alexbrandmeyer@626: % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. alexbrandmeyer@626: % See the License for the specific language governing permissions and alexbrandmeyer@626: % limitations under the License. alexbrandmeyer@626: alexbrandmeyer@626: function CARFAC_GenerateTestData() alexbrandmeyer@626: % function GenerateTestData() alexbrandmeyer@626: % This function generates a set of text files in the AIMC repository that alexbrandmeyer@626: % can be used to compare the output of the C++ version of CARFAC with that alexbrandmeyer@626: % of the Matlab version. alexbrandmeyer@626: alexbrandmeyer@626: % This designates a subdirectory of the C++ CARFAC folder to store the alexbrandmeyer@626: % test data alexbrandmeyer@626: data_dir = '../../../carfac/test_data/'; alexbrandmeyer@626: alexbrandmeyer@626: % These are some basic settings for the CARFAC design and test data. alexbrandmeyer@626: n_ears = 1; alexbrandmeyer@626: wav_fn = 'plan.wav'; alexbrandmeyer@626: alexbrandmeyer@626: seg_len = 441; alexbrandmeyer@626: start_index = 13000; alexbrandmeyer@626: end_index = start_index + seg_len - 1; alexbrandmeyer@626: file_signal = wavread(wav_fn); alexbrandmeyer@626: file_signal = file_signal(start_index:end_index, 1); alexbrandmeyer@626: alexbrandmeyer@626: filename = 'file_signal_monaural_test.txt' alexbrandmeyer@626: data = file_signal; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % This designs and initializes the CARFAC. alexbrandmeyer@626: CF_struct = CARFAC_Design(n_ears); alexbrandmeyer@626: CF_struct = CARFAC_Init(CF_struct); alexbrandmeyer@626: alexbrandmeyer@626: alexbrandmeyer@626: alexbrandmeyer@626: % Now we go through the coefficient structures and store each set in a text alexbrandmeyer@626: % file. alexbrandmeyer@626: alexbrandmeyer@626: % r1 coeffs alexbrandmeyer@626: filename = 'r1_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.r1_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % a0 coeffs alexbrandmeyer@626: filename = 'a0_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.a0_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % c0 coeffs alexbrandmeyer@626: filename = 'c0_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.c0_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % h coeffs alexbrandmeyer@626: filename = 'h_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.h_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % g0 coeffs alexbrandmeyer@626: filename = 'g0_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.g0_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % zr coeffs alexbrandmeyer@626: filename = 'zr_coeffs.txt' alexbrandmeyer@626: data = CF_struct.ears.CAR_coeffs.zr_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % Now we store the IHC coefficients in an output vector. alexbrandmeyer@626: alexbrandmeyer@626: coeff = CF_struct.ears.IHC_coeffs; alexbrandmeyer@626: ihc_coeffs = [coeff.just_hwr; coeff.lpf_coeff; coeff.out_rate; ... alexbrandmeyer@626: coeff.in_rate; coeff.one_cap; coeff.output_gain; ... alexbrandmeyer@626: coeff.rest_output; coeff.rest_cap; coeff.ac_coeff]; alexbrandmeyer@626: alexbrandmeyer@626: filename = 'ihc_coeffs.txt' alexbrandmeyer@626: data = ihc_coeffs; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: % For each of the AGC Stages, we store a text file containing all of the alexbrandmeyer@626: % coefficients. alexbrandmeyer@626: alexbrandmeyer@626: agc_coeffs = CF_struct.ears.AGC_coeffs alexbrandmeyer@626: alexbrandmeyer@626: for stage = 1:4 alexbrandmeyer@626: data = zeros(14,1); alexbrandmeyer@626: data(1) = agc_coeffs(stage).n_ch; alexbrandmeyer@626: data(2) = agc_coeffs(stage).n_AGC_stages; alexbrandmeyer@626: data(3) = agc_coeffs(stage).AGC_stage_gain; alexbrandmeyer@626: data(4) = agc_coeffs(stage).decimation; alexbrandmeyer@626: data(5) = agc_coeffs(stage).AGC_epsilon; alexbrandmeyer@626: data(6) = agc_coeffs(stage).AGC_polez1; alexbrandmeyer@626: data(7) = agc_coeffs(stage).AGC_polez2; alexbrandmeyer@626: data(8) = agc_coeffs(stage).AGC_spatial_iterations; alexbrandmeyer@626: data(9) = agc_coeffs(stage).AGC_spatial_FIR(1); alexbrandmeyer@626: data(10) = agc_coeffs(stage).AGC_spatial_FIR(2); alexbrandmeyer@626: data(11) = agc_coeffs(stage).AGC_spatial_FIR(3); alexbrandmeyer@626: data(12) = agc_coeffs(stage).AGC_spatial_n_taps; alexbrandmeyer@626: data(13) = agc_coeffs(stage).AGC_mix_coeffs; alexbrandmeyer@626: data(14) = agc_coeffs(1).detect_scale; alexbrandmeyer@626: filename = ['agc_coeffs_' int2str(stage) '.txt'] alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: end alexbrandmeyer@626: alexbrandmeyer@626: % This section of code runs the single segment of data which was selected alexbrandmeyer@626: % and stores the nap, bm, ohc and agc outputs of the CARFAC. alexbrandmeyer@626: alexbrandmeyer@626: [CF_struct, nap_decim, nap, bm, ohc, agc] = CARFAC_Run(CF_struct, file_signal); alexbrandmeyer@626: alexbrandmeyer@626: filename = 'monaural_test_nap.txt' alexbrandmeyer@626: data = nap; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: filename = 'monaural_test_bm.txt' alexbrandmeyer@626: data = bm; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: filename = 'monaural_test_ohc.txt' alexbrandmeyer@626: data = ohc; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' '); alexbrandmeyer@626: alexbrandmeyer@626: filename = 'monaural_test_agc.txt' alexbrandmeyer@626: data = agc; alexbrandmeyer@626: dlmwrite([data_dir filename],data,'precision', 12,'delimiter',' ');