Commit 7f9b1236 authored by Manuel Jander's avatar Manuel Jander
Browse files

Improve proto power accuracy also for stereo_type_detect not NULL case.

parent caaeda51
Loading
Loading
Loading
Loading
+29 −13
Original line number Diff line number Diff line
@@ -2071,14 +2071,15 @@ void protoSignalComputation2_fx(
        }

#ifdef FIX_867_CLDFB_NRG_SCALE
        /* Make both shift the same because of total_bb_power_fx */
        min_q_shift[0] = s_min( min_q_shift[0], min_q_shift[1] );
        min_q_shift[1] = min_q_shift[0];
        move16();
        Word16 total_shift[2], q_temp_total;
        /* total_shift shift required to get common Q */
        total_shift[0] = s_max( 0, sub( min_q_shift[0], min_q_shift[1] ) );
        total_shift[1] = s_max( 0, sub( min_q_shift[1], min_q_shift[0] ) );
        min_q_shift[0] = sub( min_q_shift[0], idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) );
        min_q_shift[1] = sub( min_q_shift[1], idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) );
        q_temp[0] = sub( add( add( q_cldfb, min_q_shift[0] ), add( q_cldfb, min_q_shift[0] ) ), 31 );
        q_temp[1] = sub( add( add( q_cldfb, min_q_shift[1] ), add( q_cldfb, min_q_shift[1] ) ), 31 );
        q_temp_total = s_min( q_temp[0], q_temp[1] );
#else
        min_q_shift = sub( min_q_shift, idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) );

@@ -2151,17 +2152,30 @@ void protoSignalComputation2_fx(
            reference_power_64fx[l] = W_add( W_tmp1, W_tmp2 ); // 2*(q_cldfb+min_q_shift)
            move64();

#ifdef FIX_867_CLDFB_NRG_SCALE
            Left_power_fx = L_shr( Left_power_fx, total_shift[qidx] );
            Right_power_fx = L_shr( Right_power_fx, total_shift[qidx] );
            left_bb_power_fx = L_add( left_bb_power_fx, Left_power_fx );    // q_Left_Right_power
            right_bb_power_fx = L_add( right_bb_power_fx, Right_power_fx ); // q_Left_Right_power
            // total_bb_power_fx = L_add( total_bb_power_fx, reference_power_fx[l] );
            total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], sub( head_room, total_shift[qidx] ) ) ) ); // q_Left_Right_power
#else
            left_bb_power_fx = L_add( left_bb_power_fx, Left_power_fx );    // q_Left_Right_power
            right_bb_power_fx = L_add( right_bb_power_fx, Right_power_fx ); // q_Left_Right_power
            // total_bb_power_fx = L_add( total_bb_power_fx, reference_power_fx[l] );
            total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power
#endif

            IF( GT_16( l, MASA_HI_FREQ_START_BIN ) )
            {
                left_hi_power_fx = L_add( left_hi_power_fx, Left_power_fx );    // q_Left_Right_power
                right_hi_power_fx = L_add( right_hi_power_fx, Right_power_fx ); // q_Left_Right_power
                // total_hi_power_fx = L_add( total_hi_power_fx, reference_power_fx[l] );
#ifdef FIX_867_CLDFB_NRG_SCALE
                total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], sub( head_room, total_shift[qidx] ) ) ) ); // q_Left_Right_power
#else
                total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power
#endif
            }

            IF( LT_16( l, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) )
@@ -2188,19 +2202,20 @@ void protoSignalComputation2_fx(
                    move32();
                }

                temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31
#ifdef FIX_867_CLDFB_NRG_SCALE
                IF( LT_16( q_temp[qidx], stereo_type_detect->q_total_power ) )
                temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], add( 31, total_shift[qidx] ) ) ) ); // 2*(q_cldfb+min_q_shift) -31
                IF( LT_16( q_temp_total, stereo_type_detect->q_total_power ) )
                {
                    stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp[qidx] ) ) ); // q_temp
                    stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp_total ) ) ); // q_temp
                    move32();
                }
                ELSE
                {
                    stereo_type_detect->total_power_fx[l] = L_add( L_shr( temp, sub( q_temp[qidx], stereo_type_detect->q_total_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ) ); // stereo_type_detect->q_total_power
                    stereo_type_detect->total_power_fx[l] = L_add( L_shr( temp, sub( q_temp_total, stereo_type_detect->q_total_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ) ); // stereo_type_detect->q_total_power
                    move32();
                }
#else
                temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31
                IF( LT_16( q_temp, stereo_type_detect->q_total_power ) )
                {
                    stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp ) ) ); // q_temp
@@ -2229,7 +2244,7 @@ void protoSignalComputation2_fx(
                    sum_total_ratio_fx[l] = BASOP_Util_Divide3232_Scale( stereo_type_detect->sum_power_fx[l], stereo_type_detect->total_power_fx[l], &exp ); // 15-(exp+s_min( stereo_type_detect->q_total_power, q_temp )-s_min( stereo_type_detect->q_sum_power, q_temp2 ))
                    move32();
#ifdef FIX_867_CLDFB_NRG_SCALE
                    q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp[qidx] ) ) );
                    q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp_total ) ) );
#else
                    q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp ) ) );
#endif
@@ -2245,6 +2260,7 @@ void protoSignalComputation2_fx(

                temp = Madd_32_32( Mpy_32_32( RealSubtract_fx, RealSubtract_fx ), ImagSubtract_fx, ImagSubtract_fx ); // 2*(q_cldfb+min_q_shift)-31
#ifdef FIX_867_CLDFB_NRG_SCALE
                assert( qidx == 0 );
                IF( LT_16( q_temp[qidx], stereo_type_detect->q_subtract_power_y ) )
                {
                    stereo_type_detect->subtract_power_y_fx = L_add( L_shr( stereo_type_detect->subtract_power_y_fx, sub( stereo_type_detect->q_subtract_power_y, q_temp[qidx] ) ), temp ); // q_temp
@@ -2598,7 +2614,7 @@ void protoSignalComputation2_fx(
        stereo_type_detect->q_sum_power = s_min( stereo_type_detect->q_sum_power, q_temp2 );
        move16();
#ifdef FIX_867_CLDFB_NRG_SCALE
        stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp[0] );
        stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp_total );
        move16();
#else
        stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp );
@@ -2687,15 +2703,15 @@ void protoSignalComputation2_fx(
        lr_total_bb_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21

#ifdef FIX_867_CLDFB_NRG_SCALE
        stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp[0] ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power );
        stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power );
        move32();
        stereo_type_detect->q_left_hi_power = sub( 31, stereo_type_detect->q_left_hi_power );
        move16();
        stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp[0] ), Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power );
        stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power );
        move32();
        stereo_type_detect->q_right_hi_power = sub( 31, stereo_type_detect->q_right_hi_power );
        move16();
        stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp[0] ), Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power );
        stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power );
        move32();
#else
        stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power );