view Code/Collation/get_Pitch.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 source
function [] = get_Pitch( dirName, statsFileID )

DEBUG=0;
% this function collates the results of all HNR values

% identify the speaker in the stats file
fprintf( statsFileID, '%s ', dirName );

metricName = '_YIN_pitch';
metricFileName = [ dirName metricName '.txt'];
[ metrics, nanValues ] = readValuesFromFile( statsFileID, metricFileName, metricName );

%---------------- GET THE VOICED FRAME VALUES -------------------

% only wish to consider values from voiced frames.

% going to disregard all unvoiced frames as these produce outliers
[vuv] = detect_VoicedUnvoiced( [ dirName '.wav' ], 0 );
% if vuv is longer than the pitch array, truncate.
if( length(vuv) ~= length(nanValues) )
    if( (length(vuv) - length(nanValues)) > 1 )
        disp('EEEK!');
    end
    if( length(vuv) > length(nanValues) )
        %increase metrics
        nanValues = [ nanValues; 0 ];
    else
        vuv = [vuv; 0];
    end
end


% remove any NaN pitch values from the voicing information
i=1;
while( i <= length(vuv) )

    if( nanValues(i) == 1 )
        if( i == 1 )
            vuv = vuv(2:length(vuv));
            nanValues = nanValues(2:length(nanValues));
        elseif(i == length(vuv) )
            vuv = vuv(1:length(vuv)-1);
            nanValues = nanValues(1:length(nanValues)-1);
        else
            vuv = [ vuv(1: i-1); vuv(i+1:end) ];
            nanValues = [ nanValues(1: i-1); nanValues(i+1:end) ];
        end
    else
        i=i+1;
    end
    
end
    
% remove the non-voiced frames (includes unvoiced and silent frames) from the metrics

voicedFrames = find( vuv == 1 );
metrics = metrics( voicedFrames );


if(DEBUG)
    subplot(211);hold on;
    if( strfind( dirName, 'neg') ) 
        plot(metrics,'b');
    elseif( strfind( dirName, 'pos') ) 
        plot(metrics,'r');
    end
end

% get basic metric set
[ metricSet ] = basicMetricSet( metrics, statsFileID );

if(DEBUG)
    subplot(212); 
    if( strfind( dirName, 'neg') )
        plot(metrics, 'xb'); hold on;
    elseif( strfind( dirName, 'pos') )
        plot(metrics, 'xr'); hold on;
    end
end


% get basic metric set for the first derivative
firstDerivative = gradient( metrics );
[ firstDerivativeMetricSet ] = basicMetricSet( firstDerivative, statsFileID );

% get basic metric set for the second derivative
secondDerivative = gradient( firstDerivative );
[ secondDerivativeMetricSet ] = basicMetricSet( secondDerivative, statsFileID );

fprintf( statsFileID, '\n');