Commit 6048e490 authored by multrus's avatar multrus
Browse files

separate changes to ivas_dirac_dec_output_synthesis_process_slot_fx() from cldfb_opt

parent f7a4b6f7
Loading
Loading
Loading
Loading
Loading
+341 −0
Original line number Diff line number Diff line
@@ -817,6 +817,336 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx(
                           h_dirac_output_synthesis_state->diffuse_power_factor_fx,
                           num_freq_bands ); /*h_dirac_output_synthesis_state->diffuse_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->diffuse_power_factor_q*/

	    #ifdef OPT_SBA_DEC_PATH
            /*Direct gain*/

            Word16 *exp_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) );
            Word16 cy_cross_dir_smooth_e = sub( 31, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth );

            FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ )
            {
                exp_temp_cy_cross_dir_smooth_fx[kk] = cy_cross_dir_smooth_e; // h_dirac_output_synthesis_state->q_cy_cross_dir_smooth;
                move16();
            }

            Word16 q_temp = sub( add( shl( h_dirac_output_synthesis_state->direct_responses_q, 1 ), q_diffuseness ), 62 );
            Word32 one_in_qdiff = L_shl( 1, q_diffuseness );
            Word32 c1 = Madd_32_16( ONE_IN_Q29 /*1 Q29*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ), 5461 /*1.0 / 6.0 Q15*/ ); /*Diffuseness modellling nrg compensation*/ /*Q29*/
            Word16 q_diff_c = sub( q_diffuseness, 2 );

            FOR( ch_idx = 0; ch_idx < s_min( 4, nchan_transport ); ch_idx++ )
            {
                Word16 k;
                IF( ch_idx != 0 )
                {
                    Word32 a, c;
                    Word16 b, b_exp, sqr_exp, q_diff_aab; // , q_diff_c;
                    Word32 mpy_a_a_b, mpy_diff_c, mpy_diff_aab;
                    Word32 sqr_inp, sqr;

                    /*Directonal sound gain nrg compensation*/
                    FOR( k = 0; k < num_freq_bands_diff; k++ )
                    {
                        a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses
                        move32();


                        b_exp = 0;
                        move16();

                        b = 0;
                        move16();

                        if ( 0 == reference_power[k + ( ch_idx + 1 ) * num_freq_bands] )
                        {
                            b = MAX_16;
                            move16();
                        }

                        test();
                        IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] && reference_power[k + num_freq_bands] )
                        {
                            b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*Q(15-b_exp)*/
                        }


                        mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) );                              // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31
                        mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q(q_diff_aab) = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31
                        mpy_diff_c = Mpy_32_32( diffuseness[k], c1 );                                 // Q(q_diff_c) = q_diffuseness - 2

                        q_diff_aab = sub( q_temp, b_exp ); // add( sub( add( h_dirac_output_synthesis_state->direct_responses_q, sub( 15, b_exp ) ), 15 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) );

                        Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 );
                        Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) );
                        Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) );
                        sqr_inp = L_add( op1, op2 );
                        sqr_exp = sub( 31, minq );
                        sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/
                        sqr = L_shr( sqr, 2 );             /*Q(31-sqr_exp)*/
                        IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 )
                        {
                            IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) )
                            {
                                h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth-> (31-sqr_exp) */
                                move32();
                                exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                                move16();
                            }
                            ELSE
                            {
                                sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*( 31- sqr_exp )-> h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/
                            }
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx*/
                            move32();
                        }
                        ELSE
                        {
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; // L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*31-sqr_exp*/
                            move32();
                            exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                            move16();
                        }
                    }
                    c = Madd_32_16( ONE_IN_Q27 /*1 Q27*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ), 5461 ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0  = 5461 in Q15*/ /*Q27*/
                    Word16 diff_c_exp = sub( q_diffuseness, 4 );
#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot
                    FOR( ; k < num_freq_bands; k++ )
                    {
                        a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses
                        move32();
                        IF( reference_power[k + num_freq_bands] == 0 )
                        {
                            sqr_inp = Mpy_32_32( diffuseness[k], c );
                            sqr_exp = sub( 31 + 4, q_diffuseness );
                        }
                        ELSE
                        {
                            Word16 diff_aab_exp;
                            IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 )
                            {
                                mpy_a_a_b = Mpy_32_32( a, a );                                                // Q = (h_dirac_output_synthesis_state->q_direct_responses + (h_dirac_output_synthesis_state->q_direct_responses) - 31
                                mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - 31 + q_diffuseness -31
                                mpy_diff_c = Mpy_32_32( diffuseness[k], c );                                  // Q = q_diffuseness - 4
                                diff_aab_exp = q_temp;
                                move16();
                            }
                            ELSE
                            {
                                b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/

                                mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) );                              // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31
                                mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31
                                mpy_diff_c = Mpy_32_32( diffuseness[k], c );                                  // Q = q_diffuseness - 4
                                diff_aab_exp = sub( q_temp, b_exp );                                          // sub(sub(add(sub(31 + 62, h_dirac_output_synthesis_state->direct_responses_q), b_exp), h_dirac_output_synthesis_state->direct_responses_q), q_diffuseness);
                            }
                            Word16 minq = sub( s_min( diff_aab_exp, diff_c_exp ), 1 );
                            Word32 op1 = L_shr( mpy_diff_aab, sub( diff_aab_exp, minq ) );
                            Word32 op2 = L_shr( mpy_diff_c, sub( diff_c_exp, minq ) );
                            sqr_inp = L_add( op1, op2 );
                            sqr_exp = sub( 31, minq );
                        }
                        sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/
                        sqr = L_shr( sqr, 2 );             /*Q(31-sqr_exp)*/


                        IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 )
                        {
                            IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) )
                            {
                                h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/
                                move32();
                                exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                                move16();
                            }
                            ELSE
                            {
                                sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/
                            }
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/
                            move32();
                        }
                        ELSE
                        {
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/
                            move32();
                            exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp;
                            move16();
                        }
                    }

