Commit ddc14384 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Manuel Jander
Browse files

Fix for 3GPP issue 1004: Modulation artifact in OMASA at 24 kbps using LTV...

Fix for 3GPP issue 1004: Modulation artifact in OMASA at 24 kbps using LTV 3ISM 2TC input and output to MONO

Link #1004, #1363
Fixes 3GPP issue #1363: Assert in BASOP decoder function protoSignalComputation2_fx when fed with BASOP encoder MASA bitstream
parent 19e7b7d2
Loading
Loading
Loading
Loading
+21 −21
Original line number Diff line number Diff line
@@ -1772,7 +1772,7 @@ void protoSignalComputation2_fx(
    Word64 W_tmp1, W_tmp2;
    Word64 reference_power_64fx[CLDFB_NO_CHANNELS_MAX];
    Word16 q_reference_power_64fx;

    Word16 head_room, q_Left_Right_power;
    /* Calculate maximum possible shift for the buffers RealBuffer_fx and ImagBuffer_fx */
#ifdef FIX_867_CLDFB_NRG_SCALE
    min_q_shift[0] = Q31;
@@ -2087,6 +2087,21 @@ void protoSignalComputation2_fx(
        move16();
        FOR( l = 0; l < num_freq_bands; l++ )
        {
            re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift
            im1 = L_shl( ImagBuffer_fx[0][0][l], min_q_shift ); // q_cldfb+min_q_shift
            re2 = L_shl( RealBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift
            im2 = L_shl( ImagBuffer_fx[1][0][l], min_q_shift ); // q_cldfb+min_q_shift

            W_tmp1 = W_add( W_mult0_32_32( re1, re1 ), W_mult0_32_32( im1, im1 ) );
            W_tmp2 = W_add( W_mult0_32_32( re2, re2 ), W_mult0_32_32( im2, im2 ) );

            head_room = s_min( head_room, W_norm( W_add( W_tmp1, W_tmp2 ) ) );
        }
        head_room = sub( head_room, find_guarded_bits_fx( num_freq_bands ) );
        q_Left_Right_power = add( shl( add( q_cldfb, min_q_shift ), 1 ), sub( head_room, 32 ) );

        FOR( l = 0; l < num_freq_bands; l++ )
        {
#ifdef FIX_867_CLDFB_NRG_SCALE
            Word16 qidx = s_min( 1, s_max( 0, sub( l, CLDFB_NO_CHANNELS_HALF - 1 ) ) );
            re1 = L_shl( RealBuffer_fx[0][0][l], min_q_shift[qidx] ); // q_cldfb+min_q_shift
@@ -2139,7 +2154,6 @@ void protoSignalComputation2_fx(
            // Left_power_fx = Madd_32_32( Mpy_32_32( re1, re1 ), im1, im1 );
            W_tmp1 = W_add( W_mult0_32_32( re1, re1 ), W_mult0_32_32( im1, im1 ) ); // 2*(q_cldfb+min_q_shift)
            Left_power_fx = W_extract_h( W_shl( W_tmp1, head_room ) );              // q_Left_Right_power

            // Right_power_fx = Madd_32_32( Mpy_32_32( re2, re2 ), im2, im2 );
            W_tmp2 = W_add( W_mult0_32_32( re2, re2 ), W_mult0_32_32( im2, im2 ) ); // 2*(q_cldfb+min_q_shift)
            Right_power_fx = W_extract_h( W_shl( W_tmp2, head_room ) );             // q_Left_Right_power
@@ -2148,30 +2162,17 @@ 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 ) ) )
@@ -2701,16 +2702,15 @@ void protoSignalComputation2_fx(
        // 20480 = 10 in Q11
        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_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 );
        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 );
        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_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 );
        stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp ), 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_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 );
        stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp ), 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 );