Skip to content

EVS: wrong basop thresholds in StableHighPitchDetect()

In StableHighPitchDetect(), there is the following code

    if ( ... *voicing0_sm > 0.65f && *voicing0_sm > 0.7f * ( *voicing_sm ) )
    {
        hVAD->hangover_cnt_music = 0;
    }

while in EVS BASOP StableHighPitchDetect_fx() it is

    IF( ( ... &&
        ( GT_16( *voicing0_sm, 16384 ) ) && ( GT_16( *voicing0_sm, mult_r( *voicing_sm, 21299 ) ) ) )

        {
            hVAD->hangover_cnt_music = 0;
            move16();
        }

and IVAS BASOP StableHighPitchDetect_ivas_fx() it is

    IF( ... &&
        ( GT_16( *voicing0_sm, 21299 ) ) && ( GT_16( *voicing0_sm, mult_r( *voicing_sm, 22938  ) ) ) )

        {
            hVAD->hangover_cnt_music = 0;
            move16();
        }

It seems to me that the thresholds against which *voicing0_sm are compared to are wrong in EVS.


Another bug in the same files concerns the following code:

pitch_freq_point = (int16_t) ( L_FFT / pitch[1] + 0.5f );

while in EVS BASOP StableHighPitchDetect_fx() it is

tmp = div_s( shl( 1, sub( 14, exp ) ), Top );     /*Q(29 - exp)*/
L_tmp = L_mult0( tmp, L_FFT );
pitch_freq_point = extract_h( L_add( L_shl( L_tmp, sub( exp, 13 ) ), 32768 ) ); /* Q0*/

and IVAS BASOP StableHighPitchDetect_ivas_fx() it is

pitch_freq_point = idiv1616( L_FFT, Top ); /* Q0*/

The value of pitch_freq_point in EVS BASOP is usually higher (by 1) than the value in FLP and IVAS BASOP, which results in different short pitch decisions.

Edited by vaclav