Commit 63b677b4 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_934_fix' into 'main'

Fix for 3gpp issue 934: Significant spectral distortion between 8 to 15kHz for SBA 32kbps [allow regression]

See merge request !682
parents a3dba4a9 a9e4b7e1
Loading
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -2830,6 +2830,7 @@ void GenShapedSHBExcitation_ivas_fx(
    Word16 voiceFacEst[NB_SUBFR16k];
    Word16 zero_mem[LPC_SHB_ORDER];
    Word32 syn_shb_ener_sf[4];
    Word16 syn_shb_ener_sf_q[4];
    Word16 tempSHB[80];
    Word16 Q_pow1, Q_pow22;

@@ -3714,31 +3715,56 @@ void GenShapedSHBExcitation_ivas_fx(
        set16_fx( zero_mem, 0, LPC_SHB_ORDER );

        Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
        tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
        Scale_sig( tempSHB, 80, tmp );
        syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
        move32();
        syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
        move16();

        Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
        tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
        Scale_sig( tempSHB, 80, tmp );
        syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
        move32();
        syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
        move16();

        Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
        tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
        Scale_sig( tempSHB, 80, tmp );
        syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
        move32();
        syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
        move16();

        Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
        tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
        Scale_sig( tempSHB, 80, tmp );
        syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
        move32();
        syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
        move16();

        tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
        syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
        move32();
        syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
        move32();
        syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
        move32();
        syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
        move32();

        /* i: exc16kWhtnd       in Q_bwe_exc        */
        /* o: tempSHB           in Q_bwe_exc        */
        /* o: syn_shb_ener_sf   in (2*Q_bwe_exc+1)  */
        /* o: syn_shb_ener_sf   in tmp2  */
        IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
        {
            L_tmp = sum32_fx( syn_shb_ener_sf, 4 );

            /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
            tmp = shl( Q_shb, 1 );
            tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 );
            L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */

            *Q_bwe_exc = sub( *Q_bwe_exc, exp );