#else
                    FOR( ; k < num_freq_bands; k++ )
                    {
                        a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses
                        move32();
                        IF( reference_power[k + num_freq_bands] == 0 )
                        {
                            b = 0;
                            move16();
                            b_exp = 0;
                            move16();
                        }
                        ELSE
                        {
                            IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 )
                            {
                                b = MAX_16;
                                move16();
                                b_exp = 0;
                                move16();
                            }
                            ELSE
                            {
                                b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/
                            }
                        }

                        mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) );                                           // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31
                        mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31
                        mpy_diff_c = Mpy_32_32( diffuseness[k], c2 );                                              // Q = q_diffuseness - 4

                        q_diff_aab = add( add( h_dirac_output_synthesis_state->direct_responses_q, sub( sub( 15, b_exp ), 15 ) ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) );
                        q_diff_c = sub( q_diffuseness, 4 );
                        Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 );
                        Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) );
                        Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) );
                        sqr_inp = L_add( op1, op2 );
                        sqr_exp = sub( 31, minq );
                        sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/
                        sqr = L_shr( sqr, 2 );             /*Q(31-sqr_exp)*/
                        IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 )
                        {
                            IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) )
                            {
                                h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/
                                move32();
                                Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                                move16();
                            }
                            ELSE
                            {
                                sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/
                            }
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/
                            move32();
                        }
                        ELSE
                        {
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/
                            move32();
                            Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                            move16();
                        }
                    }
