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; |