annotate aim-mat/tools/@signal/ci_simulate.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
tomwalters@0 1 % method of class @signal
tomwalters@0 2 % function sig=ci_simulate(signal)
tomwalters@0 3 %
tomwalters@0 4 % INPUT VALUES:
tomwalters@0 5 % sig: @signal
tomwalters@0 6 %
tomwalters@0 7 % RETURN VALUE:
tomwalters@0 8 % sigresult: @signal `
tomwalters@0 9 %
bleeck@3 10 % This external file is included as part of the 'aim-mat' distribution package
bleeck@3 11 % (c) 2011, University of Southampton
bleeck@3 12 % Maintained by Stefan Bleeck (bleeck@gmail.com)
bleeck@3 13 % download of current version is on the soundsoftware site:
bleeck@3 14 % http://code.soundsoftware.ac.uk/projects/aimmat
bleeck@3 15 % documentation and everything is on http://www.acousticscale.org
tomwalters@0 16
tomwalters@0 17 function sig=ci_simulate(sigorg)
tomwalters@0 18 % stolen from AMO.m
tomwalters@0 19
tomwalters@0 20 audio_sample_rate=getsr(sigorg);
tomwalters@0 21 % audio_sample_rate=16000;
tomwalters@0 22
tomwalters@0 23 p.channel_stim_rate=900;
tomwalters@0 24 p.audio_sample_rate=audio_sample_rate;
tomwalters@0 25 p.analysis_rate=p.channel_stim_rate;
tomwalters@0 26 p.num_selected = 10;
tomwalters@0 27 p.num_bands = 22;
tomwalters@0 28 p.electrodes=22:-1:1;
tomwalters@0 29
tomwalters@0 30 p=Append_process(p,'FFT_filterbank_proc');
tomwalters@0 31 p=Append_process(p,'Power_sum_envelope_proc');
tomwalters@0 32 p=Append_process(p,'Reject_smallest_proc');
tomwalters@0 33
tomwalters@0 34 values=getvalues(sigorg);
tomwalters@0 35 FTM=Process(p,values);
tomwalters@0 36
tomwalters@0 37
tomwalters@0 38 % Parameters for Resynthesis
tomwalters@0 39 % --------------------------
tomwalters@0 40 pre.resynthesis_rate = audio_sample_rate;
tomwalters@0 41 pre.num_bands = p.num_bands;
tomwalters@0 42 pre.analysis_rate = p.channel_stim_rate;
tomwalters@0 43 pre.electrodes=p.electrodes;
tomwalters@0 44
tomwalters@0 45 insertion = 22; % insertion depth in mm
tomwalters@0 46 cochlength=33; % length of cochlea
tomwalters@0 47 elecspacing = 0.75; % spacing between electrodes in mm
tomwalters@0 48 b = 0.3; % space constant in mm
tomwalters@0 49
tomwalters@0 50 % prepare non-overlapping crossover frequencies according to Greenwood
tomwalters@0 51 % --------------------------------------------------------------------
tomwalters@0 52 for i=1:23
tomwalters@0 53 %elec_position_base(i)=insertion-elecspacing*(i-1); % position of elec in cochlea from base [mm]
tomwalters@0 54 crossover_position_base(i)=insertion - (elecspacing*(i-1) - elecspacing*0.5); % position between electrodes from base [mm]
tomwalters@0 55 end
tomwalters@0 56 crossover_position_apex=cochlength-crossover_position_base'; % position between electrodes from apex [mm]
tomwalters@0 57 crossover_freqs_greenwood=Greenwood_x2cf(crossover_position_apex); % corresponding Greenwood frequencies
tomwalters@0 58 % check if there are frequencies above 1/2 sampling rate,
tomwalters@0 59 % and remove those bands from FTM, electrodes and crossover freq table
tomwalters@0 60 toohigh=sum(crossover_freqs_greenwood>0.5*pre.resynthesis_rate);
tomwalters@0 61 crossover_freqs_greenwood=crossover_freqs_greenwood(1:end-toohigh); % only those < half the sampling rate
tomwalters@0 62 pre.electrodes=pre.electrodes(1:sum(p.electrodes>toohigh));
tomwalters@0 63 FTM=FTM(1:sum(p.electrodes>toohigh),:);
tomwalters@0 64 num_bands_after=length(pre.electrodes);
tomwalters@0 65 if pre.num_bands~=num_bands_after
tomwalters@0 66 msgbox([num2str(pre.num_bands-num_bands_after) ' of the active basal electrodes correspond(s) to frequencies > half the sampling frequency and will be disabled.'],'Disabling electrodes','warn','modal');
tomwalters@0 67 end
tomwalters@0 68 pre.num_bands=num_bands_after;
tomwalters@0 69
tomwalters@0 70 % resynthesize
tomwalters@0 71 % ------------
tomwalters@0 72 %sinusoid
tomwalters@0 73 % pre.resynthesis_carrier = 'sinus';
tomwalters@0 74 % pre.crossover_freqs=crossover_freqs_greenwood; % sinusoids following Greenwood
tomwalters@0 75
tomwalters@0 76 % noise % NOISE
tomwalters@0 77 pre.resynthesis_carrier = 'noise';
tomwalters@0 78 pre.crossover_freqs=crossover_freqs_greenwood;
tomwalters@0 79
tomwalters@0 80 pre = Resynthesis(pre);
tomwalters@0 81 simul = Resynthesis(pre,FTM);
tomwalters@0 82
tomwalters@0 83 %Windowing and zeropadding to remove clicks
tomwalters@0 84 w = risewindow(length(simul),0.01*pre.resynthesis_rate)'; %a 10 ms linear rise and fall
tomwalters@0 85 simul = [zeros(1,10) w.*simul zeros(1,10)];
tomwalters@0 86
tomwalters@0 87
tomwalters@0 88 % return a signal:
tomwalters@0 89 sig=signal(simul,audio_sample_rate);
tomwalters@0 90 sig=setname(sig,'Convolution');
tomwalters@0 91
tomwalters@0 92
tomwalters@0 93 return;