#endif
                }
                ELSE
                {
                    Word32 sqr_inp, sqr;
                    Word16 sqr_exp;
                    Word32 One_in_qdiff = L_shl( 1, sub( q_diffuseness, 1 ) );
                    Word32 diff = L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx /*q29=0.5 * q30*/, ONE_IN_Q29 /*0.5 Q30*/ ); // Q30
                    Word16 sq_e = sub( 32, q_diffuseness );                                                                                                  // 31-(q_diffuseness-1)
                    /*Diffuseness modellling nrg compensation*/
                    FOR( k = 0; k < num_freq_bands_diff; k++ )
                    {
                        /*diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) )*/
                        sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], diff ); // Q = q_diffuseness - 1
                        sqr_exp = sq_e;
                        move16();
                        sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/
                        sqr = L_shr( sqr, 2 );             /*Q(31-sqr_exp)*/
                        IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 )
                        {
                            IF( LT_16( cy_cross_dir_smooth_e, sqr_exp ) )
                            {
                                h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q(31- sqr_exp)*/
                                move32();
                                exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                                move16();
                            }
                            ELSE
                            {
                                sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31-sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/
                            }
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/
                            move32();
                        }
                        ELSE
                        {
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; /*Q(31-sqr_exp)*/
                            move32();
                            exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                            move16();
                        }
                    }
                    FOR( ; k < num_freq_bands; k++ )
                    {
                        sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ) ); // Q = q_diffuseness - 1
                        sqr_exp = sq_e;
                        move16();
                        sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/
                        sqr = L_shr( sqr, 2 );             /*Q(31-sqr_exp)*/
                        IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 )
                        {
                            IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) )
                            {
                                h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, Q( 31- sqr_exp )*/
                                move32();
                                exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp );
                                move16();
                            }
                            ELSE
                            {
                                sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q( 31- sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/
                            }
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/
                            move32();
                        }
                        ELSE
                        {
                            h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/
                            move32();
                            exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp;
                            move16();
                        }
                    }
                }
            }
            Word16 temp = exp_temp_cy_cross_dir_smooth_fx[0]; /*q0*/
            move16();
            FOR( Word16 kk = 1; kk < ( num_freq_bands * num_channels_dir ); kk++ )
            {
                temp = s_max( exp_temp_cy_cross_dir_smooth_fx[kk], temp );
            }


            /*Directional gain (panning)*/
            Word16 temp_q = sub( add( h_dirac_output_synthesis_state->direct_power_factor_q, h_dirac_output_synthesis_state->direct_responses_q ), 31 );
            Word16 temp_exp = sub( 31, temp_q );

            IF( LT_16( temp, temp_exp ) )
            {
                FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ )
                {
                    h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp_exp ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ->temp_q*/
                    move32();
                }
                h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q;
                move16();
            }
            ELSE
            {
                FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ )
                {
                    h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp ) ); /*exp_temp_cy_cross_dir_smooth_fx[kk]->temp*/
                    move32();
                }
                h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = sub( 31, temp );
                move16();
            }
            free( exp_temp_cy_cross_dir_smooth_fx );
#else /* OPT_SBA_DEC_PATH */
            /*Direct gain*/

            Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) );
@@ -1175,6 +1505,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx(
                h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q;
                move16();
            }
#endif /* OPT_SBA_DEC_PATH */
	    
            Word16 temp_q1 = sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, temp_q );
            FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ )
            {
@@ -1686,11 +2018,20 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx(
        /*Direct input->output*/
        p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx; // (p_gains_dir_q)
        p_gains_dir_prev = h_dirac_output_synthesis_state.gains_dir_prev_fx;
#ifdef OPT_SBA_DEC_PATH
        q_shift = sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q );
#endif /* OPT_SBA_DEC_PATH */
        FOR( ch_idx = 0; ch_idx < num_channels_dir; ch_idx++ )
        {
#ifdef OPT_SBA_DEC_PATH
            Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands],
                         num_freq_bands,
                         q_shift ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/
#else
            Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands],
                         num_freq_bands,
                         sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ) ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/
#endif
        }
        h_dirac_output_synthesis_state.gains_dir_prev_q = h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev;
        move16();