comparison userProgramsTim/speechmanipulation.m @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents
children
comparison
equal deleted inserted replaced
37:771a643d5c29 38:c2204b18f4a2
1 function varargout = speechmanipulation(varargin)
2 % SPEECHMANIPULATION MATLAB code for speechmanipulation.fig
3 % SPEECHMANIPULATION, by itself, creates a new SPEECHMANIPULATION or raises the existing
4 % singleton*.
5 %
6 % H = SPEECHMANIPULATION returns the handle to a new SPEECHMANIPULATION or the handle to
7 % the existing singleton*.
8 %
9 % SPEECHMANIPULATION('CALLBACK',hObject,eventData,handles,...) calls the local
10 % function named CALLBACK in SPEECHMANIPULATION.M with the given input arguments.
11 %
12 % SPEECHMANIPULATION('Property','Value',...) creates a new SPEECHMANIPULATION or raises the
13 % existing singleton*. Starting from the left, property value pairs are
14 % applied to the GUI before speechmanipulation_OpeningFcn gets called. An
15 % unrecognized property name or invalid value makes property application
16 % stop. All inputs are passed to speechmanipulation_OpeningFcn via varargin.
17 %
18 % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
19 % instance to run (singleton)".
20 %
21 % See also: GUIDE, GUIDATA, GUIHANDLES
22
23 % Edit the above text to modify the response to help speechmanipulation
24
25 % Last Modified by GUIDE v2.5 05-Oct-2011 11:21:58
26
27 % Begin initialization code - DO NOT EDIT
28 gui_Singleton = 1;
29 gui_State = struct('gui_Name', mfilename, ...
30 'gui_Singleton', gui_Singleton, ...
31 'gui_OpeningFcn', @speechmanipulation_OpeningFcn, ...
32 'gui_OutputFcn', @speechmanipulation_OutputFcn, ...
33 'gui_LayoutFcn', [] , ...
34 'gui_Callback', []);
35 if nargin && ischar(varargin{1})
36 gui_State.gui_Callback = str2func(varargin{1});
37 end
38
39 if nargout
40 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
41 else
42 gui_mainfcn(gui_State, varargin{:});
43 end
44 % End initialization code - DO NOT EDIT
45
46
47 % --- Executes just before speechmanipulation is made visible.
48 function speechmanipulation_OpeningFcn(hObject, eventdata, handles, varargin)
49 % This function has no output args, see OutputFcn.
50 % hObject handle to figure
51 % eventdata reserved - to be defined in a future version of MATLAB
52 % handles structure with handles and user data (see GUIDATA)
53 % varargin command line arguments to speechmanipulation (see VARARGIN)
54 global wavfilescell;
55 global rateaxeshandle; %handle to axis6 is needed, if radiobuttons12 and 13 change
56
57
58 % Choose default command line output for speechmanipulation
59 handles.output = hObject;
60
61 % Update handles structure
62 guidata(hObject, handles);
63
64 % UIWAIT makes speechmanipulation wait for user response (see UIRESUME)
65 % uiwait(handles.figure1);
66 wavfiles = dir(['..' filesep 'wavFileStore' filesep '*.wav']);
67 for iCounter = 1:length(wavfiles)
68 wavfilescell{iCounter} = wavfiles(iCounter).name;
69 end
70 set(handles.popupmenu1,'String',wavfilescell);
71 set(handles.popupmenu2,'String',wavfilescell);
72 set(handles.uipanel8,'SelectionChangeFcn',@radiobuttonselected);
73 rateaxeshandle = handles.axes6;
74
75 % --- Outputs from this function are returned to the command line.
76 function varargout = speechmanipulation_OutputFcn(hObject, eventdata, handles)
77 % varargout cell array for returning output args (see VARARGOUT);
78 % hObject handle to figure
79 % eventdata reserved - to be defined in a future version of MATLAB
80 % handles structure with handles and user data (see GUIDATA)
81
82 % Get default command line output from handles structure
83 varargout{1} = handles.output;
84
85 function edit1_Callback(hObject, eventdata, handles)
86 function edit2_Callback(hObject, eventdata, handles)
87 function edit3_Callback(hObject, eventdata, handles)
88 function edit4_Callback(hObject, eventdata, handles)
89 function edit5_Callback(hObject, eventdata, handles)
90 function edit6_Callback(hObject, eventdata, handles)
91 function edit7_Callback(hObject, eventdata, handles)
92 function edit8_Callback(hObject, eventdata, handles)
93 function edit9_Callback(hObject, eventdata, handles)
94 function edit10_Callback(hObject, eventdata, handles)
95 function edit11_Callback(hObject, eventdata, handles)
96 function edit12_Callback(hObject, eventdata, handles)
97
98
99 % --- Executes on selection change in popupmenu1.
100 function popupmenu1_Callback(hObject, eventdata, handles)
101 % hObject handle to popupmenu1 (see GCBO)
102 % eventdata reserved - to be defined in a future version of MATLAB
103 % handles structure with handles and user data (see GUIDATA)
104
105 % Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
106 % contents{get(hObject,'Value')} returns selected item from popupmenu1
107 %% CHOOSE AND LOAD WAVEFORM
108 global wavfilescell
109 global originalsignal
110 global actualsignal
111
112 %get the number from the popupmenu
113 selectedfileno = get(handles.popupmenu1,'Value');
114
115 %load it
116 [waveform,sfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
117
118 %if it is from OLLO then cut it
119 if regexp(wavfilescell{selectedfileno}, 'S[0-9]*[A-Z]_L[0-9]*_V[0-9]_M[0-9]_N[0-9]_CS0.wav') %pattern for OLLO-files
120 waveform = cutsignal(waveform,sfreq,'a_a');
121 end
122
123 %store it in global variables
124 actualsignal.waveform = waveform;
125 actualsignal.sfreq = sfreq;
126 originalsignal.waveform = waveform;
127 originalsignal.sfreq = sfreq;
128
129 %plot it
130 multipleplot(actualsignal,handles);
131
132 % --- Executes during object creation, after setting all properties.
133 function popupmenu1_CreateFcn(hObject, eventdata, handles)
134 % hObject handle to popupmenu1 (see GCBO)
135 % eventdata reserved - to be defined in a future version of MATLAB
136 % handles empty - handles not created until after all CreateFcns called
137
138 % Hint: popupmenu controls usually have a white background on Windows.
139 % See ISPC and COMPUTER.
140 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
141 set(hObject,'BackgroundColor','white');
142 end
143
144
145 % --- Executes on button press in pushbutton1.
146 function pushbutton1_Callback(hObject, eventdata, handles)
147 % hObject handle to pushbutton1 (see GCBO)
148 % eventdata reserved - to be defined in a future version of MATLAB
149 % handles structure with handles and user data (see GUIDATA)
150 %% LOAD WAVEFORM
151 global wavfilescell
152 global originalsignal
153 global actualsignal
154
155 %get the number from the popupmenu
156 selectedfileno = get(handles.popupmenu1,'Value');
157
158 %load it
159 [waveform,sfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
160
161 %if it is from OLLO then cut it
162 if regexp(wavfilescell{selectedfileno}, 'S[0-9]*[A-Z]_L[0-9]*_V[0-9]_M[0-9]_N[0-9]_CS0.wav') %pattern for OLLO-files
163 waveform = cutsignal(waveform,sfreq,'a_a');
164 end
165
166 %store it in global variables
167 actualsignal.waveform = waveform;
168 actualsignal.sfreq = sfreq;
169 originalsignal.waveform = waveform;
170 originalsignal.sfreq = sfreq;
171
172 %plot it
173 multipleplot(actualsignal,handles)
174
175
176 % --- Executes during object creation, after setting all properties.
177 function edit1_CreateFcn(hObject, eventdata, handles)
178 % hObject handle to edit1 (see GCBO)
179 % eventdata reserved - to be defined in a future version of MATLAB
180 % handles empty - handles not created until after all CreateFcns called
181
182 % Hint: edit controls usually have a white background on Windows.
183 % See ISPC and COMPUTER.
184 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
185 set(hObject,'BackgroundColor','white');
186 end
187
188
189 % --- Executes on button press in pushbutton2.
190 function pushbutton2_Callback(hObject, eventdata, handles)
191 % hObject handle to pushbutton2 (see GCBO)
192 % eventdata reserved - to be defined in a future version of MATLAB
193 % handles structure with handles and user data (see GUIDATA)
194 %% PLAY THE ACTUAL (MANIPULATED) SIGNAL
195 global actualsignal
196 global toplay
197
198 toplay = audioplayer(actualsignal.waveform,actualsignal.sfreq);
199 play(toplay);
200
201
202 % --- Executes on button press in pushbutton3.
203 function pushbutton3_Callback(hObject, eventdata, handles)
204 % hObject handle to pushbutton3 (see GCBO)
205 % eventdata reserved - to be defined in a future version of MATLAB
206 % handles structure with handles and user data (see GUIDATA)
207
208 %% MANIPULATE SIGNAL
209 global wavfilescell
210 global originalsignal
211 global actualsignal
212
213 actualsignal = originalsignal; %reset
214
215 %% speed factor change
216 speedfactor = str2num(get(handles.edit1,'String'));
217 newfakesfreq=actualsignal.sfreq*speedfactor;
218 if speedfactor == 1
219 else
220 actualsignal.waveform = resample(actualsignal.waveform,actualsignal.sfreq,newfakesfreq);
221 end
222
223 %% low and high pass filter (butterworth)
224 % get the desired filter from radio buttons
225 radiofilterhandles=get(handles.uipanel2,'Children');
226 for iCounter = 1:length(radiofilterhandles)
227 if get(radiofilterhandles(iCounter),'Value') == 1
228 filtertype = get(radiofilterhandles(iCounter),'String');
229 end
230 end
231 % read parameters
232 tmp = get(handles.edit3,'String');
233 cutofffreq=str2num(tmp{1});
234 tmp = get(handles.edit4,'String');
235 filterorder=str2num(tmp{1});
236 %do the filter calculations
237 switch filtertype
238 case 'none'
239 case 'High pass'
240 if isempty(cutofffreq) || isempty(filterorder)
241 error('Please specify cutoff frequency and/or filter order')
242 else
243 [a,b] = butter(filterorder,cutofffreq*2/actualsignal.sfreq,'high');
244 actualsignal.waveform=filter(a,b,actualsignal.waveform);
245 end
246 case 'Low pass'
247 if isempty(cutofffreq)|| isempty(filterorder)
248 error('Please specify cutoff frequency')
249 else
250 [a,b] = butter(filterorder,cutofffreq*2/actualsignal.sfreq,'low');
251 actualsignal.waveform=filter(a,b,actualsignal.waveform);
252 end
253 end
254
255 %additive noise
256 % get the desired filter from radio buttons
257 radionoisehandles=get(handles.uipanel4,'Children');
258 for iCounter = 1:length(radionoisehandles)
259 if get(radionoisehandles(iCounter),'Value') == 1
260 noisetype = get(radionoisehandles(iCounter),'String');
261 end
262 end
263 % read parameters
264 tmp = get(handles.edit5,'String');
265 snr=str2num(tmp{1});
266 %do the noise calculations
267 switch noisetype
268 case 'none'
269 case 'White noise'
270 if isempty(snr)
271 error('Please specify SNR')
272 else
273 whitenoise = rand(length(actualsignal.waveform),1)-0.5;
274 %set level
275 levelsignal = 20*log10(sqrt(mean(actualsignal.waveform.^2)));
276 levelnoise = levelsignal-snr;
277 whitenoise = whitenoise./sqrt(mean(whitenoise.^2)).*10^(levelnoise/20);
278 %20*log10(sqrt(mean(whitenoise.^2)))
279 actualsignal.waveform=actualsignal.waveform+whitenoise;
280 end
281 case 'From file'
282 if isempty(snr)
283 error('Please specify SNR')
284 else
285 selectedfileno = get(handles.popupmenu2,'Value');
286
287 [noisewaveform,noisesfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
288 if noisesfreq == actualsignal.sfreq
289 else
290 noisewaveform = resample(noisewaveform,actualsignal.sfreq,noisesfreq);
291 noisesfreq = actualsignal.sfreq;
292 end
293 if length(noisewaveform) < length(actualsignal.waveform)
294 warning('Noise waveform too short. Noise is looped without fading at the endings!');
295 noisewaveform = repmat(noisewaveform, ceil(length(actualsignal.waveform)/length(noisewaveform)),1);
296 end
297 noisewaveform=noisewaveform(1:length(actualsignal.waveform));
298 %set level
299 levelsignal = 20*log10(sqrt(mean(actualsignal.waveform.^2)));
300 levelnoise = levelsignal-snr;
301 noisewaveform = noisewaveform./sqrt(mean(noisewaveform.^2)).*10^(levelnoise/20);
302 %20*log10(sqrt(mean(noisewaveform.^2)))
303 %finally add the two signals
304 actualsignal.waveform = actualsignal.waveform + noisewaveform;
305 end
306 end
307
308 %plot the resulting manipulated waveform
309 multipleplot(actualsignal,handles);
310
311 % --- Executes during object creation, after setting all properties.
312 function edit3_CreateFcn(hObject, eventdata, handles)
313 % hObject handle to edit3 (see GCBO)
314 % eventdata reserved - to be defined in a future version of MATLAB
315 % handles empty - handles not created until after all CreateFcns called
316
317 % Hint: edit controls usually have a white background on Windows.
318 % See ISPC and COMPUTER.
319 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
320 set(hObject,'BackgroundColor','white');
321 end
322
323
324 % --- Executes during object creation, after setting all properties.
325 function edit4_CreateFcn(hObject, eventdata, handles)
326 % hObject handle to edit4 (see GCBO)
327 % eventdata reserved - to be defined in a future version of MATLAB
328 % handles empty - handles not created until after all CreateFcns called
329
330 % Hint: edit controls usually have a white background on Windows.
331 % See ISPC and COMPUTER.
332 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
333 set(hObject,'BackgroundColor','white');
334 end
335
336
337 % --- Executes during object creation, after setting all properties.
338 function edit5_CreateFcn(hObject, eventdata, handles)
339 % hObject handle to edit5 (see GCBO)
340 % eventdata reserved - to be defined in a future version of MATLAB
341 % handles empty - handles not created until after all CreateFcns called
342
343 % Hint: edit controls usually have a white background on Windows.
344 % See ISPC and COMPUTER.
345 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
346 set(hObject,'BackgroundColor','white');
347 end
348
349
350 % --- Executes during object creation, after setting all properties.
351 function popupmenu2_CreateFcn(hObject, eventdata, handles)
352 % hObject handle to popupmenu2 (see GCBO)
353 % eventdata reserved - to be defined in a future version of MATLAB
354 % handles empty - handles not created until after all CreateFcns called
355
356 % Hint: popupmenu controls usually have a white background on Windows.
357 % See ISPC and COMPUTER.
358 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
359 set(hObject,'BackgroundColor','white');
360 end
361
362
363 % --- Executes on button press in pushbutton4.
364 function pushbutton4_Callback(hObject, eventdata, handles)
365 % hObject handle to pushbutton4 (see GCBO)
366 % eventdata reserved - to be defined in a future version of MATLAB
367 % handles structure with handles and user data (see GUIDATA)
368 %% PLAY THE ORIGINAL WAVEFORM
369 global originalsignal
370 global toplay
371 toplay = audioplayer(originalsignal.waveform,originalsignal.sfreq);
372 play(toplay)
373
374
375 % --- Executes on button press in pushbutton5.
376 function pushbutton5_Callback(hObject, eventdata, handles)
377 % hObject handle to pushbutton5 (see GCBO)
378 % eventdata reserved - to be defined in a future version of MATLAB
379 % handles structure with handles and user data (see GUIDATA)
380 global toplay
381 stop(toplay);
382
383
384 function edit6_Callback(hObject, eventdata, handles)
385 % hObject handle to edit6 (see GCBO)
386 % eventdata reserved - to be defined in a future version of MATLAB
387 % handles structure with handles and user data (see GUIDATA)
388
389 % Hints: get(hObject,'String') returns contents of edit6 as text
390 % str2double(get(hObject,'String')) returns contents of edit6 as a double
391
392
393 % --- Executes during object creation, after setting all properties.
394 function edit6_CreateFcn(hObject, eventdata, handles)
395 % hObject handle to edit6 (see GCBO)
396 % eventdata reserved - to be defined in a future version of MATLAB
397 % handles empty - handles not created until after all CreateFcns called
398
399 % Hint: edit controls usually have a white background on Windows.
400 % See ISPC and COMPUTER.
401 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
402 set(hObject,'BackgroundColor','white');
403 end
404
405 % --- Executes during object creation, after setting all properties.
406 function edit7_CreateFcn(hObject, eventdata, handles)
407 % hObject handle to edit7 (see GCBO)
408 % eventdata reserved - to be defined in a future version of MATLAB
409 % handles empty - handles not created until after all CreateFcns called
410
411 % Hint: edit controls usually have a white background on Windows.
412 % See ISPC and COMPUTER.
413 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
414 set(hObject,'BackgroundColor','white');
415 end
416
417
418 % --- Executes during object creation, after setting all properties.
419 function edit8_CreateFcn(hObject, eventdata, handles)
420 % hObject handle to edit8 (see GCBO)
421 % eventdata reserved - to be defined in a future version of MATLAB
422 % handles empty - handles not created until after all CreateFcns called
423
424 % Hint: edit controls usually have a white background on Windows.
425 % See ISPC and COMPUTER.
426 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
427 set(hObject,'BackgroundColor','white');
428 end
429
430
431 % --- Executes on button press in pushbutton6.
432 function pushbutton6_Callback(hObject, eventdata, handles)
433 % hObject handle to pushbutton6 (see GCBO)
434 % eventdata reserved - to be defined in a future version of MATLAB
435 % handles structure with handles and user data (see GUIDATA)
436
437 %% CALCULATE MAP 1.14 auditory nerve probability output
438 addpath(['..' filesep 'MAP']);
439 addpath(['..' filesep 'utilities']);
440 global actualsignal
441 global AN_HSRoutput
442
443 tmp = get(handles.edit6,'String');
444 level4MAP=str2num(tmp);
445 if isempty(level4MAP)
446 error('Please specify level');
447 end
448
449 tmp = get(handles.edit7,'String');
450 parameterfile=tmp;
451 if isempty(parameterfile)
452 error('Please specify parameter file');
453 end
454
455 % identify model parameter changes if any
456 paramChanges=get(handles.edit8,'string');
457 if ~strcmp(paramChanges, ';'), paramChanges=[paramChanges ';']; end
458 eval(paramChanges);
459
460 %set level
461 actualsignal.waveform = actualsignal.waveform./sqrt(mean(actualsignal.waveform.^2)).*10^(-(94-level4MAP)/20);
462 %20*log10(sqrt(mean(actualsignal.waveform.^2))/20e-6) %reference pressure: 20uPa
463
464 MAP1_14(actualsignal.waveform,actualsignal.sfreq,-1,parameterfile, ...
465 'probability',paramChanges);
466 global ANprobRateOutput savedBFlist
467
468 %take only the HSR fibers
469 AN_HSRoutput = ANprobRateOutput(size(ANprobRateOutput)/2+1:end,:);
470
471 %plot the auditory nerve firing probability as line plot
472 start_time = size(AN_HSRoutput,2)/2/actualsignal.sfreq-0.025; %start time to plot in s
473 end_time = start_time+0.05; %plot 50ms
474 plotIFRAN(AN_HSRoutput,start_time,end_time,actualsignal.sfreq,savedBFlist,handles.axes4);
475 set(handles.edit11,'String',num2str(1000*size(AN_HSRoutput,2)/2/actualsignal.sfreq));
476
477 %plot the fourierhistogram as image plot
478 formantpattern = fourierautocorrelationhistogram_direct(AN_HSRoutput,actualsignal.sfreq,handles.axes5);
479 caxis([0 2000]);
480 colorbar;
481
482 %plot the rate output
483 plotrateOutput(AN_HSRoutput,actualsignal.sfreq,handles.axes6,[33.7 300]);
484 set(handles.radiobutton12,'Value',1);
485
486 %calculate the IPIH
487 ipih=track_formants_from_IPI_guy(AN_HSRoutput, actualsignal.sfreq);
488 %the following code assumes that the bin width is 1/actualsignal.sfreq and
489 %the temporal step size is 3ms
490
491 ipihfreqaxis=1./[1/actualsignal.sfreq:1/actualsignal.sfreq:size(ipih,1)/actualsignal.sfreq];
492 ipihtimeaxis=[0:3:size(ipih,2)*3];
493 set(gcf,'CurrentAxes',handles.axes7);
494 YTickIdx = 1:floor(numel(ipihfreqaxis)/6):numel(ipihfreqaxis);
495 XTickIdx = 1:floor(numel(ipihtimeaxis)/6):numel(ipihtimeaxis);
496 imagesc(ipih);
497 set(gca, 'YTick', YTickIdx);
498 set(gca, 'YTickLabel', num2str( ipihfreqaxis(YTickIdx)', '%0.0f' ));
499 ylabel('best frequency (Hz)')
500 set(gca, 'XTick', XTickIdx);
501 set(gca, 'XTickLabel', XTickIdx.*3);
502 xlabel('Time (ms)');
503 caxis([0 8e4]); %set color
504 colorbar;
505
506 %calculate and plot summarized autocorrelation, code from Ray
507 method.dt=1/actualsignal.sfreq;
508 method.segmentNo=1;
509 method.nonlinCF=savedBFlist;
510
511 minPitch= 80; maxPitch= 4000; numPitches=100; % specify lags
512 pitches=10.^ linspace(log10(minPitch), log10(maxPitch),numPitches);
513 pitches=fliplr(pitches);
514 filteredSACFParams.lags=1./pitches; % autocorrelation lags vector
515 filteredSACFParams.acfTau= .003; % time constant of running ACF
516 filteredSACFParams.lambda= 0.12; % slower filter to smooth ACF
517 filteredSACFParams.lambda= 0.01; % slower filter to smooth ACF
518
519 filteredSACFParams.plotACFs=0; % special plot (see code)
520 filteredSACFParams.plotFilteredSACF=0; % 0 plots unfiltered ACFs
521 filteredSACFParams.plotMoviePauses=.5;%.3 % special plot (see code)
522
523 filteredSACFParams.usePressnitzer=0; % attenuates ACF at long lags
524 filteredSACFParams.lagsProcedure= 'useAllLags';
525 filteredSACFParams.criterionForOmittingLags=3;
526 filteredSACFParams.plotACFsInterval=50;%200;
527
528 % compute ACF
529 %switch saveAN_spikesOrProbability
530 % case 'probability'
531 inputToACF=ANprobRateOutput.^0.5;
532 % otherwise
533 % inputToACF=ANoutput;
534 %end
535
536 disp ('computing ACF...')
537 t=method.dt*(1:length(actualsignal.waveform));
538 [P, BFlist, sacf, boundaryValue] = ...
539 filteredSACF(inputToACF, method, filteredSACFParams);
540 P = real(P); %dont know why sometimes P can be (very slightly) complex
541 disp(' ACF done.')
542
543 % SACF
544 set(gcf,'CurrentAxes',handles.axes8);
545 imagesc(P)
546 ylabel('periodicities (Hz)')
547 xlabel('time (s)')
548 %title(['running smoothed (root) SACF. ' saveAN_spikesOrProbability ' input'])
549 pt=[1 get(gca,'ytick')]; % force top xtick to show
550 set(gca,'ytick',pt)
551 set(gca,'ytickLabel', round(pitches(pt)))
552 tt=get(gca,'xtick');
553 tt=tt(tt<length(t));
554 set(gca,'xtickLabel', round(100*t(tt))/100)
555 colorbar;
556
557 % --- Executes on button press in pushbutton7.
558 function pushbutton7_Callback(hObject, eventdata, handles)
559 % hObject handle to pushbutton7 (see GCBO)
560 % eventdata reserved - to be defined in a future version of MATLAB
561 % handles structure with handles and user data (see GUIDATA)
562
563 %% SHOW THE (PREVIOUSLY STORED) AUDITORY PROFILE CORRESPONDING TO THE
564 %% PARAMETER FILE
565 addpath(['..' filesep 'multithreshold 1.46' filesep]);
566 % read the parameter file
567 tmp = get(handles.edit7,'String');
568 parameterfile=tmp;
569 if isempty(parameterfile)
570 error('Please specify parameter file');
571 end
572
573 %what kind of profiles are in the profiles directory?
574 files_in_profiles = dir(['..' filesep 'profiles' filesep '*.m']);%if exist('',file)
575 done = 0;
576
577 %try to map the specified parameter file to these found in the directory
578 %and
579 for iCounter = 1:length(files_in_profiles)
580 if strfind(files_in_profiles(iCounter).name,parameterfile)
581 %ask the user if this is the correct file - because you'll never
582 %know ;)
583 stringtoask = ['Is ' files_in_profiles(iCounter).name ' the correct profile file?'];
584 Answer = questdlg(stringtoask,'Possible match found','Yes','No','Yes');
585 switch Answer,
586 case 'Yes'
587 plotprofile(files_in_profiles(iCounter).name(1:end-2),'profile_CMA_L');
588 done = 1;
589 case 'No'
590 end %switch
591 end %if
592 end
593 if ~done
594 msgbox('No match for this parameter file found.');
595 end
596
597 function multipleplot(actualsignal,handles)
598 %% FUNCTION TO DO 3 PLOTS
599 time_axis = [0:1/actualsignal.sfreq:(length(actualsignal.waveform)-1)/actualsignal.sfreq];
600
601 %waveform plot (temporal)
602 plot(handles.axes1,time_axis,actualsignal.waveform);
603 set(get(handles.axes1,'XLabel'),'String','Time (s)');
604 set(get(handles.axes1,'YLabel'),'String','Amplitude');
605 set(handles.axes1,'XLim',[0 length(actualsignal.waveform)/actualsignal.sfreq]);
606 highestabsampl = max(abs(actualsignal.waveform))*1.05;
607 set(handles.axes1,'YLim',[-highestabsampl highestabsampl]);
608
609 %average spectrum plot
610 complspectrum = fft(actualsignal.waveform)/(length(actualsignal.waveform));
611 frequency = [0:1/time_axis(end):1/(2*(time_axis(2)-time_axis(1)))];
612 plot(handles.axes2,frequency,20*log10(sqrt(2)*abs(complspectrum(1:round(length(complspectrum)/2)))));
613 set(get(handles.axes2,'XLabel'),'String','frequency (Hz)');
614 set(get(handles.axes2,'YLabel'),'String','fourier amplitude (dB)');
615 set(handles.axes2,'XLim',[100 10000]);
616 set(handles.axes2,'XScale','log');
617
618 %spectrogram plot (10 ms temporal resolution)
619 [s,f,t] = spectrogram(actualsignal.waveform,hann(round(0.01*actualsignal.sfreq)),[],[],actualsignal.sfreq); %10ms short term windows
620 set(gcf,'CurrentAxes',handles.axes3);
621 if max(f)>10000
622 [tmp,idx] = min(abs(f-10000));
623 imagesc(t,f(1:idx),20*log10(abs(s(1:idx,:))));
624 else
625 imagesc(t,f,20*log10(abs(s)));
626 end
627 axis xy;
628 set(get(handles.axes3,'YLabel'),'String','frequency (Hz)');
629 set(get(handles.axes3,'XLabel'),'String','Time (s)');
630
631
632 function plotrateOutput(ratepattern,sfreq,axeshandle,colorrange)
633 %% calculate rate representation and plot, code from Nick
634 global savedBFlist
635 %calculate rate representation
636 ANsmooth = [];%Cannot pre-allocate a size as it is unknown until the enframing
637 hopSize = 10; %ms
638 winSize = 25; %ms
639 winSizeSamples = round(winSize*sfreq/1000);
640 hann = hanning(winSizeSamples);
641 hopSizeSamples = round(hopSize*sfreq/1000);
642 for chan = 1:size(ratepattern,1)
643 f = enframe(ratepattern(chan,:), hann, hopSizeSamples);
644 ANsmooth(chan,:) = mean(f,2)';
645 end
646
647 %plot rate representation
648 time_axis_rate=[0:hopSize/1000:size(ratepattern,2)/sfreq];
649 set(gcf,'CurrentAxes',axeshandle);
650 YTickIdx = 1:floor(numel(savedBFlist)/6):numel(savedBFlist);
651 XTickIdx = 1:floor(numel(time_axis_rate)/6):numel(time_axis_rate);
652 imagesc(ANsmooth);
653 axis xy;
654 set(gca, 'YTick', YTickIdx);
655 set(gca, 'YTickLabel', num2str( savedBFlist(YTickIdx)', '%0.0f' ));
656 ylabel('best frequency (Hz)')
657 set(gca, 'XTick', XTickIdx);
658 set(gca, 'XTickLabel', XTickIdx.*10);
659 xlabel('Time (ms)');
660 caxis(colorrange); %set color from average spontaneous rate to a maximum of 600
661 colorbar;
662
663
664 % --- Executes if the radiobuttons hsr and lsr are changed
665 function radiobuttonselected(source, eventdata)
666
667 global rateaxeshandle
668 global ANprobRateOutput
669 global actualsignal
670
671 selected = get(get(source,'SelectedObject'),'String');
672
673 if isempty(ANprobRateOutput)
674 msgbox('Please calculate AN pattern first!');
675 elseif strcmp(selected,'HSR')
676 AN_HSRoutput = ANprobRateOutput(size(ANprobRateOutput)/2+1:end,:);
677 colorrange = [33.7 300];
678 plotrateOutput(AN_HSRoutput,actualsignal.sfreq,rateaxeshandle,colorrange);
679 else
680 AN_LSRoutput = ANprobRateOutput(1:size(ANprobRateOutput)/2,:);
681 colorrange = [10.7 100];
682 plotrateOutput(AN_LSRoutput,actualsignal.sfreq,rateaxeshandle,colorrange);
683 end
684
685
686 % --- Executes during object creation, after setting all properties.
687 function edit11_CreateFcn(hObject, eventdata, handles)
688 % hObject handle to edit11 (see GCBO)
689 % eventdata reserved - to be defined in a future version of MATLAB
690 % handles empty - handles not created until after all CreateFcns called
691
692 % Hint: edit controls usually have a white background on Windows.
693 % See ISPC and COMPUTER.
694 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
695 set(hObject,'BackgroundColor','white');
696 end
697
698
699 % --- Executes on button press in pushbutton8.
700 function pushbutton8_Callback(hObject, eventdata, handles)
701 % hObject handle to pushbutton8 (see GCBO)
702 % eventdata reserved - to be defined in a future version of MATLAB
703 % handles structure with handles and user data (see GUIDATA)
704 %plot the auditory nerve firing probability as line plot after grabbing the
705 %time value from edit11
706 global AN_HSRoutput
707 global actualsignal
708 global savedBFlist
709
710 middletime = str2num(get(handles.edit11,'String'))/1000;
711
712 start_time = min([size(AN_HSRoutput,2)/actualsignal.sfreq-0.01 max([0 middletime-0.025])]); %start time to plot in s
713 end_time = max([start_time+0.01 min([start_time+0.05 size(AN_HSRoutput,2)/actualsignal.sfreq-0.01])]); %plot max 50ms
714 plotIFRAN(AN_HSRoutput,start_time,end_time,actualsignal.sfreq,savedBFlist,handles.axes4);