Commit 3292aa15 authored by Manuel Jander's avatar Manuel Jander
Browse files

Small improvement of synth_buf scaling and get rid of some magic constants...

Small improvement of synth_buf scaling and get rid of some magic constants that are not the right ones anymore.
parent 85a0fa2e
Loading
Loading
Loading
Loading
Loading
+53 −22
Original line number Diff line number Diff line
@@ -1099,10 +1099,8 @@ void ivas_mdct_core_reconstruct_fx(
    Word16 q_syn = 0;
    move16();
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
    Word16 q_win = -2;
    move16();
    Word16 q_winFB = -2;
    move16();
    Word16 q_win;
    Word16 q_winFB;
#else
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT
    Word16 q_win = -1;
@@ -1171,15 +1169,19 @@ void ivas_mdct_core_reconstruct_fx(
            st->hTcxDec->q_old_synth = 0;
            move16();
        }
#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
        Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len );                                                                // Q = st->hTcxDec->q_old_synth
        Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth
#endif
        q_syn = st->hTcxDec->q_old_synth;
        move16();
        set16_fx( synth_fx, 0, L_FRAME_PLUS + M );
        set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M );
        IF( st->core != ACELP_CORE )
        {
#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
            Word16 q_win0, q_winFB0;
#else
            Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win
            st->hTcxDec->Q_syn_Overl_TDACFB = q_win;
            move16();
@@ -1209,11 +1211,23 @@ void ivas_mdct_core_reconstruct_fx(
                init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch],
                                  &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] );

#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
                assert( nSubframes[ch] <= 2 );
                q_win0 = q_win;
                move16();
                q_winFB0 = q_winFB;
                move16();
                q_win = -2;
                move16();
                q_winFB = -2;
                move16();
#endif

                IF( !skip_decoding )
                {
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
                    test();
                    test();
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN
                    IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) )
                    {
                        decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB,
@@ -1224,11 +1238,9 @@ void ivas_mdct_core_reconstruct_fx(
                        decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB,
                                              st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 );
                    }

                    // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time.
                    Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) );           // q_win -> st->hTcxDec->q_old_synth
                    Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth
#else
                    test();
                    test();
                    IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) )
                    {
                        decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win,
@@ -1265,6 +1277,26 @@ void ivas_mdct_core_reconstruct_fx(
                }
            }
#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN

            IF ( nSubframes[ch] > 1 ) {
                Word16 q_winN, q_winFBN;

                q_winN = s_min( q_win, q_win0 );
                q_winFBN = s_min( q_winFB, q_winFB0 );
                // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time.
                Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) );           // q_win -> st->hTcxDec->q_old_synth
                Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth
                Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) );           // q_win -> st->hTcxDec->q_old_synth
                Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth
                q_win = q_winN;
                move16();
                q_winFB = q_winFBN;
                move16();
            }

            Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) );                                                                // Q = st->hTcxDec->q_old_synth
            Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) );

            test();
            IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL )
            {
@@ -1272,18 +1304,17 @@ void ivas_mdct_core_reconstruct_fx(
            }
            decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag );

            // norm(synth_buf) >= q_syn - q_win
            // norm(synth_buf) + q_win >= q_syn
            sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) );
            IF( LT_16( sf, 2 ) )
            {
                q_syn = sub( sf, 2 );
            q_syn = add( sf, s_min( q_win, q_winFB ) );
            st->Q_syn = q_syn;
            move16();
            }

            // norm(old_out) >= st->Q_syn - q_win
            // norm(old_out) + q_win >= st->Q_syn
            sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) );
            IF( LT_16( sf, sub( st->Q_syn, q_win ) ) )
            {
                st->Q_syn = add( q_win, sf );
            }
            st->Q_syn = add( sf, s_min( q_win, q_winFB ) );

            Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn)
            st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn );
@@ -1297,8 +1328,8 @@ void ivas_mdct_core_reconstruct_fx(
            st->hTcxDec->Q_syn_OverlFB = st->Q_syn;
            Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn
            st->hTcxDec->Q_syn_Overl = st->Q_syn;
            Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) );     // st->hTcxDec->q_old_synth -> q_syn
            Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn
            Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) );     // st->hTcxDec->q_old_synth -> q_syn
            Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn
            Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) );
#else
            test();