Commit 26798975 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for 3GPP issue 1192: Energy bursts in BWE region for MDCT-stereo @80kbps FB

Link #1192
parent 7d24206b
Loading
Loading
Loading
Loading
+12 −23
Original line number Diff line number Diff line
@@ -416,7 +416,7 @@ void stereo_mdct_core_enc_fx(
                FOR( i = 0; i < L_subframeTCX; i++ )
                {
                    W_tmp = W_mac_32_32( W_mult_32_32( mdst_spectrum_fx[ch][n][i], mdst_spectrum_fx[ch][n][i] ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); /* 2*q_spec+1 */
                    tmp_s = sub( W_norm( W_tmp ), 1 );
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );                                                                  /* 2*q_spec+1+tmp_s */
                    powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp );                         /* 2*q_spec+1+tmp_s-32 */
                    tmp_q_powSpec[( i + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -424,7 +424,7 @@ void stereo_mdct_core_enc_fx(
                    move16();

                    W_tmp = W_mac_32_32( W_mult_32_32( inv_mdst_spectrum_fx[ch][n][i], inv_mdst_spectrum_fx[ch][n][i] ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */
                    tmp_s = sub( W_norm( W_tmp ), 1 );
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );                                     /* 2*q_spec+1+tmp_s */
                    powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp );                /* 2*q_spec+1+tmp_s-32 */
                    tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -438,7 +438,7 @@ void stereo_mdct_core_enc_fx(
                {
                    /* power spectrum: MDCT^2 + MDST^2 */
                    W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); /* 2*q_spec+1 */
                    tmp_s = sub( W_norm( W_tmp ), 1 );
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );                                     /* 2*q_spec+1+tmp_s */
                    powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp );                /* 2*q_spec+1+tmp_s-32 */
                    tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -450,7 +450,7 @@ void stereo_mdct_core_enc_fx(
                        Word32 mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); /* An MDST estimate q_spec*/

                        W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */
                        tmp_s = sub( W_norm( W_tmp ), 1 );
                        tmp_s = W_norm( W_tmp );
                        W_tmp = W_shl( W_tmp, tmp_s );                                     /* 2*q_spec+1+tmp_s */
                        powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp );                /* 2*q_spec+1+tmp_s-32 */
                        tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -459,7 +459,7 @@ void stereo_mdct_core_enc_fx(
                    }

                    W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); /* 2*q_spec+1 */
                    tmp_s = sub( W_norm( W_tmp ), 1 );
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );                                                     /* 2*q_spec+1+tmp_s */
                    powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp );                /* 2*q_spec+1+tmp_s-32 */
                    tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -469,7 +469,7 @@ void stereo_mdct_core_enc_fx(

                /* power spectrum: MDCT^2 + MDST^2 */
                W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][0], sts[ch]->hTcxEnc->spectrum_fx[n][0] ); /* 2*q_spec+1 */
                tmp_s = sub( W_norm( W_tmp ), 1 );
                tmp_s = W_norm( W_tmp );
                W_tmp = W_shl( W_tmp, tmp_s );                                                      /* 2*q_spec+1+tmp_s */
                powerSpec_fx[ch][n * L_subframeTCX] = W_extract_h( W_tmp );                         /* 2*q_spec+1+tmp_s-32 */
                tmp_q_powSpec[n * L_subframeTCX] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -481,7 +481,7 @@ void stereo_mdct_core_enc_fx(
                    Word32 mdst_fx = L_sub( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], sts[ch]->hTcxEnc->spectrum_fx[n][i - 1] ); /* An MDST estimate q_spec*/

                    W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), sts[ch]->hTcxEnc->spectrum_fx[n][i], sts[ch]->hTcxEnc->spectrum_fx[n][i] ); /* 2*q_spec+1 */
                    tmp_s = sub( W_norm( W_tmp ), 1 );
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );                                                                  /* 2*q_spec+1+tmp_s */
                    powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp );                         /* 2*q_spec+1+tmp_s-32 */
                    tmp_q_powSpec[( i + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -490,7 +490,7 @@ void stereo_mdct_core_enc_fx(
                }

                W_tmp = W_mult_32_32( sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1], sts[ch]->hTcxEnc->spectrum_fx[n][L_subframeTCX - 1] ); /* 2*q_spec+1 */
                tmp_s = sub( W_norm( W_tmp ), 1 );
                tmp_s = W_norm( W_tmp );
                W_tmp = W_shl( W_tmp, tmp_s );                                                                                      /* 2*q_spec+1+tmp_s */
                powerSpec_fx[ch][( ( L_subframeTCX - 1 ) + ( n * L_subframeTCX ) )] = W_extract_h( W_tmp );                         /* 2*q_spec+1+tmp_s-32 */
                tmp_q_powSpec[( ( L_subframeTCX - 1 ) + ( n * L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
@@ -501,31 +501,20 @@ void stereo_mdct_core_enc_fx(

        /* Aligning the Q-factors */
        {
            q_powSpec[ch] = Q31;
            FOR( i = 0; i < N_MAX; i++ )
            {
                if ( powerSpec_fx[ch][i] == 0 )
                if ( powerSpec_fx[ch][i] != 0 )
                {
                    tmp_q_powSpec[i] = 63;
                    move16();
                }
                if ( powerSpecMsInv_fx[ch][0][i] == 0 )
                {
                    tmp_q_powSpecInv[i] = 63;
                    move16();
                    q_powSpec[ch] = s_min( q_powSpec[ch], tmp_q_powSpec[i] );
                }
            }
            minimum_s( tmp_q_powSpec, N_MAX, &q_powSpec[ch] );
            minimum_s( tmp_q_powSpecInv, N_MAX, &tmp_s );
            q_powSpec[ch] = s_min( q_powSpec[ch], tmp_s );
            move16();

            FOR( n = 0; n < nSubframes; n++ )
            {
                FOR( i = 0; i < L_subframeTCX; i++ )
                {
                    powerSpecMsInv_fx[ch][n][i] = L_shr( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_powSpec[ch] ) );                                          /* q_powSpec */
                    powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )], sub( tmp_q_powSpec[i], q_powSpec[ch] ) ); /* q_powSpec */
                    move32();
                    powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )], sub( tmp_q_powSpec[i + ( n * L_subframeTCX )], q_powSpec[ch] ) ); /* q_powSpec */
                    move32();
                }
            }