Mercurial > hg > emotion-detection-top-level
comparison Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/vs_ParameterEstimation.m @ 4:92ca03a8fa99 tip
Update to ICASSP 2013 benchmark
| author | Dawn Black |
|---|---|
| date | Wed, 13 Feb 2013 11:02:39 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 3:e1cfa7765647 | 4:92ca03a8fa99 |
|---|---|
| 1 function varargout = vs_ParameterEstimation(varargin) | |
| 2 % VS_PARAMETERESTIMATION M-file for vs_ParameterEstimation.fig | |
| 3 % VS_PARAMETERESTIMATION, by itself, creates a new VS_PARAMETERESTIMATION or raises the existing | |
| 4 % singleton*. | |
| 5 % | |
| 6 % H = VS_PARAMETERESTIMATION returns the handle to a new VS_PARAMETERESTIMATION or the handle to | |
| 7 % the existing singleton*. | |
| 8 % | |
| 9 % VS_PARAMETERESTIMATION('CALLBACK',hObject,eventData,handles,...) calls the local | |
| 10 % function named CALLBACK in VS_PARAMETERESTIMATION.M with the given input arguments. | |
| 11 % | |
| 12 % VS_PARAMETERESTIMATION('Property','Value',...) creates a new VS_PARAMETERESTIMATION or raises the | |
| 13 % existing singleton*. Starting from the left, property value pairs are | |
| 14 % applied to the GUI before vs_ParameterEstimation_OpeningFcn gets called. An | |
| 15 % unrecognized property name or invalid value makes property application | |
| 16 % stop. All inputs are passed to vs_ParameterEstimation_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 vs_ParameterEstimation | |
| 24 | |
| 25 % Last Modified by GUIDE v2.5 19-Oct-2009 11:55:41 | |
| 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', @vs_ParameterEstimation_OpeningFcn, ... | |
| 32 'gui_OutputFcn', @vs_ParameterEstimation_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 vs_ParameterEstimation is made visible. | |
| 48 function vs_ParameterEstimation_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 vs_ParameterEstimation (see VARARGIN) | |
| 54 | |
| 55 % Choose default command line output for vs_ParameterEstimation | |
| 56 handles.output = hObject; | |
| 57 | |
| 58 % YS: get the settings from the main figure | |
| 59 if (~isfield(handles, 'VSHandle')) | |
| 60 VSHandle = VoiceSauce; | |
| 61 handles.VSHandle = VSHandle; | |
| 62 end | |
| 63 | |
| 64 % set up the text fields with default values | |
| 65 setGUIVariables(handles); | |
| 66 | |
| 67 set(handles.listbox_filelist, 'KeyPressFcn', @filelist_listbox_KeyPressFcn); | |
| 68 | |
| 69 % Update handles structure | |
| 70 guidata(hObject, handles); | |
| 71 | |
| 72 % UIWAIT makes vs_ParameterEstimation wait for user response (see UIRESUME) | |
| 73 % uiwait(handles.figure_ParameterEstimation); | |
| 74 | |
| 75 | |
| 76 function setGUIVariables(handles) | |
| 77 VSData = guidata(handles.VSHandle); | |
| 78 | |
| 79 set(handles.edit_inputdirectory, 'String', VSData.vars.wavdir); | |
| 80 set(handles.edit_outputdirectory, 'String', VSData.vars.matdir); | |
| 81 | |
| 82 set(handles.checkbox_savematwithwav, 'Value', VSData.vars.PE_savematwithwav); | |
| 83 set(handles.checkbox_process16khz, 'Value', VSData.vars.PE_processwith16k); | |
| 84 set(handles.checkbox_useTextgrid, 'Value', VSData.vars.PE_useTextgrid); | |
| 85 set(handles.checkbox_showwaveform, 'Value', VSData.vars.PE_showwaveforms); % turn this off at startup | |
| 86 | |
| 87 | |
| 88 if (VSData.vars.recursedir) | |
| 89 func_setlistbox(handles.listbox_filelist, VSData.vars.wavdir, 'recurse', VSData.vars, VSData.vars.I_searchstring); | |
| 90 else | |
| 91 func_setlistbox(handles.listbox_filelist, VSData.vars.wavdir, 'none', VSData.vars, VSData.vars.I_searchstring); | |
| 92 end | |
| 93 | |
| 94 if (VSData.vars.PE_savematwithwav == 1) | |
| 95 set(handles.edit_outputdirectory, 'Enable', 'Off'); | |
| 96 set(handles.pushbutton_outputBrowse, 'Enable', 'Off'); | |
| 97 else | |
| 98 set(handles.edit_outputdirectory, 'Enable', 'On'); | |
| 99 set(handles.pushbutton_outputBrowse, 'Enable', 'On'); | |
| 100 end | |
| 101 | |
| 102 if (length(VSData.vars.PE_params) == 0) | |
| 103 set(handles.edit_parameterselection, 'String', 'None'); | |
| 104 elseif (length(VSData.vars.PE_params) == length(func_getparameterlist())) | |
| 105 set(handles.edit_parameterselection, 'String', 'All'); | |
| 106 else | |
| 107 set(handles.edit_parameterselection, 'String', 'Custom'); | |
| 108 end | |
| 109 | |
| 110 | |
| 111 | |
| 112 function filelist_listbox_KeyPressFcn(hObject, eventdata) | |
| 113 handles = guidata(hObject); | |
| 114 | |
| 115 key = double(get(gcbf, 'CurrentCharacter')); | |
| 116 if (gcbo == handles.listbox_filelist) | |
| 117 if (key == 127) % delete key | |
| 118 | |
| 119 inx = get(handles.listbox_filelist, 'Value'); | |
| 120 contents = get(handles.listbox_filelist, 'String'); | |
| 121 | |
| 122 %nothing to do | |
| 123 if (isempty(contents)) | |
| 124 return; | |
| 125 end | |
| 126 | |
| 127 newinx = setxor(inx, [1:length(contents)]); | |
| 128 | |
| 129 newcontents = contents(newinx); | |
| 130 set(handles.listbox_filelist, 'String', newcontents); | |
| 131 | |
| 132 if (inx(end) > length(newcontents)) | |
| 133 set(handles.listbox_filelist, 'Value', length(newcontents)); | |
| 134 else | |
| 135 set(handles.listbox_filelist, 'Value', inx(end)); | |
| 136 end | |
| 137 end | |
| 138 end | |
| 139 | |
| 140 | |
| 141 | |
| 142 % --- Outputs from this function are returned to the command line. | |
| 143 function varargout = vs_ParameterEstimation_OutputFcn(hObject, eventdata, handles) | |
| 144 % varargout cell array for returning output args (see VARARGOUT); | |
| 145 % hObject handle to figure | |
| 146 % eventdata reserved - to be defined in a future version of MATLAB | |
| 147 % handles structure with handles and user data (see GUIDATA) | |
| 148 | |
| 149 % Get default command line output from handles structure | |
| 150 varargout{1} = handles.output; | |
| 151 | |
| 152 | |
| 153 % --- Executes on selection change in listbox_filelist. | |
| 154 function listbox_filelist_Callback(hObject, eventdata, handles) | |
| 155 % hObject handle to listbox_filelist (see GCBO) | |
| 156 % eventdata reserved - to be defined in a future version of MATLAB | |
| 157 % handles structure with handles and user data (see GUIDATA) | |
| 158 | |
| 159 if (get(handles.checkbox_showwaveform, 'Value') == 1) | |
| 160 plotCurrentWav(handles); | |
| 161 end | |
| 162 | |
| 163 | |
| 164 % --- Executes during object creation, after setting all properties. | |
| 165 function listbox_filelist_CreateFcn(hObject, eventdata, handles) | |
| 166 % hObject handle to listbox_filelist (see GCBO) | |
| 167 % eventdata reserved - to be defined in a future version of MATLAB | |
| 168 % handles empty - handles not created until after all CreateFcns called | |
| 169 | |
| 170 % Hint: listbox controls usually have a white background on Windows. | |
| 171 % See ISPC and COMPUTER. | |
| 172 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) | |
| 173 set(hObject,'BackgroundColor','white'); | |
| 174 end | |
| 175 | |
| 176 | |
| 177 | |
| 178 function edit_inputdirectory_Callback(hObject, eventdata, handles) | |
| 179 % hObject handle to edit_inputdirectory (see GCBO) | |
| 180 % eventdata reserved - to be defined in a future version of MATLAB | |
| 181 % handles structure with handles and user data (see GUIDATA) | |
| 182 new_dir = get(handles.edit_inputdirectory, 'String'); | |
| 183 | |
| 184 VSData = guidata(handles.VSHandle); | |
| 185 | |
| 186 if (exist(new_dir, 'dir') == 7) % check if new_dir exists | |
| 187 VSData.vars.wavdir = new_dir; | |
| 188 set(handles.edit_inputdirectory, 'String', new_dir); | |
| 189 | |
| 190 if (get(handles.checkbox_savematwithwav, 'Value') == 1) % change output dir too | |
| 191 set(handles.edit_outputdirectory, 'String', new_dir); | |
| 192 | |
| 193 VSData = func_setmatdir('matdir', new_dir, VSData); | |
| 194 end | |
| 195 | |
| 196 % update the listbox | |
| 197 if (VSData.vars.recursedir == 1) | |
| 198 func_setlistbox(handles.listbox_filelist, new_dir, 'recurse', VSData.vars, VSData.vars.I_searchstring); | |
| 199 else | |
| 200 func_setlistbox(handles.listbox_filelist, new_dir, 'none', VSData.vars, VSData.vars.I_searchstring); | |
| 201 end | |
| 202 | |
| 203 VSData = func_setwavdir('wavdir', new_dir, VSData); | |
| 204 | |
| 205 % update the variables | |
| 206 guidata(handles.VSHandle, VSData); | |
| 207 else | |
| 208 msgbox('Error: directory not found.', 'Error', 'error', 'modal'); | |
| 209 set(hObject, 'String', VSData.vars.wavdir); | |
| 210 end | |
| 211 | |
| 212 | |
| 213 % --- Executes during object creation, after setting all properties. | |
| 214 function edit_inputdirectory_CreateFcn(hObject, eventdata, handles) | |
| 215 % hObject handle to edit_inputdirectory (see GCBO) | |
| 216 % eventdata reserved - to be defined in a future version of MATLAB | |
| 217 % handles empty - handles not created until after all CreateFcns called | |
| 218 | |
| 219 % Hint: edit controls usually have a white background on Windows. | |
| 220 % See ISPC and COMPUTER. | |
| 221 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) | |
| 222 set(hObject,'BackgroundColor','white'); | |
| 223 end | |
| 224 | |
| 225 | |
| 226 % --- Executes on button press in pushbutton_inputBrowse. | |
| 227 function pushbutton_inputBrowse_Callback(hObject, eventdata, handles) | |
| 228 % hObject handle to pushbutton_inputBrowse (see GCBO) | |
| 229 % eventdata reserved - to be defined in a future version of MATLAB | |
| 230 % handles structure with handles and user data (see GUIDATA) | |
| 231 current_dir = get(handles.edit_inputdirectory, 'String'); | |
| 232 new_dir = uigetdir(current_dir); | |
| 233 | |
| 234 VSData = guidata(handles.VSHandle); | |
| 235 | |
| 236 if (ischar(new_dir)) % check if a new dir was returned | |
| 237 VSData.vars.wavdir = new_dir; | |
| 238 set(handles.edit_inputdirectory, 'String', new_dir); | |
| 239 | |
| 240 if (get(handles.checkbox_savematwithwav, 'Value') == 1) % change output dir too | |
| 241 set(handles.edit_outputdirectory, 'String', new_dir); | |
| 242 | |
| 243 VSData = func_setmatdir('matdir', new_dir, VSData); | |
| 244 end | |
| 245 | |
| 246 % update the listbox | |
| 247 if (VSData.vars.recursedir == 1) | |
| 248 func_setlistbox(handles.listbox_filelist, new_dir, 'recurse', VSData.vars, VSData.vars.I_searchstring); | |
| 249 else | |
| 250 func_setlistbox(handles.listbox_filelist, new_dir, 'none', VSData.vars, VSData.vars.I_searchstring); | |
| 251 end | |
| 252 | |
| 253 VSData = func_setwavdir('wavdir', new_dir, VSData); | |
| 254 | |
| 255 % update the variables | |
| 256 guidata(handles.VSHandle, VSData); | |
| 257 end | |
| 258 | |
| 259 | |
| 260 | |
| 261 function edit_outputdirectory_Callback(hObject, eventdata, handles) | |
| 262 % hObject handle to edit_outputdirectory (see GCBO) | |
| 263 % eventdata reserved - to be defined in a future version of MATLAB | |
| 264 % handles structure with handles and user data (see GUIDATA) | |
| 265 | |
| 266 VSData = guidata(handles.VSHandle); | |
| 267 | |
| 268 if (strcmp(get(hObject, 'Enable'), 'on')) | |
| 269 new_dir = get(handles.edit_outputdirectory, 'String'); | |
| 270 | |
| 271 if (exist(new_dir, 'dir') == 7) | |
| 272 set(handles.edit_outputdirectory, 'String', new_dir); | |
| 273 | |
| 274 VSData = func_setmatdir('matdir', new_dir, VSData); | |
| 275 | |
| 276 guidata(handles.VSHandle, VSData); | |
| 277 else | |
| 278 msgbox('Error: Directory not found.', 'Error', 'error', 'modal'); | |
| 279 set(hObject, 'String', VSData.vars.matdir); | |
| 280 end | |
| 281 end | |
| 282 | |
| 283 % --- Executes during object creation, after setting all properties. | |
| 284 function edit_outputdirectory_CreateFcn(hObject, eventdata, handles) | |
| 285 % hObject handle to edit_outputdirectory (see GCBO) | |
| 286 % eventdata reserved - to be defined in a future version of MATLAB | |
| 287 % handles empty - handles not created until after all CreateFcns called | |
| 288 | |
| 289 % Hint: edit controls usually have a white background on Windows. | |
| 290 % See ISPC and COMPUTER. | |
| 291 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) | |
| 292 set(hObject,'BackgroundColor','white'); | |
| 293 end | |
| 294 | |
| 295 | |
| 296 % --- Executes on button press in pushbutton_outputBrowse. | |
| 297 function pushbutton_outputBrowse_Callback(hObject, eventdata, handles) | |
| 298 % hObject handle to pushbutton_outputBrowse (see GCBO) | |
| 299 % eventdata reserved - to be defined in a future version of MATLAB | |
| 300 % handles structure with handles and user data (see GUIDATA) | |
| 301 | |
| 302 VSData = guidata(handles.VSHandle); | |
| 303 | |
| 304 if (strcmp(get(hObject, 'Enable'), 'on')) | |
| 305 curr_dir = get(handles.edit_outputdirectory, 'String'); | |
| 306 new_dir = uigetdir(curr_dir); | |
| 307 | |
| 308 if (ischar(new_dir)) | |
| 309 set(handles.edit_outputdirectory, 'String', new_dir); | |
| 310 | |
| 311 VSData = func_setmatdir('matdir', new_dir, VSData); | |
| 312 | |
| 313 guidata(handles.VSHandle, VSData); | |
| 314 end | |
| 315 end | |
| 316 | |
| 317 | |
| 318 % --- Executes on button press in checkbox_savematwithwav. | |
| 319 function checkbox_savematwithwav_Callback(hObject, eventdata, handles) | |
| 320 % hObject handle to checkbox_savematwithwav (see GCBO) | |
| 321 % eventdata reserved - to be defined in a future version of MATLAB | |
| 322 % handles structure with handles and user data (see GUIDATA) | |
| 323 | |
| 324 VSData = guidata(handles.VSHandle); | |
| 325 VSData.vars.PE_savematwithwav = get(hObject, 'Value'); | |
| 326 | |
| 327 if (get(hObject, 'Value') == 1) % link input with output directory | |
| 328 VSData = func_setmatdir('matdir', VSData.vars.wavdir, VSData); | |
| 329 | |
| 330 set(handles.edit_outputdirectory, 'String', VSData.vars.matdir); | |
| 331 set(handles.edit_outputdirectory, 'Enable', 'off'); | |
| 332 set(handles.pushbutton_outputBrowse, 'Enable', 'off'); | |
| 333 else | |
| 334 %enable user to pick output directory | |
| 335 set(handles.edit_outputdirectory, 'Enable', 'on'); | |
| 336 set(handles.pushbutton_outputBrowse, 'Enable', 'on'); | |
| 337 end | |
| 338 | |
| 339 guidata(handles.VSHandle, VSData); | |
| 340 | |
| 341 | |
| 342 | |
| 343 | |
| 344 | |
| 345 % --- Executes on button press in pushbutton_ParameterSelection. | |
| 346 function pushbutton_ParameterSelection_Callback(hObject, eventdata, handles) | |
| 347 % hObject handle to pushbutton_ParameterSelection (see GCBO) | |
| 348 % eventdata reserved - to be defined in a future version of MATLAB | |
| 349 % handles structure with handles and user data (see GUIDATA) | |
| 350 | |
| 351 % save the old file list | |
| 352 filelist = get(handles.listbox_filelist, 'String'); | |
| 353 fileinx = get(handles.listbox_filelist, 'Value'); | |
| 354 vs_SelectParameters(); | |
| 355 set(handles.listbox_filelist, 'String', filelist, 'Value', fileinx); | |
| 356 | |
| 357 | |
| 358 | |
| 359 function edit_parameterselection_Callback(hObject, eventdata, handles) | |
| 360 % hObject handle to edit_parameterselection (see GCBO) | |
| 361 % eventdata reserved - to be defined in a future version of MATLAB | |
| 362 % handles structure with handles and user data (see GUIDATA) | |
| 363 | |
| 364 % Hints: get(hObject,'String') returns contents of edit_parameterselection as text | |
| 365 % str2double(get(hObject,'String')) returns contents of edit_parameterselection as a double | |
| 366 | |
| 367 | |
| 368 % --- Executes during object creation, after setting all properties. | |
| 369 function edit_parameterselection_CreateFcn(hObject, eventdata, handles) | |
| 370 % hObject handle to edit_parameterselection (see GCBO) | |
| 371 % eventdata reserved - to be defined in a future version of MATLAB | |
| 372 % handles empty - handles not created until after all CreateFcns called | |
| 373 | |
| 374 % Hint: edit controls usually have a white background on Windows. | |
| 375 % See ISPC and COMPUTER. | |
| 376 if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) | |
| 377 set(hObject,'BackgroundColor','white'); | |
| 378 end | |
| 379 | |
| 380 | |
| 381 % --- Executes on button press in checkbox_process16khz. | |
| 382 function checkbox_process16khz_Callback(hObject, eventdata, handles) | |
| 383 % hObject handle to checkbox_process16khz (see GCBO) | |
| 384 % eventdata reserved - to be defined in a future version of MATLAB | |
| 385 % handles structure with handles and user data (see GUIDATA) | |
| 386 | |
| 387 VSData = guidata(handles.VSHandle); | |
| 388 VSData.vars.PE_processwith16k = get(hObject, 'Value'); | |
| 389 guidata(handles.VSHandle, VSData); | |
| 390 | |
| 391 | |
| 392 % --- Executes on button press in checkbox_useTextgrid. | |
| 393 function checkbox_useTextgrid_Callback(hObject, eventdata, handles) | |
| 394 % hObject handle to checkbox_useTextgrid (see GCBO) | |
| 395 % eventdata reserved - to be defined in a future version of MATLAB | |
| 396 % handles structure with handles and user data (see GUIDATA) | |
| 397 VSData = guidata(handles.VSHandle); | |
| 398 VSData.vars.PE_useTextgrid = get(hObject, 'Value'); | |
| 399 guidata(handles.VSHandle, VSData); | |
| 400 | |
| 401 | |
| 402 % --- Executes on button press in checkbox_showwaveform. | |
| 403 function checkbox_showwaveform_Callback(hObject, eventdata, handles) | |
| 404 % hObject handle to checkbox_showwaveform (see GCBO) | |
| 405 % eventdata reserved - to be defined in a future version of MATLAB | |
| 406 % handles structure with handles and user data (see GUIDATA) | |
| 407 VSData = guidata(handles.VSHandle); | |
| 408 VSData.vars.PE_showwaveforms = get(hObject, 'Value'); | |
| 409 guidata(handles.VSHandle, VSData); | |
| 410 | |
| 411 if (get(hObject, 'Value') == 1) | |
| 412 SWfig = vs_ShowWaveform; | |
| 413 SWhandle = guidata(SWfig); | |
| 414 | |
| 415 handles.SWfig = SWfig; | |
| 416 handles.SWhandle = SWhandle; | |
| 417 guidata(hObject, handles); | |
| 418 | |
| 419 plotCurrentWav(handles); | |
| 420 else | |
| 421 if (isfield(handles, 'SWfig')) | |
| 422 delete(handles.SWfig); | |
| 423 handles = rmfield(handles, 'SWfig'); | |
| 424 guidata(hObject, handles); | |
| 425 end | |
| 426 end | |
| 427 | |
| 428 | |
| 429 % --- plots the current wavfile into handles.SWhandle.axes_main | |
| 430 function plotCurrentWav(handles) | |
| 431 % get the present file selected | |
| 432 VSData = guidata(handles.VSHandle); | |
| 433 | |
| 434 contents = get(handles.listbox_filelist, 'String'); | |
| 435 if (isempty(contents)) | |
| 436 return; % do nothing | |
| 437 end | |
| 438 inx = get(handles.listbox_filelist, 'Value'); | |
| 439 filename = contents{inx}; | |
| 440 directory = get(handles.edit_inputdirectory, 'String'); | |
| 441 wavfile = [directory VSData.vars.dirdelimiter filename]; | |
| 442 | |
| 443 [y,Fs] = wavread(wavfile); | |
| 444 t = linspace(0,length(y)/Fs*1000, length(y)); | |
| 445 plot(handles.SWhandle.axes_main, t, y); | |
| 446 ylabel(handles.SWhandle.axes_main, 'Amplitude'); | |
| 447 xlabel(handles.SWhandle.axes_main, 'Time (ms)'); | |
| 448 axis(handles.SWhandle.axes_main, 'tight'); | |
| 449 set(handles.SWhandle.figure_ShowWaveform, 'Name', filename); | |
| 450 | |
| 451 | |
| 452 % --- Executes on button press in togglebutton_start. | |
| 453 function togglebutton_start_Callback(hObject, eventdata, handles) | |
| 454 % hObject handle to togglebutton_start (see GCBO) | |
| 455 % eventdata reserved - to be defined in a future version of MATLAB | |
| 456 % handles structure with handles and user data (see GUIDATA) | |
| 457 | |
| 458 if (get(hObject, 'Value') == 1) % start the process | |
| 459 set(hObject, 'String', 'Processing...', 'ForegroundColor', 'red'); | |
| 460 | |
| 461 BatchProcess(handles); | |
| 462 set(hObject, 'String', 'Start!', 'ForegroundColor', 'black', 'Value', 0); | |
| 463 | |
| 464 end | |
| 465 | |
| 466 | |
| 467 | |
| 468 % this is the main parameter estimation function | |
| 469 function BatchProcess(handles) | |
| 470 VSData = guidata(handles.VSHandle); | |
| 471 filelist = get(handles.listbox_filelist, 'String'); | |
| 472 paramlist = VSData.vars.PE_params; | |
| 473 | |
| 474 if (isempty(filelist)) | |
| 475 msgbox('No input files.', 'Error', 'warn', 'modal'); | |
| 476 return; | |
| 477 end | |
| 478 | |
| 479 if (isempty(paramlist)) | |
| 480 msgbox('No parameters selected.', 'Error', 'warn', 'modal'); | |
| 481 return; | |
| 482 end | |
| 483 | |
| 484 MBox = MessageBox; | |
| 485 MBoxHandles = guidata(MBox); | |
| 486 | |
| 487 messages = cell(length(filelist)+1, 1); % allocate some memory for messages | |
| 488 | |
| 489 % get the variables from settings | |
| 490 windowsize = VSData.vars.windowsize; | |
| 491 frameshift = VSData.vars.frameshift; | |
| 492 preemphasis = VSData.vars.preemphasis; | |
| 493 F0algorithm = VSData.vars.F0algorithm; | |
| 494 FMTalgorithm = VSData.vars.FMTalgorithm; | |
| 495 maxF0 = VSData.vars.maxF0; | |
| 496 minF0 = VSData.vars.minF0; | |
| 497 frame_precision = VSData.vars.frame_precision; % used for Praat f0/formant | |
| 498 % estimation, SHR algorithm | |
| 499 % to set precision for time | |
| 500 % alignment of data | |
| 501 % vectors, in terms of frames | |
| 502 | |
| 503 inputdir = get(handles.edit_inputdirectory, 'String'); | |
| 504 outputdir = get(handles.edit_outputdirectory, 'String'); | |
| 505 | |
| 506 % start the processing of each file | |
| 507 for k=1:length(filelist) | |
| 508 % check if 'stop' button has been pressed | |
| 509 if (~ishandle(MBoxHandles.figure_MessageBox) || get(MBoxHandles.figure_MessageBox, 'UserData') == 1) | |
| 510 messages{k} = 'Stop button pressed by user.'; | |
| 511 if (ishandle(MBoxHandles.figure_MessageBox)) | |
| 512 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 513 end | |
| 514 return; | |
| 515 end | |
| 516 | |
| 517 messages{k} = sprintf('%d/%d. %s: ', k, length(filelist), filelist{k}); | |
| 518 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 519 set(handles.listbox_filelist, 'Value', k); | |
| 520 drawnow; | |
| 521 | |
| 522 wavfile = [inputdir VSData.vars.dirdelimiter filelist{k}]; | |
| 523 matfile = [outputdir VSData.vars.dirdelimiter filelist{k}(1:end-3) 'mat']; | |
| 524 textgridfile = [wavfile(1:end-3) 'Textgrid']; | |
| 525 | |
| 526 % strip down the matfile and check if the directory exists | |
| 527 mdir = fileparts(matfile); | |
| 528 if (exist(mdir, 'dir') ~= 7) | |
| 529 mkdir(mdir); | |
| 530 end | |
| 531 | |
| 532 % check if we are showing the waveforms | |
| 533 if (get(handles.checkbox_showwaveform, 'Value') == 1) | |
| 534 plotCurrentWav(handles); | |
| 535 end | |
| 536 | |
| 537 % check to see if we're using textgrids | |
| 538 useTextgrid = get(handles.checkbox_useTextgrid, 'Value'); | |
| 539 if (useTextgrid == 1) | |
| 540 if (exist(textgridfile, 'file') == 0) | |
| 541 useTextgrid = 0; | |
| 542 end | |
| 543 end | |
| 544 | |
| 545 % read in the wav file | |
| 546 [y, Fs, nbits] = wavread(wavfile); | |
| 547 | |
| 548 if (size(y, 2) > 1) | |
| 549 messages{k} = [messages{k} ' Multi-channel wav file - using first channel only: ']; | |
| 550 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 551 drawnow; | |
| 552 y = y(:,1); | |
| 553 end | |
| 554 | |
| 555 % see if we need to resample to 16 kHz (faster for Straight) | |
| 556 resampled = 0; | |
| 557 if (get(handles.checkbox_process16khz, 'Value') == 1) | |
| 558 if (Fs ~= 16000) | |
| 559 y = resample(y, 16000, Fs); | |
| 560 wavfile = generateRandomFile(wavfile, handles); | |
| 561 wavfile = [wavfile(1:end-4) '_16kHz.wav']; | |
| 562 warning off; % stop clipping messages | |
| 563 wavwrite(y, 16000, nbits, wavfile); | |
| 564 warning on; | |
| 565 resampled = 1; | |
| 566 end | |
| 567 [y, Fs] = wavread(wavfile); % reread the resampled file | |
| 568 end | |
| 569 | |
| 570 % calculate the length of data vectors - all measures will have this | |
| 571 % length - important!! | |
| 572 data_len = floor(length(y) / Fs * 1000 / frameshift); | |
| 573 | |
| 574 % parse the parameter list to get proper ordering | |
| 575 paramlist = func_parseParameters(paramlist, handles, matfile, data_len); | |
| 576 | |
| 577 for n=1:length(paramlist) | |
| 578 | |
| 579 % check if 'stop' button has been pressed | |
| 580 if (~ishandle(MBoxHandles.figure_MessageBox) || get(MBoxHandles.figure_MessageBox, 'UserData') == 1) | |
| 581 break; | |
| 582 end | |
| 583 | |
| 584 | |
| 585 % F0 straight | |
| 586 if (strcmp(paramlist{n}, 'F0 (Straight)')) | |
| 587 messages{k} = [messages{k} 'strF0 ']; | |
| 588 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 589 drawnow; | |
| 590 err = 0; | |
| 591 | |
| 592 if (useTextgrid) | |
| 593 try | |
| 594 [strF0, V] = func_StraightPitch(y, Fs, VSData.vars, textgridfile); | |
| 595 catch | |
| 596 err = 1; | |
| 597 end | |
| 598 else | |
| 599 try | |
| 600 [strF0, V] = func_StraightPitch(y, Fs, VSData.vars); | |
| 601 catch | |
| 602 err = 1; | |
| 603 end | |
| 604 end | |
| 605 | |
| 606 if (strcmp(VSData.vars.F0algorithm, 'F0 (Straight)') && err == 1) | |
| 607 messages{k+1} = 'Error: Problem with STRAIGHT - please check settings'; | |
| 608 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 609 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 610 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 611 | |
| 612 msgbox({'Error: Unable to proceed.', 'Problem with STRAIGHT - please check settings'}, 'Error', 'error', 'modal'); | |
| 613 if (resampled) % delete the temporary file if it exists | |
| 614 delete(wavfile); | |
| 615 end | |
| 616 return; | |
| 617 end | |
| 618 | |
| 619 strF0 = strF0(1:frameshift:end); % drop samples if necessary | |
| 620 | |
| 621 if (length(strF0) > data_len) | |
| 622 strF0 = strF0(1:data_len); | |
| 623 elseif (length(strF0) < data_len) | |
| 624 strF0 = [strF0; ones(data_len - length(strF0), 1) * NaN]; | |
| 625 end | |
| 626 | |
| 627 if (exist(matfile, 'file')) | |
| 628 save(matfile, 'strF0', 'Fs', '-append'); | |
| 629 else | |
| 630 save(matfile, 'strF0', 'Fs'); | |
| 631 end | |
| 632 | |
| 633 | |
| 634 % F0 (Snack) | |
| 635 elseif (strcmp(paramlist{n}, 'F0 (Snack)')) | |
| 636 messages{k} = [messages{k} 'sF0 ']; | |
| 637 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 638 drawnow; | |
| 639 | |
| 640 % guard case for 32-bit precision files - some version of snack | |
| 641 % on a 64-bit machine causes pitch estimation to fail | |
| 642 use_alt_file = 0; | |
| 643 if (nbits ~= 16) | |
| 644 snackwavfile = [wavfile(1:end-4) '_16b.wav']; | |
| 645 use_alt_file = 1; | |
| 646 wavwrite(y, Fs, 16, snackwavfile); | |
| 647 else | |
| 648 snackwavfile = wavfile; | |
| 649 end | |
| 650 | |
| 651 err = 0; | |
| 652 try | |
| 653 [sF0, sV, err] = func_SnackPitch(snackwavfile, windowsize/1000, frameshift/1000, maxF0, minF0); | |
| 654 catch | |
| 655 err = 1; | |
| 656 end | |
| 657 | |
| 658 % check for fatal errors | |
| 659 if (strcmp(VSData.vars.F0algorithm, 'F0 (Snack)') && err == 1) | |
| 660 messages{k+1} = 'Error: Problem with snack - please check settings'; | |
| 661 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 662 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 663 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 664 | |
| 665 msgbox({'Error: Unable to proceed.', 'Problem with snack - please check settings'}, 'Error', 'error', 'modal'); | |
| 666 if (resampled) % delete the temporary file if it exists | |
| 667 delete(wavfile); | |
| 668 end | |
| 669 if (use_alt_file) | |
| 670 delete(snackwavfile); | |
| 671 end | |
| 672 return; | |
| 673 end | |
| 674 | |
| 675 sF0 = [zeros(floor(windowsize/frameshift/2),1)*NaN; sF0]; sF0 = [sF0; ones(data_len-length(sF0), 1)*NaN]; | |
| 676 sV = [zeros(floor(windowsize/frameshift/2),1)*NaN; sV]; sV = [sV; ones(data_len-length(sV), 1)* NaN]; | |
| 677 | |
| 678 if (exist(matfile, 'file')) | |
| 679 save(matfile, 'sF0', 'sV', 'Fs', '-append'); | |
| 680 else | |
| 681 save(matfile, 'sF0', 'sV', 'Fs'); | |
| 682 end | |
| 683 | |
| 684 if (use_alt_file) | |
| 685 delete(snackwavfile); | |
| 686 end | |
| 687 | |
| 688 % F0 (Praat) | |
| 689 elseif (strcmp(paramlist{n}, 'F0 (Praat)')) | |
| 690 messages{k} = [messages{k} 'pF0 ']; | |
| 691 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 692 drawnow; | |
| 693 | |
| 694 % guard case for 32-bit precision files - some version of snack | |
| 695 % on a 64-bit machine causes pitch estimation to fail | |
| 696 err = 0; | |
| 697 try | |
| 698 [pF0, err] = func_PraatPitch(wavfile, frameshift/1000, frame_precision, ... | |
| 699 VSData.vars.F0Praatmin, ... | |
| 700 VSData.vars.F0Praatmax, ... | |
| 701 VSData.vars.F0PraatSilenceThreshold, ... | |
| 702 VSData.vars.F0PraatVoiceThreshold, ... | |
| 703 VSData.vars.F0PraatOctaveCost, ... | |
| 704 VSData.vars.F0PraatOctaveJumpCost, ... | |
| 705 VSData.vars.F0PraatVoicedUnvoicedCost, ... | |
| 706 VSData.vars.F0PraatKillOctaveJumps, ... | |
| 707 VSData.vars.F0PraatSmooth, ... | |
| 708 VSData.vars.F0PraatSmoothingBandwidth, ... | |
| 709 VSData.vars.F0PraatInterpolate, ... | |
| 710 VSData.vars.F0Praatmethod, ... | |
| 711 data_len); | |
| 712 catch | |
| 713 err = 1; | |
| 714 end | |
| 715 | |
| 716 % check for fatal errors | |
| 717 if (strcmp(VSData.vars.F0algorithm, 'F0 (Praat)') && err ~= 0) | |
| 718 messages{k+1} = 'Error: Problem with Praat - please check settings'; | |
| 719 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 720 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 721 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 722 | |
| 723 msgbox({'Error: Unable to proceed.', 'Problem with Praat - please check settings'}, 'Error', 'error', 'modal'); | |
| 724 if (resampled) % delete the temporary file if it exists | |
| 725 delete(wavfile); | |
| 726 end | |
| 727 | |
| 728 return; | |
| 729 elseif (err ~= 0) | |
| 730 messages{k} = [messages{k} '(error) ']; | |
| 731 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 732 end | |
| 733 | |
| 734 if (exist(matfile, 'file')) | |
| 735 save(matfile, 'pF0', 'Fs', '-append'); | |
| 736 else | |
| 737 save(matfile, 'pF0', 'Fs'); | |
| 738 end | |
| 739 | |
| 740 % F0 (Other) | |
| 741 elseif (strcmp(paramlist{n}, 'F0 (Other)')) | |
| 742 messages{k} = [messages{k} 'oF0 ']; | |
| 743 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 744 drawnow; | |
| 745 | |
| 746 oF0 = zeros(data_len, 1) * NaN; % allocate some memory | |
| 747 | |
| 748 err = 0; | |
| 749 try | |
| 750 [F0, errmsg] = func_OtherPitch(wavfile, handles); | |
| 751 catch | |
| 752 err = 1; | |
| 753 end | |
| 754 | |
| 755 if ((length(F0)==1 && isnan(F0)) || isempty(F0)) | |
| 756 err = 1; | |
| 757 end | |
| 758 | |
| 759 % check for fatal errors | |
| 760 if (err == 1) | |
| 761 messages{k} = [messages{k} '- error: ' errmsg ' ']; | |
| 762 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 763 | |
| 764 if (strcmp(VSData.vars.F0algorithm, 'F0 (Other)')) | |
| 765 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 766 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 767 msgbox({['Error: ' errmsg], 'Problem with F0 estimation - please check settings'}, 'Error', 'error', 'modal'); | |
| 768 if (resampled) % delete the temporary file if it exists | |
| 769 delete(wavfile); | |
| 770 end | |
| 771 return; | |
| 772 end | |
| 773 elseif (err ~= 0) | |
| 774 messages{k} = [messages{k} '(error) ']; | |
| 775 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 776 end | |
| 777 | |
| 778 | |
| 779 if (VSData.vars.F0OtherOffset + length(F0) <= data_len) | |
| 780 oF0(VSData.vars.F0OtherOffset+1:VSData.vars.F0OtherOffset + length(F0)) = F0; | |
| 781 else % need to trim F0 | |
| 782 oF0(VSData.vars.F0OtherOffset+1:end) = F0(1:data_len - VSData.vars.F0OtherOffset); | |
| 783 end | |
| 784 | |
| 785 if (exist(matfile, 'file')) | |
| 786 save(matfile, 'oF0', 'Fs', '-append'); | |
| 787 else | |
| 788 save(matfile, 'oF0', 'Fs'); | |
| 789 end | |
| 790 | |
| 791 | |
| 792 % F1, F2, F3, F4 (Snack) | |
| 793 elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Snack)')) | |
| 794 messages{k} = [messages{k} 'FMTs ']; | |
| 795 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 796 drawnow; | |
| 797 | |
| 798 % guard case for 32-bit files - some version of snack on a | |
| 799 % 64-bit machine causes formant estimation to fail | |
| 800 use_alt_file = 0; | |
| 801 if (nbits ~= 16) | |
| 802 snackwavfile = [wavfile(1:end-4) '_16b.wav']; | |
| 803 wavwrite(y, Fs, 16, snackwavfile); | |
| 804 use_alt_file = 1; | |
| 805 else | |
| 806 snackwavfile = wavfile; | |
| 807 end | |
| 808 | |
| 809 [sF1, sF2, sF3, sF4, sB1, sB2, sB3, sB4, err] = func_SnackFormants(snackwavfile, windowsize/1000, frameshift/1000, preemphasis); | |
| 810 | |
| 811 if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Snack)') && err == 1) | |
| 812 messages{k+1} = 'Error: Problem with snack - please check settings'; | |
| 813 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 814 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 815 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 816 | |
| 817 msgbox({'Error: Unable to proceed.', 'Problem with snack - please check settings'}, 'Error', 'error', 'modal'); | |
| 818 if (resampled) % delete the temporary file if it exists | |
| 819 delete(wavfile); | |
| 820 end | |
| 821 if (use_alt_file) | |
| 822 delete(snackwavfile); | |
| 823 end | |
| 824 | |
| 825 return; | |
| 826 end | |
| 827 | |
| 828 sF1 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF1]; sF1 = [sF1; ones(data_len-length(sF1), 1)*NaN]; | |
| 829 sF2 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF2]; sF2 = [sF2; ones(data_len-length(sF2), 1)*NaN]; | |
| 830 sF3 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF3]; sF3 = [sF3; ones(data_len-length(sF3), 1)*NaN]; | |
| 831 sF4 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sF4]; sF4 = [sF4; ones(data_len-length(sF4), 1)*NaN]; | |
| 832 sB1 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB1]; sB1 = [sB1; ones(data_len-length(sB1), 1)*NaN]; | |
| 833 sB2 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB2]; sB2 = [sB2; ones(data_len-length(sB2), 1)*NaN]; | |
| 834 sB3 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB3]; sB3 = [sB3; ones(data_len-length(sB3), 1)*NaN]; | |
| 835 sB4 = [zeros(floor(windowsize/frameshift/2),1) * NaN; sB4]; sB4 = [sB4; ones(data_len-length(sB4), 1)*NaN]; | |
| 836 | |
| 837 if (exist(matfile, 'file')) | |
| 838 save(matfile, 'sF1', 'sF2', 'sF3', 'sF4', 'sB1', 'sB2', 'sB3', 'sB4', '-append'); | |
| 839 save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); | |
| 840 else | |
| 841 save(matfile, 'sF1', 'sF2', 'sF3', 'sF4', 'sB1', 'sB2', 'sB3', 'sB4'); | |
| 842 save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); | |
| 843 end | |
| 844 | |
| 845 if (use_alt_file) | |
| 846 delete(snackwavfile); | |
| 847 end | |
| 848 | |
| 849 % F1, F2, F3, F4 (Praat) | |
| 850 elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Praat)')) | |
| 851 messages{k} = [messages{k} 'FMTp ']; | |
| 852 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 853 drawnow; | |
| 854 | |
| 855 [pF1, pF2, pF3, pF4, pB1, pB2, pB3, pB4, err] = ... | |
| 856 func_PraatFormants(wavfile, windowsize/1000, frameshift/1000, frame_precision, data_len); | |
| 857 | |
| 858 if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Praat)') && err ~= 0) | |
| 859 messages{k+1} = 'Error: Problem with Praat - please check settings'; | |
| 860 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 861 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 862 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 863 | |
| 864 msgbox({'Error: Unable to proceed.', 'Problem with Praat - please check settings'}, 'Error', 'error', 'modal'); | |
| 865 if (resampled) % delete the temporary file if it exists | |
| 866 delete(wavfile); | |
| 867 end | |
| 868 | |
| 869 return; | |
| 870 end | |
| 871 | |
| 872 if (exist(matfile, 'file')) | |
| 873 save(matfile, 'pF1', 'pF2', 'pF3', 'pF4', 'pB1', 'pB2', 'pB3', 'pB4', '-append'); | |
| 874 save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); | |
| 875 else | |
| 876 save(matfile, 'pF1', 'pF2', 'pF3', 'pF4', 'pB1', 'pB2', 'pB3', 'pB4'); | |
| 877 save(matfile, 'windowsize', 'frameshift', 'preemphasis', '-append'); | |
| 878 end | |
| 879 | |
| 880 % F1, F2, F3, F4 (Other) | |
| 881 elseif (strcmp(paramlist{n}, 'F1, F2, F3, F4 (Other)')) | |
| 882 messages{k} = [messages{k} 'oFMTs ']; | |
| 883 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 884 drawnow; | |
| 885 | |
| 886 oF1 = zeros(data_len, 1) * NaN; % allocate some memory | |
| 887 oF2 = zeros(data_len, 1) * NaN; | |
| 888 oF3 = zeros(data_len, 1) * NaN; | |
| 889 oF4 = zeros(data_len, 1) * NaN; | |
| 890 oB1 = zeros(data_len, 1) * NaN; | |
| 891 oB2 = zeros(data_len, 1) * NaN; | |
| 892 oB3 = zeros(data_len, 1) * NaN; | |
| 893 oB4 = zeros(data_len, 1) * NaN; | |
| 894 | |
| 895 err = 0; | |
| 896 try | |
| 897 [F1, F2, F3, F4, B1, B2, B3, B4, errmsg] = func_OtherFormants(wavfile, handles); | |
| 898 catch | |
| 899 err = 1; | |
| 900 end | |
| 901 | |
| 902 if ((length(F1) == 1 && isnan(F1)) || isempty(F1)) | |
| 903 err = 1; | |
| 904 end | |
| 905 | |
| 906 if (err == 1) | |
| 907 messages{k} = [messages{k} '-error: ' errmsg]; | |
| 908 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 909 | |
| 910 if (strcmp(VSData.vars.FMTalgorithm, 'F1, F2, F3, F4 (Other)')) | |
| 911 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 912 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 913 | |
| 914 msgbox({'Error: Unable to proceed.', 'Problem with formant tracker - please check settings'}, 'Error', 'error', 'modal'); | |
| 915 if (resampled) % delete the temporary file if it exists | |
| 916 delete(wavfile); | |
| 917 end | |
| 918 | |
| 919 return; | |
| 920 end | |
| 921 end | |
| 922 | |
| 923 % build up the actual vector | |
| 924 if (VSData.vars.FormantsOtherOffset + length(F1) <= data_len) | |
| 925 oF1(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F1)) = F1; | |
| 926 oF2(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F2)) = F2; | |
| 927 oF3(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F3)) = F3; | |
| 928 oF4(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(F4)) = F4; | |
| 929 oB1(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B1)) = B1; | |
| 930 oB2(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B2)) = B2; | |
| 931 oB3(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B3)) = B3; | |
| 932 oB4(VSData.vars.FormantsOtherOffset+1:VSData.vars.FormantsOtherOffset + length(B4)) = B4; | |
| 933 else % need to trim | |
| 934 oF1(VSData.vars.FormantsOtherOffset+1:end) = F1(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 935 oF2(VSData.vars.FormantsOtherOffset+1:end) = F2(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 936 oF3(VSData.vars.FormantsOtherOffset+1:end) = F3(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 937 oF4(VSData.vars.FormantsOtherOffset+1:end) = F4(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 938 oB1(VSData.vars.FormantsOtherOffset+1:end) = B1(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 939 oB2(VSData.vars.FormantsOtherOffset+1:end) = B2(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 940 oB3(VSData.vars.FormantsOtherOffset+1:end) = B3(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 941 oB4(VSData.vars.FormantsOtherOffset+1:end) = B4(1:data_len - VSData.vars.FormantsOtherOffset); | |
| 942 end | |
| 943 | |
| 944 if (exist(matfile, 'file')) | |
| 945 save(matfile, 'oF1', 'oF2', 'oF3', 'oF4', 'oB1', 'oB2', 'oB3', 'oB4', '-append'); | |
| 946 else | |
| 947 save(matfile, 'oF1', 'oF2', 'oF3', 'oF4', 'oB1', 'oB2', 'oB3', 'oB4'); | |
| 948 end | |
| 949 | |
| 950 | |
| 951 | |
| 952 % H1, H2, H4 | |
| 953 elseif (strcmp(paramlist{n}, 'H1, H2, H4')) | |
| 954 messages{k} = [messages{k} 'Hx ']; | |
| 955 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 956 drawnow; | |
| 957 | |
| 958 matdata = load(matfile); | |
| 959 | |
| 960 F0 = func_parseF0(matdata, F0algorithm); | |
| 961 | |
| 962 if (useTextgrid) | |
| 963 [H1, H2, H4, isComplete] = func_GetH1_H2_H4(y, Fs, F0, MBoxHandles, VSData.vars, textgridfile); | |
| 964 else | |
| 965 [H1, H2, H4, isComplete] = func_GetH1_H2_H4(y, Fs, F0, MBoxHandles, VSData.vars); | |
| 966 end | |
| 967 | |
| 968 HF0algorithm = F0algorithm; | |
| 969 | |
| 970 % check if the process was completed | |
| 971 if (isComplete==0) | |
| 972 messages{k+1} = 'Stop button pressed by user.'; | |
| 973 if (ishandle(MBoxHandles.figure_MessageBox)) | |
| 974 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k+1); | |
| 975 end | |
| 976 if (resampled) % delete the temporary file if it exists | |
| 977 delete(wavfile); | |
| 978 end | |
| 979 | |
| 980 return; | |
| 981 end | |
| 982 | |
| 983 if (exist(matfile, 'file')) | |
| 984 save(matfile, 'H1', 'H2', 'H4', 'HF0algorithm', '-append'); | |
| 985 else | |
| 986 save(matfile, 'H1', 'H2', 'H4', 'HF0algorithm'); | |
| 987 end | |
| 988 | |
| 989 | |
| 990 | |
| 991 % A1, A2, A3 | |
| 992 elseif (strcmp(paramlist{n}, 'A1, A2, A3')) | |
| 993 messages{k} = [messages{k} 'Ax ']; | |
| 994 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 995 drawnow; | |
| 996 | |
| 997 matdata = load(matfile); % file has to exist at this point - dependency checking should make sure of this | |
| 998 | |
| 999 F0 = func_parseF0(matdata, F0algorithm); | |
| 1000 [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); | |
| 1001 | |
| 1002 if (useTextgrid) | |
| 1003 [A1, A2, A3] = func_GetA1A2A3(y, Fs, F0, F1, F2, F3, VSData.vars, textgridfile); | |
| 1004 else | |
| 1005 [A1, A2, A3] = func_GetA1A2A3(y, Fs, F0, F1, F2, F3, VSData.vars); | |
| 1006 end | |
| 1007 | |
| 1008 AFMTalgorithm = FMTalgorithm; | |
| 1009 | |
| 1010 save(matfile, 'A1', 'A2', 'A3', 'AFMTalgorithm', '-append'); | |
| 1011 | |
| 1012 | |
| 1013 % H1*-H2* and H2*-H4* | |
| 1014 elseif (strcmp(paramlist{n}, 'H1*-H2*, H2*-H4*')) | |
| 1015 messages{k} = [messages{k} 'H1H2c H2H4c ']; | |
| 1016 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1017 drawnow; | |
| 1018 | |
| 1019 matdata = load(matfile); | |
| 1020 F0 = func_parseF0(matdata, F0algorithm); | |
| 1021 [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); | |
| 1022 | |
| 1023 [H1H2c, H2H4c] = func_GetH1H2_H2H4(matdata.H1, matdata.H2, matdata.H4, Fs, F0, F1, F2); | |
| 1024 save(matfile, 'H1H2c', 'H2H4c', '-append'); | |
| 1025 | |
| 1026 | |
| 1027 % H1*-A1*, H1*-A2*, and H1*-A3* | |
| 1028 elseif (strcmp(paramlist{n}, 'H1*-A1*, H1*-A2*, H1*-A3*')) | |
| 1029 messages{k} = [messages{k} 'H1A1c H1A2c H1A3c ']; | |
| 1030 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1031 drawnow; | |
| 1032 | |
| 1033 matdata = load(matfile); | |
| 1034 F0 = func_parseF0(matdata, F0algorithm); | |
| 1035 [F1, F2, F3] = func_parseFMT(matdata, FMTalgorithm); | |
| 1036 | |
| 1037 [H1A1c, H1A2c, H1A3c] = func_GetH1A1_H1A2_H1A3(matdata.H1, matdata.A1, matdata.A2, matdata.A3, Fs, F0, F1, F2, F3); | |
| 1038 save(matfile, 'H1A1c', 'H1A2c', 'H1A3c', '-append'); | |
| 1039 | |
| 1040 | |
| 1041 % Energy | |
| 1042 elseif (strcmp(paramlist{n}, 'Energy')) | |
| 1043 messages{k} = [messages{k} 'E ']; | |
| 1044 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1045 drawnow; | |
| 1046 | |
| 1047 matdata = load(matfile); | |
| 1048 F0 = func_parseF0(matdata, F0algorithm); | |
| 1049 | |
| 1050 Energy = func_GetEnergy(y, F0, Fs, VSData.vars); | |
| 1051 save(matfile, 'Energy', '-append'); | |
| 1052 | |
| 1053 | |
| 1054 % CPP | |
| 1055 elseif (strcmp(paramlist{n}, 'CPP')) | |
| 1056 messages{k} = [messages{k} 'CPP ']; | |
| 1057 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1058 drawnow; | |
| 1059 | |
| 1060 matdata = load(matfile); | |
| 1061 F0 = func_parseF0(matdata, F0algorithm); | |
| 1062 | |
| 1063 CPP = func_GetCPP(y, Fs, F0, VSData.vars); | |
| 1064 save(matfile, 'CPP', '-append'); | |
| 1065 | |
| 1066 | |
| 1067 % HNR | |
| 1068 elseif (strcmp(paramlist{n}, 'Harmonic to Noise Ratios - HNR')) | |
| 1069 messages{k} = [messages{k} 'HNR ']; | |
| 1070 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1071 drawnow; | |
| 1072 | |
| 1073 matdata = load(matfile); | |
| 1074 F0 = func_parseF0(matdata, F0algorithm); | |
| 1075 | |
| 1076 [HNR05, HNR15, HNR25, HNR35] = func_GetHNR(y, Fs, F0, VSData.vars); | |
| 1077 save(matfile, 'HNR05', 'HNR15', 'HNR25', 'HNR35', '-append'); | |
| 1078 | |
| 1079 | |
| 1080 % SHR | |
| 1081 elseif (strcmp(paramlist{n}, 'Subharmonic to Harmonic Ratio/F0 - SHR, (shr)F0')) | |
| 1082 messages{k} = [messages{k} 'SHR, shrF0 ']; | |
| 1083 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', k); | |
| 1084 drawnow; | |
| 1085 | |
| 1086 matdata = load(matfile); | |
| 1087 | |
| 1088 [SHR, shrF0] = func_GetSHRP(y, Fs, VSData.vars, data_len); | |
| 1089 save(matfile, 'SHR', 'shrF0', '-append'); | |
| 1090 end | |
| 1091 | |
| 1092 end | |
| 1093 | |
| 1094 if (resampled) % delete the temporary file if it exists | |
| 1095 delete(wavfile); | |
| 1096 end | |
| 1097 | |
| 1098 end | |
| 1099 | |
| 1100 messages{length(filelist)+1} = 'Processing complete.'; | |
| 1101 set(MBoxHandles.listbox_messages, 'String', messages, 'Value', length(filelist)+1); | |
| 1102 set(MBoxHandles.pushbutton_close, 'Enable', 'on'); | |
| 1103 set(MBoxHandles.pushbutton_stop, 'Enable', 'off'); | |
| 1104 | |
| 1105 | |
| 1106 % Function to generate random file names | |
| 1107 function filename = generateRandomFile(fname, handles) | |
| 1108 VSData = guidata(handles.VSHandle); | |
| 1109 N = 8; % this many random digits/characters | |
| 1110 [pathstr, name, ext] = fileparts(fname); | |
| 1111 randstr = '00000000'; | |
| 1112 | |
| 1113 isok = 0; | |
| 1114 | |
| 1115 while(isok == 0) | |
| 1116 for k=1:N | |
| 1117 randstr(k) = floor(rand() * 25) + 65; | |
| 1118 end | |
| 1119 filename = [pathstr VSData.vars.dirdelimiter 'tmp_' name randstr ext]; | |
| 1120 | |
| 1121 if (exist(filename, 'file') == 0) | |
| 1122 isok = 1; | |
| 1123 end | |
| 1124 end | |
| 1125 | |
| 1126 | |
| 1127 % --- Executes when user attempts to close figure_ParameterEstimation. | |
| 1128 function figure_ParameterEstimation_CloseRequestFcn(hObject, eventdata, handles) | |
| 1129 % hObject handle to figure_ParameterEstimation (see GCBO) | |
| 1130 % eventdata reserved - to be defined in a future version of MATLAB | |
| 1131 % handles structure with handles and user data (see GUIDATA) | |
| 1132 | |
| 1133 % Hint: delete(hObject) closes the figure | |
| 1134 if (isfield(handles, 'SWfig')) | |
| 1135 delete(handles.SWfig); | |
| 1136 end | |
| 1137 | |
| 1138 VSData = guidata(handles.VSHandle); | |
| 1139 VSData.vars.PE_showwaveforms = 0; | |
| 1140 guidata(handles.VSHandle, VSData); | |
| 1141 | |
| 1142 delete(hObject); | |
| 1143 | |
| 1144 |
