diff Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_GetSHRP.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/Descriptors/Matlab/MPEG7/FromWeb/VoiceSauce/func_GetSHRP.m	Wed Feb 13 11:02:39 2013 +0000
@@ -0,0 +1,81 @@
+function [SHR,F0]=func_GetSHRP(y,Fs, variables, datalen)
+%function [f0_time,f0_value,SHR,f0_candidates]=func_GetSHRP(y,Fs,F0MinMax,timestep,SHR_Threshold)
+% Input:  y, Fs - from wavread
+%         variables - settings from initialization/setting
+%         datalen - output data length
+% Output: F0 - F0 values
+%         SHR - Subharmonic-harmonic ratio values
+%         (and eventually, F0 candidates?)
+% Author: Kristine Yu, Department of Linguistics, UCLA, based off code
+% by Yen-Liang Shue for func_PraatPitch.m
+
+
+%%%%%%%%%%% Get/set arguments to shrp.m
+
+% TESTING
+% [y,Fs]=wavread('work/beijing_f3_50_a.wav'); % for testing
+% F0MinMax = [vars.SHRmin, vars.SHRmax]; % For testing
+% windowsize = vars.windowsize; % Set frame_length to 25ms, the VS default, for testing
+% frameshift = vars.frameshift; % Set 10 ms frameshift, for testing
+% SHR_Threshold = 0.4; %
+% frame_precision = 1; % fudge factor for time alignment
+% ceiling = 1250;
+% med_smooth = 0; CHECK_VOICING = 0; % Leave default: no smoothing, no voice detection
+
+%%% Get settings
+
+F0MinMax = [variables.SHRmin, variables.SHRmax]; % Set lower and
+                                                       % upper bounds for
+                                                       % f0 estimation
+  
+frameshift = variables.frameshift; % this is in ms
+windowsize = variables.windowsize; % also in ms
+
+SHR_Threshold = variables.SHRThreshold; % Set subharmonic-to-harmonic ratio
+
+ceiling = 1250; % Leave default 1250 Hz
+
+med_smooth = 0; CHECK_VOICING = 0; % Leave default: no smoothing, no voice detection
+
+frame_precision = variables.frame_precision; % how many frames can
+                                            % time-alignment be off by,
+                                            % when outputting data vectors?
+
+%%%%%%%%%%% Calculate subharmonic-harmonic ratios and f0 tracks
+% Call Xuejing Sun's subharmonic-harmonic ratio based pitch detection
+% algorithm shrp.m
+% Available for download here
+%http://www.mathworks.com/matlabcentral/fileexchange/1230-pitch-determination-algorithm
+%http://www.speakingx.com/blog/2008/01/02/pitch-determination
+
+[f0_time,f0_value,SHR_value,f0_candidates]=shrp(y,Fs,F0MinMax,windowsize,frameshift,SHR_Threshold,ceiling,med_smooth,CHECK_VOICING);
+
+
+%%%%%%%%%%% Postprocess subharmonic-harmonic ratios and f0 tracks 
+
+% Initialize F0 and subharmonic-harmonic ratio values  
+F0 = zeros(datalen, 1) * NaN; 
+SHR = zeros(datalen, 1) * NaN; 
+  
+t = round(f0_time);  % time locations rounded to nearest ms
+
+start = 0; % Like timecoures from Praat, we might have missing values so pad with NaNs at
+           % beginning and end if necessary.
+finish = t(end);
+increment = frameshift;
+
+for k=start:increment:finish
+    [val, inx] = min(abs(t - k)); % try to find the closest value
+    if (abs(t(inx) - k) > frame_precision * frameshift)  % no valid value found
+        continue;
+    end
+    
+    n = round(k / frameshift) + 1; % KY I added a 1 because Matlab index starts at 1, not 0
+    if (n < 1 || n > datalen)
+        continue;
+    end
+    
+    F0(n+1) = f0_value(inx); % f0 values
+    SHR(n+1) = SHR_value(inx); % SHR values
+    % I eventually would like to get candidates as well
+end