annotate aim-mat/tools/@signal/ci_simulate.asv @ 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 74dedb26614d
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 %
tomwalters@0 10 % (c) 2003, University of Cambridge, Medical Research Council
tomwalters@0 11 % Stefan Bleeck (stefan@bleeck.de)
tomwalters@0 12 % http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual
tomwalters@0 13 % $Date: 2003/01/20 18:33:51 $
tomwalters@0 14 % $Revision: 1.4 $
tomwalters@0 15
tomwalters@0 16 function sig=ci_simulate(sig)
tomwalters@0 17 % stolen from AMO.m
tomwalters@0 18
tomwalters@0 19 audio_sample_rate=16000;
tomwalters@0 20
tomwalters@0 21 p.channel_stim_rate=900;
tomwalters@0 22 p.audio_sample_rate=audio_sample_rate;
tomwalters@0 23 p.analysis_rate=p.channel_stim_rate;
tomwalters@0 24 p.num_selected = 10;
tomwalters@0 25 p.num_bands = 22;
tomwalters@0 26 p.electrodes=22:-1:1;
tomwalters@0 27
tomwalters@0 28 p=Append_process(p,'FFT_filterbank_proc');
tomwalters@0 29 p=Append_process(p,'Power_sum_envelope_proc');
tomwalters@0 30 p=Append_process(p,'Reject_smallest_proc');
tomwalters@0 31 FTM=Process(p,sig.values);
tomwalters@0 32
tomwalters@0 33
tomwalters@0 34 % Parameters for Resynthesis
tomwalters@0 35 % --------------------------
tomwalters@0 36 pre.resynthesis_rate = audio_sample_rate;
tomwalters@0 37 pre.num_bands = p.num_bands;
tomwalters@0 38 pre.analysis_rate = p.channel_stim_rate;
tomwalters@0 39 pre.electrodes=p.electrodes;
tomwalters@0 40
tomwalters@0 41 insertion = 22; % insertion depth in mm
tomwalters@0 42 cochlength=33 % length of cochlea
tomwalters@0 43 elecspacing = 0.75; % spacing between electrodes in mm
tomwalters@0 44 b = 0.3; % space constant in mm
tomwalters@0 45
tomwalters@0 46 % prepare non-overlapping crossover frequencies according to Greenwood
tomwalters@0 47 % --------------------------------------------------------------------
tomwalters@0 48 for i=1:23
tomwalters@0 49 %elec_position_base(i)=insertion-elecspacing*(i-1); % position of elec in cochlea from base [mm]
tomwalters@0 50 crossover_position_base(i)=insertion - (elecspacing*(i-1) - elecspacing*0.5); % position between electrodes from base [mm]
tomwalters@0 51 end
tomwalters@0 52 crossover_position_apex=cochlength-crossover_position_base'; % position between electrodes from apex [mm]
tomwalters@0 53 crossover_freqs_greenwood=Greenwood_x2cf(crossover_position_apex); % corresponding Greenwood frequencies
tomwalters@0 54 % check if there are frequencies above 1/2 sampling rate,
tomwalters@0 55 % and remove those bands from FTM, electrodes and crossover freq table
tomwalters@0 56 toohigh=sum(crossover_freqs_greenwood>0.5*pre.resynthesis_rate);
tomwalters@0 57 crossover_freqs_greenwood=crossover_freqs_greenwood(1:end-toohigh); % only those < half the sampling rate
tomwalters@0 58 pre.electrodes=pre.electrodes(1:sum(p.electrodes>toohigh));
tomwalters@0 59 FTM=FTM(1:sum(p.electrodes>toohigh),:);
tomwalters@0 60 num_bands_after=length(pre.electrodes);
tomwalters@0 61 if pre.num_bands~=num_bands_after
tomwalters@0 62 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 63 end
tomwalters@0 64 pre.num_bands=num_bands_after;
tomwalters@0 65
tomwalters@0 66 % resynthesize
tomwalters@0 67 % ------------
tomwalters@0 68 %sinusoid
tomwalters@0 69 pre.resynthesis_carrier = 'sinus';
tomwalters@0 70 if get(handles.AnalRadio,'Value')
tomwalters@0 71 pre.crossover_freqs=p.crossover_freqs; % sinusoids following crossover frequencies as in analysis
tomwalters@0 72 filename=[filename '_sinus'];
tomwalters@0 73 else
tomwalters@0 74 pre.crossover_freqs=crossover_freqs_greenwood; % sinusoids following Greenwood
tomwalters@0 75 filename=[filename '_sinus_green_' num2str(cochlength) '_' num2str(insertion)];
tomwalters@0 76 end
tomwalters@0 77 else % NOISE
tomwalters@0 78 pre.resynthesis_carrier = 'noise';
tomwalters@0 79 if get(handles.AnalRadio,'Value')
tomwalters@0 80 pre.crossover_freqs=p.crossover_freqs; % noise bands following analysis freq bands, non-overlapping
tomwalters@0 81 filename=[filename '_noise'];
tomwalters@0 82 else
tomwalters@0 83 if get(handles.OverBox,'Value') % exponentially decaying, overlapping frequency bands, after Greenwood
tomwalters@0 84 for i=1:22
tomwalters@0 85 pre.resynthesis_A(i,:) = 1;
tomwalters@0 86 pre.resynthesis_B(i,:) = CISimulationFilter(insertion-elecspacing*(i-1),pre.resynthesis_rate,b,cochlength);
tomwalters@0 87 end
tomwalters@0 88 filename=[filename '_noise_green_' num2str(cochlength) '_' num2str(insertion) '_olap_' num2str(b)];
tomwalters@0 89 else % crossover frequencies after Greenwood, non-overlapping
tomwalters@0 90 pre.crossover_freqs=crossover_freqs_greenwood;
tomwalters@0 91 filename=[filename '_noise_green_' num2str(cochlength) '_' num2str(insertion)];
tomwalters@0 92 end
tomwalters@0 93 end
tomwalters@0 94 end
tomwalters@0 95
tomwalters@0 96 pre = resynthesis(pre);
tomwalters@0 97 simul = resynthesis(pre,FTM);
tomwalters@0 98
tomwalters@0 99 %Windowing and zeropadding to remove clicks
tomwalters@0 100 w = risewindow(length(simul),0.01*pre.resynthesis_rate)'; %a 10 ms linear rise and fall
tomwalters@0 101 simul = [zeros(1,10) w.*simul zeros(1,10)];
tomwalters@0 102
tomwalters@0 103 if get(handles.NormalizeBox,'Value') % normalize output
tomwalters@0 104 amp1=sum(handles.audio.^2);
tomwalters@0 105 amp2=sum(simul.^2);
tomwalters@0 106 %simul=simul*sqrt(amp1/amp2); % normalize to input level
tomwalters@0 107 simul=0.9*simul/max(abs(simul)); % normalize to 90 %
tomwalters@0 108 end
tomwalters@0 109
tomwalters@0 110 return;