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