Commit 4a398658 authored by Manuel Jander's avatar Manuel Jander
Browse files

Improve precision of stereo_dft_enc_analyze_fx().

parent 895c9c79
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -700,6 +700,30 @@ ivas_error ivas_cpe_enc_fx(
        hCPE->hStereoDft->Spd_R_smooth_fx_e = sub( hCPE->hStereoDft->Spd_R_smooth_fx_e, temp );
        move16();

#ifdef NONBE_FIX_ISSUE_2206
        /* Align Q values of the signals that need to be aligned in stereo_td_channel_extrapolate_fx() */
        FOR( n = 0; n < CPE_CHANNELS; n++ )
        {
            q_com = MAX_16;
            move16();

            q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 ) );
            q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl ), hCPE->q_input_mem[n] ) );
            q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->old_input_signal32_fx, input_frame ), sts[n]->q_old_inp32 ), 16 ) );

            Copy_Scale_sig_32_16( sts[n]->input32_fx, sts[n]->input_fx, input_frame, sub( q_com, sts[n]->q_inp32 ) );
            sts[n]->q_inp = q_com;
            move16();

            Copy_Scale_sig_32_16( sts[n]->old_input_signal32_fx, sts[n]->old_input_signal_fx, input_frame, sub( q_com, sts[n]->q_old_inp32 ) );
            sts[n]->q_old_inp = q_com;
            move16();

            scale_sig( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl, sub( q_com, hCPE->q_input_mem[n] ) );
            hCPE->q_input_mem[n] = q_com;
            move16();
        }
#else
        q_com = MAX_16;
        move16();
        FOR( n = 0; n < CPE_CHANNELS; n++ )
@@ -728,6 +752,7 @@ ivas_error ivas_cpe_enc_fx(
            hCPE->q_input_mem[n] = q_com;
            move16();
        }
#endif

        stereo_dft_hybrid_ITD_flag_fx( hConfigDft, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max );

@@ -802,6 +827,7 @@ ivas_error ivas_cpe_enc_fx(
                move16();
            }

#ifndef NONBE_FIX_ISSUE_2206
            q_min = sts[1]->q_old_inp;
            move16();
            q_min = s_min( q_min, sts[1]->q_inp );
@@ -837,6 +863,7 @@ ivas_error ivas_cpe_enc_fx(
            move16();
            move16();
            move16();
#endif
        }

        stereo_td_itd_mdct_stereo_fx( hCPE, vad_flag_dtx, vad_hover_flag, input_frame );
+82 −0
Original line number Diff line number Diff line
@@ -1038,7 +1038,64 @@ void stereo_dft_enc_analyze_fx(
        pDFT_R[( ( NFFT - 1 ) - i )] = 0;
        move32();
    }
#ifdef NONBE_FIX_ISSUE_2206
    /* Align Q values of the signals that need to be aligned in stereo_td_channel_extrapolate_fx() */
    FOR( n = 0; n < n_channels; n++ )
    {
        Scale_sig( &mem[n][0], dft_ovl, sub( sts[n]->q_inp, q_input_mem[n] ) ); // Q(sts[n]->q_inp)
        q_input_mem[n] = sts[n]->q_inp;
        move16();
    }

    Word16 shift_input0, shift_input1, shift_mem0, shift_mem1;

    shift_mem0 = s_max( 0, sub( q_input_mem[0], sts[0]->q_inp ) );
    shift_mem1 = s_max( 0, sub( q_input_mem[1], sts[1]->q_inp ) );
    shift_input0 = s_max( 0, sub( sts[0]->q_inp, q_input_mem[0] ) );
    shift_input1 = s_max( 0, sub( sts[1]->q_inp, q_input_mem[1] ) );

    /*overlapping parts*/
    FOR( i = 0; i < dft_ovl; i++ )
    {
        pDFT_L[( dft_zp + i )] = L_shr( L_mult( mem[0][i], pWin[i] ), shift_mem0 );
        move32();
        pDFT_L[( ( ( dft_zp + N ) + dft_ovl ) - 1 - i )] = L_shr( L_mult( input[0][offset + N + dft_ovl - 1 - i], pWin[i] ), shift_input0 );
        move32();

        pDFT_R[dft_zp + i] = L_shr( L_mult( mem[1][i], pWin[i] ), shift_mem1 );
        move32();
        pDFT_R[( ( dft_zp + N ) + dft_ovl ) - 1 - i] = L_shr( L_mult( input[1][offset + N + dft_ovl - 1 - i], pWin[i] ), shift_input1 );
        move32();
    }

    /*middle part*/
    FOR( i = 0; i < N - dft_ovl; i++ )
    {
        pDFT_L[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[0][offset + dft_ovl + i] ), shift_input0 );
        move32();

        pDFT_R[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[1][offset + dft_ovl + i] ), shift_input1 );
        move32();
    }
    DFT_e[0] = sub( 31 - 16, s_min( q_input_mem[0], sts[0]->q_inp ) );
    move16();
    DFT_e[1] = sub( 31 - 16, s_min( q_input_mem[1], sts[1]->q_inp ) );
    move16();

    Word16 q_shift, guarded_bits;
    guarded_bits = find_guarded_bits_fx( NFFT );

    q_shift = sub( L_norm_arr( pDFT_L, NFFT ), guarded_bits );
    scale_sig32( pDFT_L, NFFT, q_shift );
    DFT_e[0] = sub( DFT_e[0], q_shift );
    move16();

    q_shift = sub( L_norm_arr( pDFT_R, NFFT ), guarded_bits );
    scale_sig32( pDFT_R, NFFT, q_shift );
    DFT_e[1] = sub( DFT_e[1], q_shift );
    move16();

#else
    FOR( n = 0; n < n_channels; n++ )
    {
        Scale_sig( &mem[n][0], dft_ovl, sub( sts[n]->q_inp, q_input_mem[n] ) ); // Q(sts[n]->q_inp)
@@ -1085,10 +1142,34 @@ void stereo_dft_enc_analyze_fx(
    scale_sig32( pDFT_R, NFFT, q_shift );
    DFT_e[1] = sub( DFT_e[1], q_shift );
    move16();
#endif

    rfft_fx( pDFT_L, trigo_enc, NFFT, -1 );
    rfft_fx( pDFT_R, trigo_enc, NFFT, -1 );

#ifdef NONBE_FIX_ISSUE_2206
    test();
    test();
    IF( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] )
    {
        FOR( n = 0; n < n_channels; n++ )
        {
            Copy_Scale_sig_nosat( hStereoDft->input_mem_itd_fx[n], input_mem[n], dft_ovl, sub( sts[n]->q_inp, hStereoDft->q_input_mem_itd[n] ) );
        }
    }
    ELSE
    {
        FOR( n = 0; n < n_channels; n++ )
        {
            Word16 tmp;

            tmp = norm_arr( input[n] + input_frame - dft_ovl, dft_ovl );
            Copy_Scale_sig( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl, tmp );
            q_input_mem[n] = add( sts[n]->q_inp, tmp );
            move16();
        }
    }
#else
    /* update pointers to overlap memory */
    FOR( n = 0; n < n_channels; n++ )
    {
@@ -1113,6 +1194,7 @@ void stereo_dft_enc_analyze_fx(
            Copy( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl );
        }
    }
#endif

    pop_wmops();
    return;