diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userProgramsTim/speechmanipulation.m	Mon Nov 28 13:34:28 2011 +0000
@@ -0,0 +1,714 @@
+function varargout = speechmanipulation(varargin)
+% SPEECHMANIPULATION MATLAB code for speechmanipulation.fig
+%      SPEECHMANIPULATION, by itself, creates a new SPEECHMANIPULATION or raises the existing
+%      singleton*.
+%
+%      H = SPEECHMANIPULATION returns the handle to a new SPEECHMANIPULATION or the handle to
+%      the existing singleton*.
+%
+%      SPEECHMANIPULATION('CALLBACK',hObject,eventData,handles,...) calls the local
+%      function named CALLBACK in SPEECHMANIPULATION.M with the given input arguments.
+%
+%      SPEECHMANIPULATION('Property','Value',...) creates a new SPEECHMANIPULATION or raises the
+%      existing singleton*.  Starting from the left, property value pairs are
+%      applied to the GUI before speechmanipulation_OpeningFcn gets called.  An
+%      unrecognized property name or invalid value makes property application
+%      stop.  All inputs are passed to speechmanipulation_OpeningFcn via varargin.
+%
+%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
+%      instance to run (singleton)".
+%
+% See also: GUIDE, GUIDATA, GUIHANDLES
+
+% Edit the above text to modify the response to help speechmanipulation
+
+% Last Modified by GUIDE v2.5 05-Oct-2011 11:21:58
+
+% Begin initialization code - DO NOT EDIT
+gui_Singleton = 1;
+gui_State = struct('gui_Name',       mfilename, ...
+                   'gui_Singleton',  gui_Singleton, ...
+                   'gui_OpeningFcn', @speechmanipulation_OpeningFcn, ...
+                   'gui_OutputFcn',  @speechmanipulation_OutputFcn, ...
+                   'gui_LayoutFcn',  [] , ...
+                   'gui_Callback',   []);
+if nargin && ischar(varargin{1})
+    gui_State.gui_Callback = str2func(varargin{1});
+end
+
+if nargout
+    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
+else
+    gui_mainfcn(gui_State, varargin{:});
+end
+% End initialization code - DO NOT EDIT
+
+
+% --- Executes just before speechmanipulation is made visible.
+function speechmanipulation_OpeningFcn(hObject, eventdata, handles, varargin)
+% This function has no output args, see OutputFcn.
+% hObject    handle to figure
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+% varargin   command line arguments to speechmanipulation (see VARARGIN)
+global wavfilescell;
+global rateaxeshandle; %handle to axis6 is needed, if radiobuttons12 and 13 change
+
+
+% Choose default command line output for speechmanipulation
+handles.output = hObject;
+
+% Update handles structure
+guidata(hObject, handles);
+
+% UIWAIT makes speechmanipulation wait for user response (see UIRESUME)
+% uiwait(handles.figure1);
+wavfiles = dir(['..' filesep 'wavFileStore' filesep '*.wav']);
+for iCounter = 1:length(wavfiles)
+    wavfilescell{iCounter} = wavfiles(iCounter).name;
+end
+set(handles.popupmenu1,'String',wavfilescell);
+set(handles.popupmenu2,'String',wavfilescell);
+set(handles.uipanel8,'SelectionChangeFcn',@radiobuttonselected);
+rateaxeshandle = handles.axes6;
+
+% --- Outputs from this function are returned to the command line.
+function varargout = speechmanipulation_OutputFcn(hObject, eventdata, handles) 
+% varargout  cell array for returning output args (see VARARGOUT);
+% hObject    handle to figure
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Get default command line output from handles structure
+varargout{1} = handles.output;
+
+function edit1_Callback(hObject, eventdata, handles)
+function edit2_Callback(hObject, eventdata, handles)
+function edit3_Callback(hObject, eventdata, handles)
+function edit4_Callback(hObject, eventdata, handles)
+function edit5_Callback(hObject, eventdata, handles)
+function edit6_Callback(hObject, eventdata, handles)
+function edit7_Callback(hObject, eventdata, handles)
+function edit8_Callback(hObject, eventdata, handles)
+function edit9_Callback(hObject, eventdata, handles)
+function edit10_Callback(hObject, eventdata, handles)
+function edit11_Callback(hObject, eventdata, handles)
+function edit12_Callback(hObject, eventdata, handles)
+
+
+% --- Executes on selection change in popupmenu1.
+function popupmenu1_Callback(hObject, eventdata, handles)
+% hObject    handle to popupmenu1 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
+%        contents{get(hObject,'Value')} returns selected item from popupmenu1
+%% CHOOSE AND LOAD WAVEFORM
+global wavfilescell
+global originalsignal
+global actualsignal
+
+%get the number from the popupmenu
+selectedfileno = get(handles.popupmenu1,'Value');
+
+%load it
+[waveform,sfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
+
+%if it is from OLLO then cut it
+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
+    waveform = cutsignal(waveform,sfreq,'a_a');
+end
+
+%store it in global variables
+actualsignal.waveform = waveform;
+actualsignal.sfreq = sfreq;
+originalsignal.waveform = waveform;
+originalsignal.sfreq = sfreq;
+
+%plot it
+multipleplot(actualsignal,handles);
+
+% --- Executes during object creation, after setting all properties.
+function popupmenu1_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to popupmenu1 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes on button press in pushbutton1.
+function pushbutton1_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton1 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%% LOAD WAVEFORM
+global wavfilescell
+global originalsignal
+global actualsignal
+
+%get the number from the popupmenu
+selectedfileno = get(handles.popupmenu1,'Value');
+
+%load it
+[waveform,sfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
+
+%if it is from OLLO then cut it
+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
+    waveform = cutsignal(waveform,sfreq,'a_a');
+end
+
+%store it in global variables
+actualsignal.waveform = waveform;
+actualsignal.sfreq = sfreq;
+originalsignal.waveform = waveform;
+originalsignal.sfreq = sfreq;
+
+%plot it
+multipleplot(actualsignal,handles)
+
+
+% --- Executes during object creation, after setting all properties.
+function edit1_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit1 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes on button press in pushbutton2.
+function pushbutton2_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton2 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%% PLAY THE ACTUAL (MANIPULATED) SIGNAL
+global actualsignal
+global toplay
+
+toplay = audioplayer(actualsignal.waveform,actualsignal.sfreq);
+play(toplay);
+
+
+% --- Executes on button press in pushbutton3.
+function pushbutton3_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton3 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+%% MANIPULATE SIGNAL
+global wavfilescell
+global originalsignal
+global actualsignal
+
+actualsignal = originalsignal; %reset
+
+%% speed factor change
+speedfactor = str2num(get(handles.edit1,'String'));
+newfakesfreq=actualsignal.sfreq*speedfactor;
+if speedfactor == 1
+else
+    actualsignal.waveform = resample(actualsignal.waveform,actualsignal.sfreq,newfakesfreq);
+end
+
+%% low and high pass filter (butterworth)
+% get the desired filter from radio buttons
+radiofilterhandles=get(handles.uipanel2,'Children');
+for iCounter = 1:length(radiofilterhandles)
+    if get(radiofilterhandles(iCounter),'Value') == 1
+        filtertype = get(radiofilterhandles(iCounter),'String');
+    end
+end
+% read parameters
+tmp = get(handles.edit3,'String');
+cutofffreq=str2num(tmp{1});
+tmp = get(handles.edit4,'String');
+filterorder=str2num(tmp{1});
+%do the filter calculations
+switch filtertype
+    case 'none'
+    case 'High pass'
+        if isempty(cutofffreq) || isempty(filterorder)
+            error('Please specify cutoff frequency and/or filter order')
+        else
+            [a,b] = butter(filterorder,cutofffreq*2/actualsignal.sfreq,'high');
+            actualsignal.waveform=filter(a,b,actualsignal.waveform);
+        end
+    case 'Low pass'
+        if isempty(cutofffreq)|| isempty(filterorder)
+            error('Please specify cutoff frequency')
+        else
+            [a,b] = butter(filterorder,cutofffreq*2/actualsignal.sfreq,'low');
+            actualsignal.waveform=filter(a,b,actualsignal.waveform);
+        end
+end
+
+%additive noise
+% get the desired filter from radio buttons
+radionoisehandles=get(handles.uipanel4,'Children');
+for iCounter = 1:length(radionoisehandles)
+    if get(radionoisehandles(iCounter),'Value') == 1
+        noisetype = get(radionoisehandles(iCounter),'String');
+    end
+end      
+% read parameters
+tmp = get(handles.edit5,'String');
+snr=str2num(tmp{1});
+%do the noise calculations
+switch noisetype
+    case 'none'
+    case 'White noise'
+        if isempty(snr) 
+            error('Please specify SNR')
+        else
+            whitenoise = rand(length(actualsignal.waveform),1)-0.5;
+            %set level
+            levelsignal = 20*log10(sqrt(mean(actualsignal.waveform.^2)));
+            levelnoise = levelsignal-snr;
+            whitenoise = whitenoise./sqrt(mean(whitenoise.^2)).*10^(levelnoise/20);
+            %20*log10(sqrt(mean(whitenoise.^2)))
+            actualsignal.waveform=actualsignal.waveform+whitenoise;
+        end
+    case 'From file'
+        if isempty(snr) 
+            error('Please specify SNR')
+        else
+            selectedfileno = get(handles.popupmenu2,'Value');
+
+            [noisewaveform,noisesfreq] = wavread(['..' filesep 'wavFileStore' filesep wavfilescell{selectedfileno}]);
+            if noisesfreq == actualsignal.sfreq
+            else
+                noisewaveform = resample(noisewaveform,actualsignal.sfreq,noisesfreq);
+                noisesfreq = actualsignal.sfreq;
+            end
+            if length(noisewaveform) < length(actualsignal.waveform)
+                warning('Noise waveform too short. Noise is looped without fading at the endings!');
+                noisewaveform = repmat(noisewaveform, ceil(length(actualsignal.waveform)/length(noisewaveform)),1);
+            end
+            noisewaveform=noisewaveform(1:length(actualsignal.waveform));
+            %set level
+            levelsignal = 20*log10(sqrt(mean(actualsignal.waveform.^2)));
+            levelnoise = levelsignal-snr;
+            noisewaveform = noisewaveform./sqrt(mean(noisewaveform.^2)).*10^(levelnoise/20);
+            %20*log10(sqrt(mean(noisewaveform.^2)))
+            %finally add the two signals
+            actualsignal.waveform = actualsignal.waveform + noisewaveform;
+        end
+end
+
+%plot the resulting manipulated waveform
+multipleplot(actualsignal,handles);
+
+% --- Executes during object creation, after setting all properties.
+function edit3_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit3 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes during object creation, after setting all properties.
+function edit4_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit4 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes during object creation, after setting all properties.
+function edit5_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit5 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes during object creation, after setting all properties.
+function popupmenu2_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to popupmenu2 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: popupmenu controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes on button press in pushbutton4.
+function pushbutton4_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton4 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%% PLAY THE ORIGINAL WAVEFORM
+global originalsignal
+global toplay
+toplay = audioplayer(originalsignal.waveform,originalsignal.sfreq);
+play(toplay)
+
+
+% --- Executes on button press in pushbutton5.
+function pushbutton5_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton5 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+global toplay
+stop(toplay);
+
+
+function edit6_Callback(hObject, eventdata, handles)
+% hObject    handle to edit6 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+% Hints: get(hObject,'String') returns contents of edit6 as text
+%        str2double(get(hObject,'String')) returns contents of edit6 as a double
+
+
+% --- Executes during object creation, after setting all properties.
+function edit6_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit6 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+% --- Executes during object creation, after setting all properties.
+function edit7_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit7 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes during object creation, after setting all properties.
+function edit8_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit8 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes on button press in pushbutton6.
+function pushbutton6_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton6 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+%% CALCULATE MAP 1.14 auditory nerve probability output
+addpath(['..' filesep 'MAP']);
+addpath(['..' filesep 'utilities']);
+global actualsignal
+global AN_HSRoutput
+
+tmp = get(handles.edit6,'String');
+level4MAP=str2num(tmp);
+if isempty(level4MAP)
+    error('Please specify level');
+end
+
+tmp = get(handles.edit7,'String');
+parameterfile=tmp;
+if isempty(parameterfile)
+    error('Please specify parameter file');
+end
+
+% identify model parameter changes if any
+paramChanges=get(handles.edit8,'string');
+if ~strcmp(paramChanges, ';'), paramChanges=[paramChanges ';']; end
+eval(paramChanges);
+
+%set level
+actualsignal.waveform = actualsignal.waveform./sqrt(mean(actualsignal.waveform.^2)).*10^(-(94-level4MAP)/20);
+%20*log10(sqrt(mean(actualsignal.waveform.^2))/20e-6) %reference pressure: 20uPa
+
+MAP1_14(actualsignal.waveform,actualsignal.sfreq,-1,parameterfile, ...
+    'probability',paramChanges);
+global ANprobRateOutput savedBFlist
+
+%take only the HSR fibers
+AN_HSRoutput = ANprobRateOutput(size(ANprobRateOutput)/2+1:end,:);
+
+%plot the auditory nerve firing probability as line plot
+start_time = size(AN_HSRoutput,2)/2/actualsignal.sfreq-0.025; %start time to plot in s
+end_time = start_time+0.05; %plot 50ms
+plotIFRAN(AN_HSRoutput,start_time,end_time,actualsignal.sfreq,savedBFlist,handles.axes4);
+set(handles.edit11,'String',num2str(1000*size(AN_HSRoutput,2)/2/actualsignal.sfreq));
+
+%plot the fourierhistogram as image plot
+formantpattern = fourierautocorrelationhistogram_direct(AN_HSRoutput,actualsignal.sfreq,handles.axes5);
+caxis([0 2000]);
+colorbar;
+
+%plot the rate output
+plotrateOutput(AN_HSRoutput,actualsignal.sfreq,handles.axes6,[33.7 300]);
+set(handles.radiobutton12,'Value',1);
+
+%calculate the IPIH
+ipih=track_formants_from_IPI_guy(AN_HSRoutput, actualsignal.sfreq);
+%the following code assumes that the bin width is 1/actualsignal.sfreq and 
+%the temporal step size is 3ms
+
+ipihfreqaxis=1./[1/actualsignal.sfreq:1/actualsignal.sfreq:size(ipih,1)/actualsignal.sfreq];
+ipihtimeaxis=[0:3:size(ipih,2)*3];
+set(gcf,'CurrentAxes',handles.axes7);
+YTickIdx = 1:floor(numel(ipihfreqaxis)/6):numel(ipihfreqaxis);
+XTickIdx = 1:floor(numel(ipihtimeaxis)/6):numel(ipihtimeaxis);
+imagesc(ipih);
+set(gca, 'YTick', YTickIdx);
+set(gca, 'YTickLabel', num2str(  ipihfreqaxis(YTickIdx)', '%0.0f' ));
+ylabel('best frequency (Hz)')
+set(gca, 'XTick', XTickIdx);
+set(gca, 'XTickLabel', XTickIdx.*3);
+xlabel('Time (ms)');
+caxis([0 8e4]); %set color 
+colorbar;
+
+%calculate and plot summarized autocorrelation, code from Ray
+method.dt=1/actualsignal.sfreq;
+method.segmentNo=1;
+method.nonlinCF=savedBFlist;
+
+minPitch=	80; maxPitch=	4000; numPitches=100;    % specify lags
+pitches=10.^ linspace(log10(minPitch), log10(maxPitch),numPitches);
+pitches=fliplr(pitches);
+filteredSACFParams.lags=1./pitches;     % autocorrelation lags vector
+filteredSACFParams.acfTau=	.003;       % time constant of running ACF
+filteredSACFParams.lambda=	0.12;       % slower filter to smooth ACF
+filteredSACFParams.lambda=	0.01;       % slower filter to smooth ACF
+
+filteredSACFParams.plotACFs=0;          % special plot (see code)
+filteredSACFParams.plotFilteredSACF=0;  % 0 plots unfiltered ACFs
+filteredSACFParams.plotMoviePauses=.5;%.3          % special plot (see code)
+
+filteredSACFParams.usePressnitzer=0; % attenuates ACF at  long lags
+filteredSACFParams.lagsProcedure=  'useAllLags';
+filteredSACFParams.criterionForOmittingLags=3;
+filteredSACFParams.plotACFsInterval=50;%200;
+
+% compute ACF
+%switch saveAN_spikesOrProbability
+%    case 'probability'
+        inputToACF=ANprobRateOutput.^0.5;
+%    otherwise
+%        inputToACF=ANoutput;
+%end
+
+disp ('computing ACF...')
+t=method.dt*(1:length(actualsignal.waveform));
+[P, BFlist, sacf, boundaryValue] = ...
+    filteredSACF(inputToACF, method, filteredSACFParams);
+P = real(P); %dont know why sometimes P can be (very slightly) complex
+disp(' ACF done.')
+
+% SACF
+set(gcf,'CurrentAxes',handles.axes8);
+imagesc(P)
+ylabel('periodicities (Hz)')
+xlabel('time (s)')
+%title(['running smoothed (root) SACF. ' saveAN_spikesOrProbability ' input'])
+pt=[1 get(gca,'ytick')]; % force top xtick to show
+set(gca,'ytick',pt)
+set(gca,'ytickLabel', round(pitches(pt)))
+tt=get(gca,'xtick');
+tt=tt(tt<length(t));
+set(gca,'xtickLabel', round(100*t(tt))/100)
+colorbar;
+
+% --- Executes on button press in pushbutton7.
+function pushbutton7_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton7 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+
+%% SHOW THE  (PREVIOUSLY STORED) AUDITORY PROFILE CORRESPONDING TO THE
+%% PARAMETER FILE
+addpath(['..' filesep 'multithreshold 1.46' filesep]);
+% read the parameter file
+tmp = get(handles.edit7,'String');
+parameterfile=tmp;
+if isempty(parameterfile)
+    error('Please specify parameter file');
+end
+
+%what kind of profiles are in the profiles directory?
+files_in_profiles = dir(['..' filesep 'profiles' filesep '*.m']);%if exist('',file)
+done = 0;
+
+%try to map the specified parameter file to these found in the directory
+%and
+for iCounter = 1:length(files_in_profiles)
+    if strfind(files_in_profiles(iCounter).name,parameterfile)
+        %ask the user if this is the correct file - because you'll never
+        %know ;)
+        stringtoask = ['Is ' files_in_profiles(iCounter).name ' the correct profile file?'];
+        Answer = questdlg(stringtoask,'Possible match found','Yes','No','Yes');
+        switch Answer,
+            case 'Yes'
+                plotprofile(files_in_profiles(iCounter).name(1:end-2),'profile_CMA_L');
+                done = 1;
+            case 'No'
+        end %switch
+    end %if
+end
+if ~done
+    msgbox('No match for this parameter file found.');
+end
+
+function multipleplot(actualsignal,handles)
+%% FUNCTION TO DO 3 PLOTS
+time_axis = [0:1/actualsignal.sfreq:(length(actualsignal.waveform)-1)/actualsignal.sfreq];
+
+%waveform plot (temporal)
+plot(handles.axes1,time_axis,actualsignal.waveform);
+set(get(handles.axes1,'XLabel'),'String','Time (s)');
+set(get(handles.axes1,'YLabel'),'String','Amplitude');
+set(handles.axes1,'XLim',[0 length(actualsignal.waveform)/actualsignal.sfreq]);
+highestabsampl = max(abs(actualsignal.waveform))*1.05;
+set(handles.axes1,'YLim',[-highestabsampl highestabsampl]);
+
+%average spectrum plot
+complspectrum = fft(actualsignal.waveform)/(length(actualsignal.waveform));
+frequency = [0:1/time_axis(end):1/(2*(time_axis(2)-time_axis(1)))];
+plot(handles.axes2,frequency,20*log10(sqrt(2)*abs(complspectrum(1:round(length(complspectrum)/2)))));
+set(get(handles.axes2,'XLabel'),'String','frequency (Hz)');
+set(get(handles.axes2,'YLabel'),'String','fourier amplitude (dB)');
+set(handles.axes2,'XLim',[100 10000]);
+set(handles.axes2,'XScale','log');
+
+%spectrogram plot (10 ms temporal resolution)
+[s,f,t] = spectrogram(actualsignal.waveform,hann(round(0.01*actualsignal.sfreq)),[],[],actualsignal.sfreq); %10ms short term windows
+set(gcf,'CurrentAxes',handles.axes3);
+if max(f)>10000
+    [tmp,idx] = min(abs(f-10000));
+    imagesc(t,f(1:idx),20*log10(abs(s(1:idx,:))));
+else
+    imagesc(t,f,20*log10(abs(s)));
+end
+axis xy;
+set(get(handles.axes3,'YLabel'),'String','frequency (Hz)');
+set(get(handles.axes3,'XLabel'),'String','Time (s)');
+
+
+function plotrateOutput(ratepattern,sfreq,axeshandle,colorrange)
+%% calculate rate representation and plot, code from Nick
+global savedBFlist
+%calculate rate representation
+ANsmooth = [];%Cannot pre-allocate a size as it is unknown until the enframing
+hopSize = 10; %ms
+winSize = 25; %ms
+winSizeSamples = round(winSize*sfreq/1000);
+hann = hanning(winSizeSamples);
+hopSizeSamples = round(hopSize*sfreq/1000);
+for chan = 1:size(ratepattern,1)
+    f = enframe(ratepattern(chan,:), hann, hopSizeSamples);
+    ANsmooth(chan,:) = mean(f,2)';
+end
+
+%plot rate representation
+time_axis_rate=[0:hopSize/1000:size(ratepattern,2)/sfreq];
+set(gcf,'CurrentAxes',axeshandle);
+YTickIdx = 1:floor(numel(savedBFlist)/6):numel(savedBFlist);
+XTickIdx = 1:floor(numel(time_axis_rate)/6):numel(time_axis_rate);
+imagesc(ANsmooth);
+axis xy;
+set(gca, 'YTick', YTickIdx);
+set(gca, 'YTickLabel', num2str(  savedBFlist(YTickIdx)', '%0.0f' ));
+ylabel('best frequency (Hz)')
+set(gca, 'XTick', XTickIdx);
+set(gca, 'XTickLabel', XTickIdx.*10);
+xlabel('Time (ms)');
+caxis(colorrange); %set color from average spontaneous rate to a maximum of 600
+colorbar;
+
+
+% --- Executes if the radiobuttons hsr and lsr are changed
+function radiobuttonselected(source, eventdata)
+
+global rateaxeshandle
+global ANprobRateOutput
+global actualsignal
+
+selected = get(get(source,'SelectedObject'),'String');
+
+if isempty(ANprobRateOutput)
+    msgbox('Please calculate AN pattern first!');
+elseif strcmp(selected,'HSR')
+    AN_HSRoutput = ANprobRateOutput(size(ANprobRateOutput)/2+1:end,:);
+    colorrange = [33.7 300];
+    plotrateOutput(AN_HSRoutput,actualsignal.sfreq,rateaxeshandle,colorrange);
+else
+    AN_LSRoutput = ANprobRateOutput(1:size(ANprobRateOutput)/2,:);
+    colorrange = [10.7 100];
+    plotrateOutput(AN_LSRoutput,actualsignal.sfreq,rateaxeshandle,colorrange);
+end
+
+
+% --- Executes during object creation, after setting all properties.
+function edit11_CreateFcn(hObject, eventdata, handles)
+% hObject    handle to edit11 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    empty - handles not created until after all CreateFcns called
+
+% Hint: edit controls usually have a white background on Windows.
+%       See ISPC and COMPUTER.
+if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
+    set(hObject,'BackgroundColor','white');
+end
+
+
+% --- Executes on button press in pushbutton8.
+function pushbutton8_Callback(hObject, eventdata, handles)
+% hObject    handle to pushbutton8 (see GCBO)
+% eventdata  reserved - to be defined in a future version of MATLAB
+% handles    structure with handles and user data (see GUIDATA)
+%plot the auditory nerve firing probability as line plot after grabbing the
+%time value from edit11
+global AN_HSRoutput
+global actualsignal
+global savedBFlist
+
+middletime = str2num(get(handles.edit11,'String'))/1000;
+
+start_time = min([size(AN_HSRoutput,2)/actualsignal.sfreq-0.01 max([0 middletime-0.025])]); %start time to plot in s
+end_time = max([start_time+0.01 min([start_time+0.05 size(AN_HSRoutput,2)/actualsignal.sfreq-0.01])]); %plot max 50ms
+plotIFRAN(AN_HSRoutput,start_time,end_time,actualsignal.sfreq,savedBFlist,handles.axes4);