Dawn@4: function varargout = vs_ParameterEstimation(varargin) Dawn@4: % VS_PARAMETERESTIMATION M-file for vs_ParameterEstimation.fig Dawn@4: % VS_PARAMETERESTIMATION, by itself, creates a new VS_PARAMETERESTIMATION or raises the existing Dawn@4: % singleton*. Dawn@4: % Dawn@4: % H = VS_PARAMETERESTIMATION returns the handle to a new VS_PARAMETERESTIMATION or the handle to Dawn@4: % the existing singleton*. Dawn@4: % Dawn@4: % VS_PARAMETERESTIMATION('CALLBACK',hObject,eventData,handles,...) calls the local Dawn@4: % function named CALLBACK in VS_PARAMETERESTIMATION.M with the given input arguments. Dawn@4: % Dawn@4: % VS_PARAMETERESTIMATION('Property','Value',...) creates a new VS_PARAMETERESTIMATION or raises the Dawn@4: % existing singleton*. Starting from the left, property value pairs are Dawn@4: % applied to the GUI before vs_ParameterEstimation_OpeningFcn gets called. An Dawn@4: % unrecognized property name or invalid value makes property application Dawn@4: % stop. All inputs are passed to vs_ParameterEstimation_OpeningFcn via varargin. Dawn@4: % Dawn@4: % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one Dawn@4: % instance to run (singleton)". Dawn@4: % Dawn@4: % See also: GUIDE, GUIDATA, GUIHANDLES Dawn@4: Dawn@4: % Edit the above text to modify the response to help vs_ParameterEstimation Dawn@4: Dawn@4: % Last Modified by GUIDE v2.5 19-Oct-2009 11:55:41 Dawn@4: Dawn@4: % Begin initialization code - DO NOT EDIT Dawn@4: gui_Singleton = 1; Dawn@4: gui_State = struct('gui_Name', mfilename, ... Dawn@4: 'gui_Singleton', gui_Singleton, ... Dawn@4: 'gui_OpeningFcn', @vs_ParameterEstimation_OpeningFcn, ... Dawn@4: 'gui_OutputFcn', @vs_ParameterEstimation_OutputFcn, ... Dawn@4: 'gui_LayoutFcn', [] , ... Dawn@4: 'gui_Callback', []); Dawn@4: if nargin && ischar(varargin{1}) Dawn@4: gui_State.gui_Callback = str2func(varargin{1}); Dawn@4: end Dawn@4: Dawn@4: if nargout Dawn@4: [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); Dawn@4: else Dawn@4: gui_mainfcn(gui_State, varargin{:}); Dawn@4: end Dawn@4: % End initialization code - DO NOT EDIT Dawn@4: Dawn@4: Dawn@4: % --- Executes just before vs_ParameterEstimation is made visible. Dawn@4: function vs_ParameterEstimation_OpeningFcn(hObject, eventdata, handles, varargin) Dawn@4: % This function has no output args, see OutputFcn. Dawn@4: % hObject handle to figure Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: % varargin command line arguments to vs_ParameterEstimation (see VARARGIN) Dawn@4: Dawn@4: % Choose default command line output for vs_ParameterEstimation Dawn@4: handles.output = hObject; Dawn@4: Dawn@4: % YS: get the settings from the main figure Dawn@4: if (~isfield(handles, 'VSHandle')) Dawn@4: VSHandle = VoiceSauce; Dawn@4: handles.VSHandle = VSHandle; Dawn@4: end Dawn@4: Dawn@4: % set up the text fields with default values Dawn@4: setGUIVariables(handles); Dawn@4: Dawn@4: set(handles.listbox_filelist, 'KeyPressFcn', @filelist_listbox_KeyPressFcn); Dawn@4: Dawn@4: % Update handles structure Dawn@4: guidata(hObject, handles); Dawn@4: Dawn@4: % UIWAIT makes vs_ParameterEstimation wait for user response (see UIRESUME) Dawn@4: % uiwait(handles.figure_ParameterEstimation); Dawn@4: Dawn@4: Dawn@4: function setGUIVariables(handles) Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: set(handles.edit_inputdirectory, 'String', VSData.vars.wavdir); Dawn@4: set(handles.edit_outputdirectory, 'String', VSData.vars.matdir); Dawn@4: Dawn@4: set(handles.checkbox_savematwithwav, 'Value', VSData.vars.PE_savematwithwav); Dawn@4: set(handles.checkbox_process16khz, 'Value', VSData.vars.PE_processwith16k); Dawn@4: set(handles.checkbox_useTextgrid, 'Value', VSData.vars.PE_useTextgrid); Dawn@4: set(handles.checkbox_showwaveform, 'Value', VSData.vars.PE_showwaveforms); % turn this off at startup Dawn@4: Dawn@4: Dawn@4: if (VSData.vars.recursedir) Dawn@4: func_setlistbox(handles.listbox_filelist, VSData.vars.wavdir, 'recurse', VSData.vars, VSData.vars.I_searchstring); Dawn@4: else Dawn@4: func_setlistbox(handles.listbox_filelist, VSData.vars.wavdir, 'none', VSData.vars, VSData.vars.I_searchstring); Dawn@4: end Dawn@4: Dawn@4: if (VSData.vars.PE_savematwithwav == 1) Dawn@4: set(handles.edit_outputdirectory, 'Enable', 'Off'); Dawn@4: set(handles.pushbutton_outputBrowse, 'Enable', 'Off'); Dawn@4: else Dawn@4: set(handles.edit_outputdirectory, 'Enable', 'On'); Dawn@4: set(handles.pushbutton_outputBrowse, 'Enable', 'On'); Dawn@4: end Dawn@4: Dawn@4: if (length(VSData.vars.PE_params) == 0) Dawn@4: set(handles.edit_parameterselection, 'String', 'None'); Dawn@4: elseif (length(VSData.vars.PE_params) == length(func_getparameterlist())) Dawn@4: set(handles.edit_parameterselection, 'String', 'All'); Dawn@4: else Dawn@4: set(handles.edit_parameterselection, 'String', 'Custom'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: function filelist_listbox_KeyPressFcn(hObject, eventdata) Dawn@4: handles = guidata(hObject); Dawn@4: Dawn@4: key = double(get(gcbf, 'CurrentCharacter')); Dawn@4: if (gcbo == handles.listbox_filelist) Dawn@4: if (key == 127) % delete key Dawn@4: Dawn@4: inx = get(handles.listbox_filelist, 'Value'); Dawn@4: contents = get(handles.listbox_filelist, 'String'); Dawn@4: Dawn@4: %nothing to do Dawn@4: if (isempty(contents)) Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: newinx = setxor(inx, [1:length(contents)]); Dawn@4: Dawn@4: newcontents = contents(newinx); Dawn@4: set(handles.listbox_filelist, 'String', newcontents); Dawn@4: Dawn@4: if (inx(end) > length(newcontents)) Dawn@4: set(handles.listbox_filelist, 'Value', length(newcontents)); Dawn@4: else Dawn@4: set(handles.listbox_filelist, 'Value', inx(end)); Dawn@4: end Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: % --- Outputs from this function are returned to the command line. Dawn@4: function varargout = vs_ParameterEstimation_OutputFcn(hObject, eventdata, handles) Dawn@4: % varargout cell array for returning output args (see VARARGOUT); Dawn@4: % hObject handle to figure Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: % Get default command line output from handles structure Dawn@4: varargout{1} = handles.output; Dawn@4: Dawn@4: Dawn@4: % --- Executes on selection change in listbox_filelist. Dawn@4: function listbox_filelist_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to listbox_filelist (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: if (get(handles.checkbox_showwaveform, 'Value') == 1) Dawn@4: plotCurrentWav(handles); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes during object creation, after setting all properties. Dawn@4: function listbox_filelist_CreateFcn(hObject, eventdata, handles) Dawn@4: % hObject handle to listbox_filelist (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles empty - handles not created until after all CreateFcns called Dawn@4: Dawn@4: % Hint: listbox controls usually have a white background on Windows. Dawn@4: % See ISPC and COMPUTER. Dawn@4: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) Dawn@4: set(hObject,'BackgroundColor','white'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: function edit_inputdirectory_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_inputdirectory (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: new_dir = get(handles.edit_inputdirectory, 'String'); Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: if (exist(new_dir, 'dir') == 7) % check if new_dir exists Dawn@4: VSData.vars.wavdir = new_dir; Dawn@4: set(handles.edit_inputdirectory, 'String', new_dir); Dawn@4: Dawn@4: if (get(handles.checkbox_savematwithwav, 'Value') == 1) % change output dir too Dawn@4: set(handles.edit_outputdirectory, 'String', new_dir); Dawn@4: Dawn@4: VSData = func_setmatdir('matdir', new_dir, VSData); Dawn@4: end Dawn@4: Dawn@4: % update the listbox Dawn@4: if (VSData.vars.recursedir == 1) Dawn@4: func_setlistbox(handles.listbox_filelist, new_dir, 'recurse', VSData.vars, VSData.vars.I_searchstring); Dawn@4: else Dawn@4: func_setlistbox(handles.listbox_filelist, new_dir, 'none', VSData.vars, VSData.vars.I_searchstring); Dawn@4: end Dawn@4: Dawn@4: VSData = func_setwavdir('wavdir', new_dir, VSData); Dawn@4: Dawn@4: % update the variables Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: else Dawn@4: msgbox('Error: directory not found.', 'Error', 'error', 'modal'); Dawn@4: set(hObject, 'String', VSData.vars.wavdir); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes during object creation, after setting all properties. Dawn@4: function edit_inputdirectory_CreateFcn(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_inputdirectory (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles empty - handles not created until after all CreateFcns called Dawn@4: Dawn@4: % Hint: edit controls usually have a white background on Windows. Dawn@4: % See ISPC and COMPUTER. Dawn@4: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) Dawn@4: set(hObject,'BackgroundColor','white'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in pushbutton_inputBrowse. Dawn@4: function pushbutton_inputBrowse_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to pushbutton_inputBrowse (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: current_dir = get(handles.edit_inputdirectory, 'String'); Dawn@4: new_dir = uigetdir(current_dir); Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: if (ischar(new_dir)) % check if a new dir was returned Dawn@4: VSData.vars.wavdir = new_dir; Dawn@4: set(handles.edit_inputdirectory, 'String', new_dir); Dawn@4: Dawn@4: if (get(handles.checkbox_savematwithwav, 'Value') == 1) % change output dir too Dawn@4: set(handles.edit_outputdirectory, 'String', new_dir); Dawn@4: Dawn@4: VSData = func_setmatdir('matdir', new_dir, VSData); Dawn@4: end Dawn@4: Dawn@4: % update the listbox Dawn@4: if (VSData.vars.recursedir == 1) Dawn@4: func_setlistbox(handles.listbox_filelist, new_dir, 'recurse', VSData.vars, VSData.vars.I_searchstring); Dawn@4: else Dawn@4: func_setlistbox(handles.listbox_filelist, new_dir, 'none', VSData.vars, VSData.vars.I_searchstring); Dawn@4: end Dawn@4: Dawn@4: VSData = func_setwavdir('wavdir', new_dir, VSData); Dawn@4: Dawn@4: % update the variables Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: function edit_outputdirectory_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_outputdirectory (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: if (strcmp(get(hObject, 'Enable'), 'on')) Dawn@4: new_dir = get(handles.edit_outputdirectory, 'String'); Dawn@4: Dawn@4: if (exist(new_dir, 'dir') == 7) Dawn@4: set(handles.edit_outputdirectory, 'String', new_dir); Dawn@4: Dawn@4: VSData = func_setmatdir('matdir', new_dir, VSData); Dawn@4: Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: else Dawn@4: msgbox('Error: Directory not found.', 'Error', 'error', 'modal'); Dawn@4: set(hObject, 'String', VSData.vars.matdir); Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: % --- Executes during object creation, after setting all properties. Dawn@4: function edit_outputdirectory_CreateFcn(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_outputdirectory (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles empty - handles not created until after all CreateFcns called Dawn@4: Dawn@4: % Hint: edit controls usually have a white background on Windows. Dawn@4: % See ISPC and COMPUTER. Dawn@4: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) Dawn@4: set(hObject,'BackgroundColor','white'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in pushbutton_outputBrowse. Dawn@4: function pushbutton_outputBrowse_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to pushbutton_outputBrowse (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: if (strcmp(get(hObject, 'Enable'), 'on')) Dawn@4: curr_dir = get(handles.edit_outputdirectory, 'String'); Dawn@4: new_dir = uigetdir(curr_dir); Dawn@4: Dawn@4: if (ischar(new_dir)) Dawn@4: set(handles.edit_outputdirectory, 'String', new_dir); Dawn@4: Dawn@4: VSData = func_setmatdir('matdir', new_dir, VSData); Dawn@4: Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in checkbox_savematwithwav. Dawn@4: function checkbox_savematwithwav_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to checkbox_savematwithwav (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: VSData.vars.PE_savematwithwav = get(hObject, 'Value'); Dawn@4: Dawn@4: if (get(hObject, 'Value') == 1) % link input with output directory Dawn@4: VSData = func_setmatdir('matdir', VSData.vars.wavdir, VSData); Dawn@4: Dawn@4: set(handles.edit_outputdirectory, 'String', VSData.vars.matdir); Dawn@4: set(handles.edit_outputdirectory, 'Enable', 'off'); Dawn@4: set(handles.pushbutton_outputBrowse, 'Enable', 'off'); Dawn@4: else Dawn@4: %enable user to pick output directory Dawn@4: set(handles.edit_outputdirectory, 'Enable', 'on'); Dawn@4: set(handles.pushbutton_outputBrowse, 'Enable', 'on'); Dawn@4: end Dawn@4: Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in pushbutton_ParameterSelection. Dawn@4: function pushbutton_ParameterSelection_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to pushbutton_ParameterSelection (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: % save the old file list Dawn@4: filelist = get(handles.listbox_filelist, 'String'); Dawn@4: fileinx = get(handles.listbox_filelist, 'Value'); Dawn@4: vs_SelectParameters(); Dawn@4: set(handles.listbox_filelist, 'String', filelist, 'Value', fileinx); Dawn@4: Dawn@4: Dawn@4: Dawn@4: function edit_parameterselection_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_parameterselection (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: % Hints: get(hObject,'String') returns contents of edit_parameterselection as text Dawn@4: % str2double(get(hObject,'String')) returns contents of edit_parameterselection as a double Dawn@4: Dawn@4: Dawn@4: % --- Executes during object creation, after setting all properties. Dawn@4: function edit_parameterselection_CreateFcn(hObject, eventdata, handles) Dawn@4: % hObject handle to edit_parameterselection (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles empty - handles not created until after all CreateFcns called Dawn@4: Dawn@4: % Hint: edit controls usually have a white background on Windows. Dawn@4: % See ISPC and COMPUTER. Dawn@4: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) Dawn@4: set(hObject,'BackgroundColor','white'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in checkbox_process16khz. Dawn@4: function checkbox_process16khz_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to checkbox_process16khz (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: VSData.vars.PE_processwith16k = get(hObject, 'Value'); Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in checkbox_useTextgrid. Dawn@4: function checkbox_useTextgrid_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to checkbox_useTextgrid (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: VSData.vars.PE_useTextgrid = get(hObject, 'Value'); Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in checkbox_showwaveform. Dawn@4: function checkbox_showwaveform_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to checkbox_showwaveform (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: VSData.vars.PE_showwaveforms = get(hObject, 'Value'); Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: Dawn@4: if (get(hObject, 'Value') == 1) Dawn@4: SWfig = vs_ShowWaveform; Dawn@4: SWhandle = guidata(SWfig); Dawn@4: Dawn@4: handles.SWfig = SWfig; Dawn@4: handles.SWhandle = SWhandle; Dawn@4: guidata(hObject, handles); Dawn@4: Dawn@4: plotCurrentWav(handles); Dawn@4: else Dawn@4: if (isfield(handles, 'SWfig')) Dawn@4: delete(handles.SWfig); Dawn@4: handles = rmfield(handles, 'SWfig'); Dawn@4: guidata(hObject, handles); Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- plots the current wavfile into handles.SWhandle.axes_main Dawn@4: function plotCurrentWav(handles) Dawn@4: % get the present file selected Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: Dawn@4: contents = get(handles.listbox_filelist, 'String'); Dawn@4: if (isempty(contents)) Dawn@4: return; % do nothing Dawn@4: end Dawn@4: inx = get(handles.listbox_filelist, 'Value'); Dawn@4: filename = contents{inx}; Dawn@4: directory = get(handles.edit_inputdirectory, 'String'); Dawn@4: wavfile = [directory VSData.vars.dirdelimiter filename]; Dawn@4: Dawn@4: [y,Fs] = wavread(wavfile); Dawn@4: t = linspace(0,length(y)/Fs*1000, length(y)); Dawn@4: plot(handles.SWhandle.axes_main, t, y); Dawn@4: ylabel(handles.SWhandle.axes_main, 'Amplitude'); Dawn@4: xlabel(handles.SWhandle.axes_main, 'Time (ms)'); Dawn@4: axis(handles.SWhandle.axes_main, 'tight'); Dawn@4: set(handles.SWhandle.figure_ShowWaveform, 'Name', filename); Dawn@4: Dawn@4: Dawn@4: % --- Executes on button press in togglebutton_start. Dawn@4: function togglebutton_start_Callback(hObject, eventdata, handles) Dawn@4: % hObject handle to togglebutton_start (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: if (get(hObject, 'Value') == 1) % start the process Dawn@4: set(hObject, 'String', 'Processing...', 'ForegroundColor', 'red'); Dawn@4: Dawn@4: BatchProcess(handles); Dawn@4: set(hObject, 'String', 'Start!', 'ForegroundColor', 'black', 'Value', 0); Dawn@4: Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: % this is the main parameter estimation function Dawn@4: function BatchProcess(handles) Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: filelist = get(handles.listbox_filelist, 'String'); Dawn@4: paramlist = VSData.vars.PE_params; Dawn@4: Dawn@4: if (isempty(filelist)) Dawn@4: msgbox('No input files.', 'Error', 'warn', 'modal'); Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: if (isempty(paramlist)) Dawn@4: msgbox('No parameters selected.', 'Error', 'warn', 'modal'); Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: MBox = MessageBox; Dawn@4: MBoxHandles = guidata(MBox); Dawn@4: Dawn@4: messages = cell(length(filelist)+1, 1); % allocate some memory for messages Dawn@4: Dawn@4: % get the variables from settings Dawn@4: windowsize = VSData.vars.windowsize; Dawn@4: frameshift = VSData.vars.frameshift; Dawn@4: preemphasis = VSData.vars.preemphasis; Dawn@4: F0algorithm = VSData.vars.F0algorithm; Dawn@4: FMTalgorithm = VSData.vars.FMTalgorithm; Dawn@4: maxF0 = VSData.vars.maxF0; Dawn@4: minF0 = VSData.vars.minF0; Dawn@4: frame_precision = VSData.vars.frame_precision; % used for Praat f0/formant Dawn@4: % estimation, SHR algorithm Dawn@4: % to set precision for time Dawn@4: % alignment of data Dawn@4: % vectors, in terms of frames Dawn@4: Dawn@4: inputdir = get(handles.edit_inputdirectory, 'String'); Dawn@4: outputdir = get(handles.edit_outputdirectory, 'String'); Dawn@4: Dawn@4: % start the processing of each file Dawn@4: for k=1:length(filelist) Dawn@4: % check if 'stop' button has been pressed Dawn@4: if (~ishandle(MBoxHandles.figure_MessageBox) || get(MBoxHandles.figure_MessageBox, 'UserData') == 1) Dawn@4: messages{k} = 'Stop button pressed by user.'; Dawn@4: if (ishandle(MBoxHandles.figure_MessageBox)) Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: end Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: messages{k} = sprintf('%d/%d. %s: ', k, length(filelist), filelist{k}); Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: set(handles.listbox_filelist, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: wavfile = [inputdir VSData.vars.dirdelimiter filelist{k}]; Dawn@4: matfile = [outputdir VSData.vars.dirdelimiter filelist{k}(1:end-3) 'mat']; Dawn@4: textgridfile = [wavfile(1:end-3) 'Textgrid']; Dawn@4: Dawn@4: % strip down the matfile and check if the directory exists Dawn@4: mdir = fileparts(matfile); Dawn@4: if (exist(mdir, 'dir') ~= 7) Dawn@4: mkdir(mdir); Dawn@4: end Dawn@4: Dawn@4: % check if we are showing the waveforms Dawn@4: if (get(handles.checkbox_showwaveform, 'Value') == 1) Dawn@4: plotCurrentWav(handles); Dawn@4: end Dawn@4: Dawn@4: % check to see if we're using textgrids Dawn@4: useTextgrid = get(handles.checkbox_useTextgrid, 'Value'); Dawn@4: if (useTextgrid == 1) Dawn@4: if (exist(textgridfile, 'file') == 0) Dawn@4: useTextgrid = 0; Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: % read in the wav file Dawn@4: [y, Fs, nbits] = wavread(wavfile); Dawn@4: Dawn@4: if (size(y, 2) > 1) Dawn@4: messages{k} = [messages{k} ' Multi-channel wav file - using first channel only: ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: y = y(:,1); Dawn@4: end Dawn@4: Dawn@4: % see if we need to resample to 16 kHz (faster for Straight) Dawn@4: resampled = 0; Dawn@4: if (get(handles.checkbox_process16khz, 'Value') == 1) Dawn@4: if (Fs ~= 16000) Dawn@4: y = resample(y, 16000, Fs); Dawn@4: wavfile = generateRandomFile(wavfile, handles); Dawn@4: wavfile = [wavfile(1:end-4) '_16kHz.wav']; Dawn@4: warning off; % stop clipping messages Dawn@4: wavwrite(y, 16000, nbits, wavfile); Dawn@4: warning on; Dawn@4: resampled = 1; Dawn@4: end Dawn@4: [y, Fs] = wavread(wavfile); % reread the resampled file Dawn@4: end Dawn@4: Dawn@4: % calculate the length of data vectors - all measures will have this Dawn@4: % length - important!! Dawn@4: data_len = floor(length(y) / Fs * 1000 / frameshift); Dawn@4: Dawn@4: % parse the parameter list to get proper ordering Dawn@4: paramlist = func_parseParameters(paramlist, handles, matfile, data_len); Dawn@4: Dawn@4: for n=1:length(paramlist) Dawn@4: Dawn@4: % check if 'stop' button has been pressed Dawn@4: if (~ishandle(MBoxHandles.figure_MessageBox) || get(MBoxHandles.figure_MessageBox, 'UserData') == 1) Dawn@4: break; Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % F0 straight Dawn@4: if (strcmp(paramlist{n}, 'F0 (Straight)')) Dawn@4: messages{k} = [messages{k} 'strF0 ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: err = 0; Dawn@4: Dawn@4: if (useTextgrid) Dawn@4: try Dawn@4: [strF0, V] = func_StraightPitch(y, Fs, VSData.vars, textgridfile); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: else Dawn@4: try Dawn@4: [strF0, V] = func_StraightPitch(y, Fs, VSData.vars); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: if (strcmp(VSData.vars.F0algorithm, 'F0 (Straight)') && err == 1) Dawn@4: messages{k+1} = 'Error: Problem with STRAIGHT - please check settings'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with STRAIGHT - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: strF0 = strF0(1:frameshift:end); % drop samples if necessary Dawn@4: Dawn@4: if (length(strF0) > data_len) Dawn@4: strF0 = strF0(1:data_len); Dawn@4: elseif (length(strF0) < data_len) Dawn@4: strF0 = [strF0; ones(data_len - length(strF0), 1) * NaN]; Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'strF0', 'Fs', '-append'); Dawn@4: else Dawn@4: save(matfile, 'strF0', 'Fs'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % F0 (Snack) Dawn@4: elseif (strcmp(paramlist{n}, 'F0 (Snack)')) Dawn@4: messages{k} = [messages{k} 'sF0 ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: % guard case for 32-bit precision files - some version of snack Dawn@4: % on a 64-bit machine causes pitch estimation to fail Dawn@4: use_alt_file = 0; Dawn@4: if (nbits ~= 16) Dawn@4: snackwavfile = [wavfile(1:end-4) '_16b.wav']; Dawn@4: use_alt_file = 1; Dawn@4: wavwrite(y, Fs, 16, snackwavfile); Dawn@4: else Dawn@4: snackwavfile = wavfile; Dawn@4: end Dawn@4: Dawn@4: err = 0; Dawn@4: try Dawn@4: [sF0, sV, err] = func_SnackPitch(snackwavfile, windowsize/1000, frameshift/1000, maxF0, minF0); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: % check for fatal errors Dawn@4: if (strcmp(VSData.vars.F0algorithm, 'F0 (Snack)') && err == 1) Dawn@4: messages{k+1} = 'Error: Problem with snack - please check settings'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with snack - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: if (use_alt_file) Dawn@4: delete(snackwavfile); Dawn@4: end Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: sF0 = [zeros(floor(windowsize/frameshift/2),1)*NaN; sF0]; sF0 = [sF0; ones(data_len-length(sF0), 1)*NaN]; Dawn@4: sV = [zeros(floor(windowsize/frameshift/2),1)*NaN; sV]; sV = [sV; ones(data_len-length(sV), 1)* NaN]; Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'sF0', 'sV', 'Fs', '-append'); Dawn@4: else Dawn@4: save(matfile, 'sF0', 'sV', 'Fs'); Dawn@4: end Dawn@4: Dawn@4: if (use_alt_file) Dawn@4: delete(snackwavfile); Dawn@4: end Dawn@4: Dawn@4: % F0 (Praat) Dawn@4: elseif (strcmp(paramlist{n}, 'F0 (Praat)')) Dawn@4: messages{k} = [messages{k} 'pF0 ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: % guard case for 32-bit precision files - some version of snack Dawn@4: % on a 64-bit machine causes pitch estimation to fail Dawn@4: err = 0; Dawn@4: try Dawn@4: [pF0, err] = func_PraatPitch(wavfile, frameshift/1000, frame_precision, ... Dawn@4: VSData.vars.F0Praatmin, ... Dawn@4: VSData.vars.F0Praatmax, ... Dawn@4: VSData.vars.F0PraatSilenceThreshold, ... Dawn@4: VSData.vars.F0PraatVoiceThreshold, ... Dawn@4: VSData.vars.F0PraatOctaveCost, ... Dawn@4: VSData.vars.F0PraatOctaveJumpCost, ... Dawn@4: VSData.vars.F0PraatVoicedUnvoicedCost, ... Dawn@4: VSData.vars.F0PraatKillOctaveJumps, ... Dawn@4: VSData.vars.F0PraatSmooth, ... Dawn@4: VSData.vars.F0PraatSmoothingBandwidth, ... Dawn@4: VSData.vars.F0PraatInterpolate, ... Dawn@4: VSData.vars.F0Praatmethod, ... Dawn@4: data_len); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: % check for fatal errors Dawn@4: if (strcmp(VSData.vars.F0algorithm, 'F0 (Praat)') && err ~= 0) Dawn@4: messages{k+1} = 'Error: Problem with Praat - please check settings'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with Praat - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: Dawn@4: return; Dawn@4: elseif (err ~= 0) Dawn@4: messages{k} = [messages{k} '(error) ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'pF0', 'Fs', '-append'); Dawn@4: else Dawn@4: save(matfile, 'pF0', 'Fs'); Dawn@4: end Dawn@4: Dawn@4: % F0 (Other) Dawn@4: elseif (strcmp(paramlist{n}, 'F0 (Other)')) Dawn@4: messages{k} = [messages{k} 'oF0 ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: oF0 = zeros(data_len, 1) * NaN; % allocate some memory Dawn@4: Dawn@4: err = 0; Dawn@4: try Dawn@4: [F0, errmsg] = func_OtherPitch(wavfile, handles); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: if ((length(F0)==1 && isnan(F0)) || isempty(F0)) Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: % check for fatal errors Dawn@4: if (err == 1) Dawn@4: messages{k} = [messages{k} '- error: ' errmsg ' ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: Dawn@4: if (strcmp(VSData.vars.F0algorithm, 'F0 (Other)')) Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: msgbox({['Error: ' errmsg], 'Problem with F0 estimation - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: return; Dawn@4: end Dawn@4: elseif (err ~= 0) Dawn@4: messages{k} = [messages{k} '(error) ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: if (VSData.vars.F0OtherOffset + length(F0) <= data_len) Dawn@4: oF0(VSData.vars.F0OtherOffset+1:VSData.vars.F0OtherOffset + length(F0)) = F0; Dawn@4: else % need to trim F0 Dawn@4: oF0(VSData.vars.F0OtherOffset+1:end) = F0(1:data_len - VSData.vars.F0OtherOffset); Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'oF0', 'Fs', '-append'); Dawn@4: else Dawn@4: save(matfile, 'oF0', 'Fs'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % F1, F2, F3, F4 (Snack) Dawn@4: elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Snack)')) Dawn@4: messages{k} = [messages{k} 'FMTs ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: % guard case for 32-bit files - some version of snack on a Dawn@4: % 64-bit machine causes formant estimation to fail Dawn@4: use_alt_file = 0; Dawn@4: if (nbits ~= 16) Dawn@4: snackwavfile = [wavfile(1:end-4) '_16b.wav']; Dawn@4: wavwrite(y, Fs, 16, snackwavfile); Dawn@4: use_alt_file = 1; Dawn@4: else Dawn@4: snackwavfile = wavfile; Dawn@4: end Dawn@4: Dawn@4: [sF1, sF2, sF3, sF4, sB1, sB2, sB3, sB4, err] = func_SnackFormants(snackwavfile, windowsize/1000, frameshift/1000, preemphasis); Dawn@4: Dawn@4: if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Snack)') && err == 1) Dawn@4: messages{k+1} = 'Error: Problem with snack - please check settings'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with snack - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: if (use_alt_file) Dawn@4: delete(snackwavfile); Dawn@4: end Dawn@4: Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: sF1 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF1]; sF1 = [sF1; ones(data_len-length(sF1), 1)*NaN]; Dawn@4: sF2 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF2]; sF2 = [sF2; ones(data_len-length(sF2), 1)*NaN]; Dawn@4: sF3 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF3]; sF3 = [sF3; ones(data_len-length(sF3), 1)*NaN]; Dawn@4: sF4 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF4]; sF4 = [sF4; ones(data_len-length(sF4), 1)*NaN]; Dawn@4: sB1 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB1]; sB1 = [sB1; ones(data_len-length(sB1), 1)*NaN]; Dawn@4: sB2 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB2]; sB2 = [sB2; ones(data_len-length(sB2), 1)*NaN]; Dawn@4: sB3 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB3]; sB3 = [sB3; ones(data_len-length(sB3), 1)*NaN]; Dawn@4: sB4 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB4]; sB4 = [sB4; ones(data_len-length(sB4), 1)*NaN]; Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'sF1', 'sF2', 'sF3', 'sF4', 'sB1', 'sB2', 'sB3', 'sB4', '-append'); Dawn@4: save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); Dawn@4: else Dawn@4: save(matfile, 'sF1', 'sF2', 'sF3', 'sF4', 'sB1', 'sB2', 'sB3', 'sB4'); Dawn@4: save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); Dawn@4: end Dawn@4: Dawn@4: if (use_alt_file) Dawn@4: delete(snackwavfile); Dawn@4: end Dawn@4: Dawn@4: % F1, F2, F3, F4 (Praat) Dawn@4: elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Praat)')) Dawn@4: messages{k} = [messages{k} 'FMTp ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: [pF1, pF2, pF3, pF4, pB1, pB2, pB3, pB4, err] = ... Dawn@4: func_PraatFormants(wavfile, windowsize/1000, frameshift/1000, frame_precision, data_len); Dawn@4: Dawn@4: if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Praat)') && err ~= 0) Dawn@4: messages{k+1} = 'Error: Problem with Praat - please check settings'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with Praat - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'pF1', 'pF2', 'pF3', 'pF4', 'pB1', 'pB2', 'pB3', 'pB4', '-append'); Dawn@4: save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); Dawn@4: else Dawn@4: save(matfile, 'pF1', 'pF2', 'pF3', 'pF4', 'pB1', 'pB2', 'pB3', 'pB4'); Dawn@4: save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); Dawn@4: end Dawn@4: Dawn@4: % F1, F2, F3, F4 (Other) Dawn@4: elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Other)')) Dawn@4: messages{k} = [messages{k} 'oFMTs ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: oF1 = zeros(data_len, 1) * NaN; % allocate some memory Dawn@4: oF2 = zeros(data_len, 1) * NaN; Dawn@4: oF3 = zeros(data_len, 1) * NaN; Dawn@4: oF4 = zeros(data_len, 1) * NaN; Dawn@4: oB1 = zeros(data_len, 1) * NaN; Dawn@4: oB2 = zeros(data_len, 1) * NaN; Dawn@4: oB3 = zeros(data_len, 1) * NaN; Dawn@4: oB4 = zeros(data_len, 1) * NaN; Dawn@4: Dawn@4: err = 0; Dawn@4: try Dawn@4: [F1, F2, F3, F4, B1, B2, B3, B4, errmsg] = func_OtherFormants(wavfile, handles); Dawn@4: catch Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: if ((length(F1) == 1 && isnan(F1)) || isempty(F1)) Dawn@4: err = 1; Dawn@4: end Dawn@4: Dawn@4: if (err == 1) Dawn@4: messages{k} = [messages{k} '-error: ' errmsg]; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: Dawn@4: if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Other)')) Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: msgbox({'Error: Unable to proceed.', 'Problem with formant tracker - please check settings'}, 'Error', 'error', 'modal'); Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: Dawn@4: return; Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: % build up the actual vector Dawn@4: if (VSData.vars.FormantsOtherOffset + length(F1) <= data_len) Dawn@4: oF1(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F1)) = F1; Dawn@4: oF2(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F2)) = F2; Dawn@4: oF3(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F3)) = F3; Dawn@4: oF4(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F4)) = F4; Dawn@4: oB1(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B1)) = B1; Dawn@4: oB2(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B2)) = B2; Dawn@4: oB3(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B3)) = B3; Dawn@4: oB4(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B4)) = B4; Dawn@4: else % need to trim Dawn@4: oF1(VSData.vars.FormantsOtherOffset+1:end) = F1(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oF2(VSData.vars.FormantsOtherOffset+1:end) = F2(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oF3(VSData.vars.FormantsOtherOffset+1:end) = F3(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oF4(VSData.vars.FormantsOtherOffset+1:end) = F4(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oB1(VSData.vars.FormantsOtherOffset+1:end) = B1(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oB2(VSData.vars.FormantsOtherOffset+1:end) = B2(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oB3(VSData.vars.FormantsOtherOffset+1:end) = B3(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: oB4(VSData.vars.FormantsOtherOffset+1:end) = B4(1:data_len - VSData.vars.FormantsOtherOffset); Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'oF1', 'oF2', 'oF3', 'oF4', 'oB1', 'oB2', 'oB3', 'oB4', '-append'); Dawn@4: else Dawn@4: save(matfile, 'oF1', 'oF2', 'oF3', 'oF4', 'oB1', 'oB2', 'oB3', 'oB4'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: % H1, H2, H4 Dawn@4: elseif (strcmp(paramlist{n}, 'H1, H2, H4')) Dawn@4: messages{k} = [messages{k} 'Hx ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: Dawn@4: if (useTextgrid) Dawn@4: [H1, H2, H4, isComplete] = func_GetH1_H2_H4(y, Fs, F0, MBoxHandles, VSData.vars, textgridfile); Dawn@4: else Dawn@4: [H1, H2, H4, isComplete] = func_GetH1_H2_H4(y, Fs, F0, MBoxHandles, VSData.vars); Dawn@4: end Dawn@4: Dawn@4: HF0algorithm = F0algorithm; Dawn@4: Dawn@4: % check if the process was completed Dawn@4: if (isComplete==0) Dawn@4: messages{k+1} = 'Stop button pressed by user.'; Dawn@4: if (ishandle(MBoxHandles.figure_MessageBox)) Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); Dawn@4: end Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: Dawn@4: return; Dawn@4: end Dawn@4: Dawn@4: if (exist(matfile, 'file')) Dawn@4: save(matfile, 'H1', 'H2', 'H4', 'HF0algorithm', '-append'); Dawn@4: else Dawn@4: save(matfile, 'H1', 'H2', 'H4', 'HF0algorithm'); Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: % A1, A2, A3 Dawn@4: elseif (strcmp(paramlist{n}, 'A1, A2, A3')) Dawn@4: messages{k} = [messages{k} 'Ax ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); % file has to exist at this point - dependency checking should make sure of this Dawn@4: Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); Dawn@4: Dawn@4: if (useTextgrid) Dawn@4: [A1, A2, A3] = func_GetA1A2A3(y, Fs, F0, F1, F2, F3, VSData.vars, textgridfile); Dawn@4: else Dawn@4: [A1, A2, A3] = func_GetA1A2A3(y, Fs, F0, F1, F2, F3, VSData.vars); Dawn@4: end Dawn@4: Dawn@4: AFMTalgorithm = FMTalgorithm; Dawn@4: Dawn@4: save(matfile, 'A1', 'A2', 'A3', 'AFMTalgorithm', '-append'); Dawn@4: Dawn@4: Dawn@4: % H1*-H2* and H2*-H4* Dawn@4: elseif (strcmp(paramlist{n}, 'H1*-H2*, H2*-H4*')) Dawn@4: messages{k} = [messages{k} 'H1H2c H2H4c ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); Dawn@4: Dawn@4: [H1H2c, H2H4c] = func_GetH1H2_H2H4(matdata.H1, matdata.H2, matdata.H4, Fs, F0, F1, F2); Dawn@4: save(matfile, 'H1H2c', 'H2H4c', '-append'); Dawn@4: Dawn@4: Dawn@4: % H1*-A1*, H1*-A2*, and H1*-A3* Dawn@4: elseif (strcmp(paramlist{n}, 'H1*-A1*, H1*-A2*, H1*-A3*')) Dawn@4: messages{k} = [messages{k} 'H1A1c H1A2c H1A3c ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); Dawn@4: Dawn@4: [H1A1c, H1A2c, H1A3c] = func_GetH1A1_H1A2_H1A3(matdata.H1, matdata.A1, matdata.A2, matdata.A3, Fs, F0, F1, F2, F3); Dawn@4: save(matfile, 'H1A1c', 'H1A2c', 'H1A3c', '-append'); Dawn@4: Dawn@4: Dawn@4: % Energy Dawn@4: elseif (strcmp(paramlist{n}, 'Energy')) Dawn@4: messages{k} = [messages{k} 'E ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: Dawn@4: Energy = func_GetEnergy(y, F0, Fs, VSData.vars); Dawn@4: save(matfile, 'Energy', '-append'); Dawn@4: Dawn@4: Dawn@4: % CPP Dawn@4: elseif (strcmp(paramlist{n}, 'CPP')) Dawn@4: messages{k} = [messages{k} 'CPP ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: Dawn@4: CPP = func_GetCPP(y, Fs, F0, VSData.vars); Dawn@4: save(matfile, 'CPP', '-append'); Dawn@4: Dawn@4: Dawn@4: % HNR Dawn@4: elseif (strcmp(paramlist{n}, 'Harmonic to Noise Ratios - HNR')) Dawn@4: messages{k} = [messages{k} 'HNR ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: F0 = func_parseF0(matdata, F0algorithm); Dawn@4: Dawn@4: [HNR05, HNR15, HNR25, HNR35] = func_GetHNR(y, Fs, F0, VSData.vars); Dawn@4: save(matfile, 'HNR05', 'HNR15', 'HNR25', 'HNR35', '-append'); Dawn@4: Dawn@4: Dawn@4: % SHR Dawn@4: elseif (strcmp(paramlist{n}, 'Subharmonic to Harmonic Ratio/F0 - SHR, (shr)F0')) Dawn@4: messages{k} = [messages{k} 'SHR, shrF0 ']; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); Dawn@4: drawnow; Dawn@4: Dawn@4: matdata = load(matfile); Dawn@4: Dawn@4: [SHR, shrF0] = func_GetSHRP(y, Fs, VSData.vars, data_len); Dawn@4: save(matfile, 'SHR', 'shrF0', '-append'); Dawn@4: end Dawn@4: Dawn@4: end Dawn@4: Dawn@4: if (resampled) % delete the temporary file if it exists Dawn@4: delete(wavfile); Dawn@4: end Dawn@4: Dawn@4: end Dawn@4: Dawn@4: messages{length(filelist)+1} = 'Processing complete.'; Dawn@4: set(MBoxHandles.listbox_messages, 'String', messages, 'Value', length(filelist)+1); Dawn@4: set(MBoxHandles.pushbutton_close, 'Enable', 'on'); Dawn@4: set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); Dawn@4: Dawn@4: Dawn@4: % Function to generate random file names Dawn@4: function filename = generateRandomFile(fname, handles) Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: N = 8; % this many random digits/characters Dawn@4: [pathstr, name, ext] = fileparts(fname); Dawn@4: randstr = '00000000'; Dawn@4: Dawn@4: isok = 0; Dawn@4: Dawn@4: while(isok == 0) Dawn@4: for k=1:N Dawn@4: randstr(k) = floor(rand() * 25) + 65; Dawn@4: end Dawn@4: filename = [pathstr VSData.vars.dirdelimiter 'tmp_' name randstr ext]; Dawn@4: Dawn@4: if (exist(filename, 'file') == 0) Dawn@4: isok = 1; Dawn@4: end Dawn@4: end Dawn@4: Dawn@4: Dawn@4: % --- Executes when user attempts to close figure_ParameterEstimation. Dawn@4: function figure_ParameterEstimation_CloseRequestFcn(hObject, eventdata, handles) Dawn@4: % hObject handle to figure_ParameterEstimation (see GCBO) Dawn@4: % eventdata reserved - to be defined in a future version of MATLAB Dawn@4: % handles structure with handles and user data (see GUIDATA) Dawn@4: Dawn@4: % Hint: delete(hObject) closes the figure Dawn@4: if (isfield(handles, 'SWfig')) Dawn@4: delete(handles.SWfig); Dawn@4: end Dawn@4: Dawn@4: VSData = guidata(handles.VSHandle); Dawn@4: VSData.vars.PE_showwaveforms = 0; Dawn@4: guidata(handles.VSHandle, VSData); Dawn@4: Dawn@4: delete(hObject); Dawn@4: Dawn@4: