tomwalters@0: % method of class @signal tomwalters@0: % function sig=ci_simulate(signal) tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % sig: @signal tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % sigresult: @signal ` tomwalters@0: % bleeck@3: % This external file is included as part of the 'aim-mat' distribution package bleeck@3: % (c) 2011, University of Southampton bleeck@3: % Maintained by Stefan Bleeck (bleeck@gmail.com) bleeck@3: % download of current version is on the soundsoftware site: bleeck@3: % http://code.soundsoftware.ac.uk/projects/aimmat bleeck@3: % documentation and everything is on http://www.acousticscale.org tomwalters@0: tomwalters@0: function sig=ci_simulate(sigorg) tomwalters@0: % stolen from AMO.m tomwalters@0: tomwalters@0: audio_sample_rate=getsr(sigorg); tomwalters@0: % audio_sample_rate=16000; tomwalters@0: tomwalters@0: p.channel_stim_rate=900; tomwalters@0: p.audio_sample_rate=audio_sample_rate; tomwalters@0: p.analysis_rate=p.channel_stim_rate; tomwalters@0: p.num_selected = 10; tomwalters@0: p.num_bands = 22; tomwalters@0: p.electrodes=22:-1:1; tomwalters@0: tomwalters@0: p=Append_process(p,'FFT_filterbank_proc'); tomwalters@0: p=Append_process(p,'Power_sum_envelope_proc'); tomwalters@0: p=Append_process(p,'Reject_smallest_proc'); tomwalters@0: tomwalters@0: values=getvalues(sigorg); tomwalters@0: FTM=Process(p,values); tomwalters@0: tomwalters@0: tomwalters@0: % Parameters for Resynthesis tomwalters@0: % -------------------------- tomwalters@0: pre.resynthesis_rate = audio_sample_rate; tomwalters@0: pre.num_bands = p.num_bands; tomwalters@0: pre.analysis_rate = p.channel_stim_rate; tomwalters@0: pre.electrodes=p.electrodes; tomwalters@0: tomwalters@0: insertion = 22; % insertion depth in mm tomwalters@0: cochlength=33; % length of cochlea tomwalters@0: elecspacing = 0.75; % spacing between electrodes in mm tomwalters@0: b = 0.3; % space constant in mm tomwalters@0: tomwalters@0: % prepare non-overlapping crossover frequencies according to Greenwood tomwalters@0: % -------------------------------------------------------------------- tomwalters@0: for i=1:23 tomwalters@0: %elec_position_base(i)=insertion-elecspacing*(i-1); % position of elec in cochlea from base [mm] tomwalters@0: crossover_position_base(i)=insertion - (elecspacing*(i-1) - elecspacing*0.5); % position between electrodes from base [mm] tomwalters@0: end tomwalters@0: crossover_position_apex=cochlength-crossover_position_base'; % position between electrodes from apex [mm] tomwalters@0: crossover_freqs_greenwood=Greenwood_x2cf(crossover_position_apex); % corresponding Greenwood frequencies tomwalters@0: % check if there are frequencies above 1/2 sampling rate, tomwalters@0: % and remove those bands from FTM, electrodes and crossover freq table tomwalters@0: toohigh=sum(crossover_freqs_greenwood>0.5*pre.resynthesis_rate); tomwalters@0: crossover_freqs_greenwood=crossover_freqs_greenwood(1:end-toohigh); % only those < half the sampling rate tomwalters@0: pre.electrodes=pre.electrodes(1:sum(p.electrodes>toohigh)); tomwalters@0: FTM=FTM(1:sum(p.electrodes>toohigh),:); tomwalters@0: num_bands_after=length(pre.electrodes); tomwalters@0: if pre.num_bands~=num_bands_after tomwalters@0: 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: end tomwalters@0: pre.num_bands=num_bands_after; tomwalters@0: tomwalters@0: % resynthesize tomwalters@0: % ------------ tomwalters@0: %sinusoid tomwalters@0: % pre.resynthesis_carrier = 'sinus'; tomwalters@0: % pre.crossover_freqs=crossover_freqs_greenwood; % sinusoids following Greenwood tomwalters@0: tomwalters@0: % noise % NOISE tomwalters@0: pre.resynthesis_carrier = 'noise'; tomwalters@0: pre.crossover_freqs=crossover_freqs_greenwood; tomwalters@0: tomwalters@0: pre = Resynthesis(pre); tomwalters@0: simul = Resynthesis(pre,FTM); tomwalters@0: tomwalters@0: %Windowing and zeropadding to remove clicks tomwalters@0: w = risewindow(length(simul),0.01*pre.resynthesis_rate)'; %a 10 ms linear rise and fall tomwalters@0: simul = [zeros(1,10) w.*simul zeros(1,10)]; tomwalters@0: tomwalters@0: tomwalters@0: % return a signal: tomwalters@0: sig=signal(simul,audio_sample_rate); tomwalters@0: sig=setname(sig,'Convolution'); tomwalters@0: tomwalters@0: tomwalters@0: return;