Commit 8f6f9042 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_852_fix_1' into 'main'

Fix for 3gpp issue 852: Missing synthesis when switching to CNG (stereo 13.2kbps)

See merge request !548
parents 8d7e1f5f 7569a189
Loading
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -149,7 +149,8 @@ void initFdCngDec_ivas_fx(
    hFdCngDec->hFdCngCom->periodog_exp = 0;
    move16();
    set32_fx( hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k );
    hFdCngDec->q_smoothed_psd = Q4;
    hFdCngDec->smoothed_psd_exp = 0;
    move16();
    set32_fx( hFdCngDec->hFdCngCom->sidNoiseEstLp, 0, NPART );

    hFdCngDec->ms_last_inactive_bwidth = NB;
@@ -269,7 +270,7 @@ void initFdCngDec_fx(
    hFdCngDec->hFdCngCom->periodog_exp = 0;
    move16();
    set32_fx( hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k );
    hFdCngDec->q_smoothed_psd = Q4;
    hFdCngDec->smoothed_psd_exp = 0;
    move16();

#ifdef IVAS_CODE_CNG
@@ -3020,7 +3021,7 @@ void perform_noise_estimation_dec_ivas_fx(
        hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp;
        move16();
        Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) );
        hFdCngDec->q_smoothed_psd = sub( Q31, hFdCngDec->bandNoiseShape_exp );
        hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp;
        move16();
        set32_fx( &hFdCngDec->smoothed_psd_fx[stopFFTbin], 0, sub( L_FRAME16k, stopFFTbin ) );
    }
+14 −20
Original line number Diff line number Diff line
@@ -722,7 +722,7 @@ static void stereo_dft_generate_comfort_noise_fx(
    Word16 trigo_step;
    Word32 tmp32_1, tmp32_2;
    Word16 q_div, q_sqrt1, q_sqrt2, q_sqrt, sqrt_res;
    Word16 q_shift;
    Word16 q_shift, q_shift_1, q_shift_2, min_q;

    hFdCngCom = st->hFdCngDec->hFdCngCom;

@@ -1381,24 +1381,18 @@ static void stereo_dft_generate_comfort_noise_fx(
    IF( ( chan == 0 ) && LE_32( st->core_brate, SID_2k40 ) )
    {
        /* update smoothed periodogram used by stereo CNA in SID and NO_DATA frames from cngNoiseLevel_flt */
        Word16 l_shift_val = sub( st->hFdCngDec->q_smoothed_psd, sub( Q31, hFdCngCom->cngNoiseLevelExp ) );
        q_shift = L_norm_arr( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k );
        IF( GE_16( q_shift, negate( l_shift_val ) ) )
        {
            scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, negate( l_shift_val ) );
            st->hFdCngDec->q_smoothed_psd = sub( Q31, hFdCngCom->cngNoiseLevelExp );
            move16();
        }
        ELSE
        {
            scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, q_shift );
            st->hFdCngDec->q_smoothed_psd = add( st->hFdCngDec->q_smoothed_psd, q_shift );
        q_shift_1 = L_norm_arr( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k );
        q_shift_2 = L_norm_arr( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN );

        min_q = sub( s_min( add( q_shift_1, sub( Q31, st->hFdCngDec->smoothed_psd_exp ) ), add( q_shift_2, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ) ), 1 /* Guard bit */ );

        scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, sub( min_q, sub( Q31, st->hFdCngDec->smoothed_psd_exp ) ) );
        st->hFdCngDec->smoothed_psd_exp = sub( Q31, min_q );
        move16();
            l_shift_val = add( q_shift, l_shift_val );
            scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, l_shift_val );
            hFdCngCom->cngNoiseLevelExp = sub( hFdCngCom->cngNoiseLevelExp, l_shift_val );
        scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( min_q, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ) );
        hFdCngCom->cngNoiseLevelExp = st->hFdCngDec->smoothed_psd_exp;
        move16();
        }

        FOR( i = hFdCngCom->startBand; i < hFdCngCom->stopFFTbin; i++ )
        {
            ftmp = hFdCngCom->cngNoiseLevel[sub( i, hFdCngCom->startBand )];
@@ -1434,7 +1428,7 @@ static void stereo_dft_generate_comfort_noise_fx(
        }

        /* update msNoiseEst in SID and NO_DATA frames */
        bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], sub( Q31, st->hFdCngDec->q_smoothed_psd ), sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp );
        bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], st->hFdCngDec->smoothed_psd_exp, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp );

        Word32 max_l;
        maximum_32_fx( st->hFdCngDec->msNoiseEst, NPART_SHAPING, &max_l );
+1 −1
Original line number Diff line number Diff line
@@ -2203,7 +2203,7 @@ void stereo_dft_dec_fx(
                        /* take the average of two adjacent frequency bins */
                        cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) );
                    }
                    q_cna_level = sub( Q31, hFdCngDec->q_smoothed_psd );
                    q_cna_level = hFdCngDec->smoothed_psd_exp;
                    move16();
                    l_tmp = Sqrt32( cna_level, &q_cna_level );
                    scale_fact = Mpy_32_32( l_tmp, scale_fact0 );
+1 −1
Original line number Diff line number Diff line
@@ -247,7 +247,7 @@ typedef struct
    Word16 cna_cm_fx[STEREO_DFT_BAND_MAX];      /* stereo CNA - coherence from the last inactive frame */
    Word16 cna_act_fact_fx;                     /* stereo CNA - long-term signal activity factor (0-1) */
    Word16 cna_rescale_fact_fx;
    Word16 q_smoothed_psd;
    Word16 smoothed_psd_exp;
#endif

} FD_CNG_DEC, *HANDLE_FD_CNG_DEC;