Commit e23393cb authored by multrus's avatar multrus
Browse files

[cleanup] accept FIX_BASOP_2350_HARM_0B_BWE

parent 4f6ad946
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -88,7 +88,6 @@
#define FIX_1904_HARM_GSC_ENC                           /* VA: #1904 Harmonization of EVS and IVAS GSC code */
#define FIX_1478_UNINIT_ON_BFI                          /* VA: Fix issue 1478 where a vector is partly un-initialized during bfi */
#define FIX_BASOP_2358_SCALING_OOB                      /* Eri: Basip issue 2358: Clang-18 reports OOB access where scaling is applied to L_FRAME48k instead of output_frame */
#define FIX_BASOP_2350_HARM_0B_BWE                      /* VA: basop issue 2350: harmonization of the 0b BWE */
#define FIX_BASOP_2350_HARM_0B_BWE_2                    /* VA: basop issue 2350: Simplify calling of hf_synth_fx() */
#define FIX_2349_HARM_FIND_UV                           /* VA: basop issue 2349: harmonization of find_uv() function */
#define FIX_2364_HARM_MULT_HARM                         /* VA: basop issue 2364 : harmonizing multi_harm_fx function */
+0 −27
Original line number Diff line number Diff line
@@ -6339,35 +6339,9 @@ void hf_synth_reset_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero /* o  : zero BWE decoder handle */
);
#ifndef FIX_BASOP_2350_HARM_0B_BWE
void hf_synth_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters      */
    const Word32 core_brate,       /* i  : core bitrate                      Q0*/
    const Word16 output_frame,     /* i  : output frame length               Q0*/
    const Word16 *Aq,              /* i  : quantized Az                     Q12*/
    const Word16 *exc,             /* i  : excitation at 12.8 kHz         Q_exc*/
    Word16 *synth,                 /* i  : 12.8kHz synthesis signal      Q_syn2*/
    Word16 *synth16k,              /* o  : 16kHz synthesis signal        Q_syn2*/
    const Word16 Q_exc,            /* i  : excitation scaling             */
    const Word16 Q_syn2            /* i  : synthesis scaling              */
);
void hf_synth_ivas_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters      */
    const Word32 core_brate,       /* i  : core bitrate                      Q0*/
    const Word16 output_frame,     /* i  : output frame length               Q0*/
    const Word16 *Aq,              /* i  : quantized Az                     Q12*/
    const Word16 *exc,             /* i  : excitation at 12.8 kHz         Q_exc*/
    Word16 *synth,                 /* i  : 12.8kHz synthesis signal      Q_syn2*/
    Word16 *synth16k,              /* o  : 16kHz synthesis signal        Q_syn2*/
    const Word16 Q_exc,            /* i  : excitation scaling             */
    const Word16 Q_syn2            /* i  : synthesis scaling              */
);
#else
void hf_synth_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters      */
#ifdef FIX_BASOP_2350_HARM_0B_BWE
    const Word16 element_mode,     /* i  : element mode                      Q0*/
#endif
    const Word32 core_brate,       /* i  : core bitrate                      Q0*/
    const Word16 output_frame,     /* i  : output frame length               Q0*/
    const Word16 *Aq,              /* i  : quantized Az                     Q12*/
@@ -6378,7 +6352,6 @@ void hf_synth_fx(
    const Word16 Q_syn2            /* i  : synthesis scaling              */
);
#endif
void hf_synth_amr_wb_init_fx(
    AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle   */
);
+0 −8
Original line number Diff line number Diff line
@@ -2234,20 +2234,12 @@ ivas_error acelp_core_dec_fx(
#else
            IF( EQ_16( st->element_mode, EVS_MONO ) )
            {
#ifndef FIX_BASOP_2350_HARM_0B_BWE
                hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 );
#else
                hf_synth_fx( st->hBWE_zero, EVS_MONO, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 );
#endif
            }
            ELSE
            {
                Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0
#ifndef FIX_BASOP_2350_HARM_0B_BWE
                hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 );
#else
                hf_synth_fx( st->hBWE_zero, st->element_mode, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 );
#endif
                Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 );
            }
#endif
+0 −226
Original line number Diff line number Diff line
@@ -20,12 +20,7 @@
 *---------------------------------------------------------------------*/

static void filt_6k_7k_scale_fx( Word16 signal[], Word16 lg, Word16 mem[], Word16 fact, Word16 exp );
#ifdef FIX_BASOP_2350_HARM_0B_BWE
static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word16 element_mode, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn );
#else
static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn );
static void hf_synthesis_ivas_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn );
#endif
static void hf_synthesis_amr_wb_fx( const Word32 core_brate, const Word16 output_subfr, const Word16 Ap[], Word16 exc16k[], Word16 synth_out[], Word16 *mem_syn_hf, Word16 *delay_syn_hf, Word16 *mem_hp_interp, Word16 p_r, Word16 HF_corr_gain, Word16 til, Word16 voice_factors, const Word16 exc[], const Word16 Q_exc, const Word16 Q_out, Word16 qhf );
static void envelope_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const Word32 core_brate, const Word16 Aq[], Word16 Ap[], Word16 *r, Word16 tilt0, Word16 tilt, Word16 voice_factor );
static void AdaptiveStartBand_fx( Word16 *start_band, const Word32 rate, const Word16 *lsf, const Word16 voicing_fac, const Word16 clas, Word16 *voicing_flag, Word16 *start_band_old, Word32 *OptCrit_old );
@@ -84,9 +79,7 @@ void hf_synth_reset_fx(

void hf_synth_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters      */
#ifdef FIX_BASOP_2350_HARM_0B_BWE
    const Word16 element_mode, /* i  : element mode                      Q0*/
#endif
    const Word32 core_brate,   /* i  : core bitrate                      Q0*/
    const Word16 output_frame, /* i  : output frame length               Q0*/
    const Word16 *Aq,          /* i  : quantized Az                     Q12*/
@@ -106,11 +99,7 @@ void hf_synth_fx(
    p_Aq = Aq; /* Q12 */
    FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR )
    {
#ifdef FIX_BASOP_2350_HARM_0B_BWE
        hf_synthesis_fx( hBWE_zero, element_mode, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], Q_syn2 );
#else
        hf_synthesis_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], Q_syn2 );
#endif
        p_Aq += ( M + 1 ); /* Q12 */
    }

@@ -130,9 +119,7 @@ void hf_synth_fx(

static void hf_synthesis_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero,
#ifdef FIX_BASOP_2350_HARM_0B_BWE
    const Word16 element_mode, /* i  : element mode                                Q0*/
#endif
    const Word32 core_brate,   /* i  : core bitrate                                Q0*/
    const Word16 output_subfr, /* i  : output sub-frame length                     Q0*/
    const Word16 Aq[],         /* i  : quantized Az                               Q12*/
@@ -148,11 +135,9 @@ static void hf_synthesis_fx(
    Word16 HF_exc[L_SUBFR16k];
    Word16 tmp, ener, exp1, exp2, scale;
    Word32 L_tmp;
#ifdef FIX_BASOP_2350_HARM_0B_BWE
    Word16 Q_tmp, Q_ener, sft;
    Word32 ONE, P_ONE;
    Word64 prod;
#endif
    Word16 Ap[M16k + 1];

    /*-----------------------------------------------------------------*
@@ -176,10 +161,8 @@ static void hf_synthesis_fx(
    L_tmp = Dot_product12( HF_exc, HF_exc, L_SUBFR16k, &exp1 );
    tmp = round_fx( L_tmp ); /* Q15 */

#ifdef FIX_BASOP_2350_HARM_0B_BWE
    IF( element_mode == EVS_MONO )
    {
#endif
        /* tmp = (float)(sqrt(ener/tmp)) */
        /* scale is -1 if tmp > ener */
        scale = shr( sub( ener, tmp ), 15 ); /* Q0 */
@@ -243,7 +226,6 @@ static void hf_synthesis_fx(

        /*scale *= fac;*/
        tmp = mult_r( scale, tmp );
#ifdef FIX_BASOP_2350_HARM_0B_BWE
    }
    ELSE
    {
@@ -319,7 +301,6 @@ static void hf_synthesis_fx(
        tmp = mult_r( scale, tmp ); /* Q = (15 - exp1) + Q_tmp - 15 */
        Q_tmp = sub( Q_tmp, exp1 );
    }
#endif

    /*-----------------------------------------------------------------*
     * modify HF excitation according to both calculated scaling factors
@@ -386,213 +367,6 @@ static void hf_synthesis_fx(
    return;
}

#ifndef FIX_BASOP_2350_HARM_0B_BWE
void hf_synth_ivas_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters      */
    const Word32 core_brate,       /* i  : core bitrate                      Q0*/
    const Word16 output_frame,     /* i  : output frame length               Q0*/
    const Word16 *Aq,              /* i  : quantized Az                     Q12*/
    const Word16 *exc,             /* i  : excitation at 12.8 kHz         Q_exc*/
    Word16 *synth,                 /* i  : 12.8kHz synthesis signal      Q_syn2*/
    Word16 *synth16k,              /* o  : 16kHz synthesis signal        Q_syn2*/
    const Word16 Q_exc,            /* i  : excitation scaling             */
    const Word16 Q_syn2            /* i  : synthesis scaling              */
)
{
    const Word16 *p_Aq;
    Word16 i_subfr, output_subfr;

    output_subfr = shr( output_frame, 2 );

    p_Aq = Aq; /* Q12 */
    FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR )
    {
        hf_synthesis_ivas_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], Q_syn2 );

        p_Aq += ( M + 1 ); /* Q12 */
    }

    return;
}
static void hf_synthesis_ivas_fx(
    ZERO_BWE_DEC_HANDLE hBWE_zero,
    const Word32 core_brate,   /* i  : core bitrate                                Q0*/
    const Word16 output_subfr, /* i  : output sub-frame length                     Q0*/
    const Word16 Aq[],         /* i  : quantized Az                               Q12*/
    const Word16 exc[],        /* i  : excitation at 12.8 kHz                   Q_exc*/
    const Word16 Q_exc,        /* i  : excitation scaling                            */
    Word16 synth[],            /* i  : 12.8kHz synthesis signal                 Q_syn*/
    Word16 synth16k[],         /* i/o: 16kHz synthesis signal                   Q_syn*/
    const Word16 Q_syn         /* i  : synthesis scaling                             */
)
{
    Word16 i, s;
    Word16 HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR];
    Word16 HF_exc[L_SUBFR16k];
    Word16 exp1, exp2, scale, tmp, ener, Q_tmp, Q_ener, sft;
    Word32 L_tmp, ONE, P_ONE;
    Word16 Ap[M16k + 1];
    Word64 prod;

    /*-----------------------------------------------------------------*
     * generate white noise vector
     *-----------------------------------------------------------------*/

    Random_Fill( &hBWE_zero->seed2, L_SUBFR16k, HF_exc, 3 ); /* 3 = Shift Right by 3 */

    /* o: HF_exc in Q(-3) */

    /*-----------------------------------------------------------------*
     * calculate energy scaling factor so that white noise would have the
     * same energy as exc12k8
     *-----------------------------------------------------------------*/

    /*ener = sum2_f( exc, L_SUBFR ) + 0.01f*/
    ener = extract_h( Dot_product12( exc, exc, L_SUBFR, &exp2 ) );
    exp2 = sub( exp2, add( Q_exc, Q_exc ) ); // ener exponent

    /*tmp = round_fx(Dot_product12(HF_exc, HF_exc, output_subfr, &exp1)); */
    L_tmp = Dot_product12( HF_exc, HF_exc, L_SUBFR16k, &exp1 );
    tmp = round_fx( L_tmp );
    exp1 = add( exp1, 6 ); /* tmp exponent */

    ener = shr( ener, 1 ); /* to avoid the assertion in div_s() further*/
    exp2 = add( exp2, 1 );

    tmp = div_s( ener, tmp );
    exp1 = sub( exp2, exp1 );

    scale = Sqrt16( tmp, &exp1 ); /* scale exponent = exp1 */

    /*-----------------------------------------------------------------*
     * calculate energy scaling factor to respect tilt of synth12k8
     * (tilt: 1=voiced, -1=unvoiced)
     *-----------------------------------------------------------------*/

    hp400_12k8_ivas_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx );

    /* i: mem_hp400 in Q_syn */
    /* i: synth in Q_syn */
    /* o: synth in Q_syn-3 */
    prod = W_mac0_16_16( 1L, synth[0], synth[0] ); /* 2*(Q_syn-3) */
    FOR( i = 1; i < L_SUBFR; i++ )
    {
        prod = W_mac0_16_16( prod, synth[i], synth[i] ); /* 2*(Q_syn-3) */
    }
    sft = W_norm( prod );
    ener = extract_h( W_extract_h( W_shl( prod, sft ) ) );
    Q_ener = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 );

    prod = W_mac0_16_16( 1L, synth[1], synth[0] ); /* 2*(Q_syn-3) */
    FOR( i = 2; i < L_SUBFR; i++ )
    {
        prod = W_mac0_16_16( prod, synth[i], synth[i - 1] ); /* 2*(Q_syn-3) */
    }
    sft = sub( W_norm( prod ), 1 );
    tmp = extract_h( W_extract_h( W_shl( prod, sft ) ) );
    Q_tmp = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 );

    tmp = s_max( 0, tmp );
    IF( tmp > 0 )
    {
        tmp = div_s( tmp, ener );
        Q_tmp = add( 15, sub( Q_tmp, Q_ener ) );
    }

    /*-----------------------------------------------------------------*
     * modify energy of white noise according to synthesis tilt
     *-----------------------------------------------------------------*/
    /* tmp = 1.0 - fac */
    ONE = L_shl( 1, Q_tmp );
    P_ONE = L_shl( 3277 /* 0.1 in Q15 */, sub( Q_tmp, 15 ) );
    L_tmp = L_msu0( ONE, tmp, 1 );
    test();
    if ( core_brate == FRAME_NO_DATA || EQ_32( core_brate, SID_2k40 ) )
    {
        /* emphasize HF noise in CNG */
        /*fac *= 2.0f;*/
        L_tmp = L_add( L_tmp, L_tmp );
    }
    L_tmp = L_max( L_tmp, P_ONE );
    L_tmp = L_min( L_tmp, ONE );

    sft = norm_l( L_tmp );
    L_tmp = L_shl( L_tmp, sft );

    tmp = round_fx( L_tmp );
    Q_tmp = sub( add( Q_tmp, sft ), 16 );

    /*scale *= fac;*/
    tmp = mult_r( scale, tmp ); /* Q = (15 - exp1) + Q_tmp - 15 */
    Q_tmp = sub( Q_tmp, exp1 );
    /*-----------------------------------------------------------------*
     * modify HF excitation according to both calculated scaling factors
     * high pass filtering (0.94ms of delay)
     *-----------------------------------------------------------------*/

    exp2 = sub( hBWE_zero->memExp1, exp1 );
    hBWE_zero->memExp1 = exp1;
    move16();

    filt_6k_7k_scale_fx( HF_exc, L_SUBFR16k, hBWE_zero->mem_hf_fx, tmp, exp2 );
    /* i: HF_exc in Q(-3) */
    /* o: HF_exc in ((-3) + Q_tmp - 17) */
    /* o: hBWE_zero->mem_hf_fx in Q(HF_exc)-2 */

    /*-----------------------------------------------------------------*
     * synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz
     *-----------------------------------------------------------------*/

    /*weight_a( Aq, Ap, 0.6f, M );*/
    weight_a_lc_fx( Aq, Ap, Gamma_19661_Tbl_fx, M );
    /* o: Ap in Q14 */

    Syn_filt_s( 0, Ap, M, HF_exc, HF_syn, L_SUBFR16k, hBWE_zero->mem_syn_hf_fx, 1 );
    /* o: HF_syn in same Q as HF_exc */
    /* o: mem_syn_hf_fx same Q as HF_syn */

    Scale_sig( HF_syn, L_SUBFR16k, ( add( Q_syn, exp1 ) ) ); /* bring HF_syn to (Q_syn+exp1) */

    /*-----------------------------------------------------------------*
     * add filtered HF noise to speech synthesis
     *-----------------------------------------------------------------*/

    /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */
    delay_signal_fx( HF_syn, L_SUBFR16k, hBWE_zero->delay_syn_hf_fx, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) - 15 );

    /* interpolate the HF synthesis */
    IF( EQ_16( output_subfr, L_SUBFR48k ) ) /* 48kHz sampled output */
    {
        s = s_max( s_min( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN - 3 ) ), 3 ),
                          sub( Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx + INTERP_3_1_MEM_LEN - 3, 3 ), 1 ) ),
                   0 );
        Scale_sig( HF_syn, L_SUBFR16k, s );                              /* Q_syn+exp1+s */
        Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, s ); /* Qx + s */
        interpolate_3_over_1_allpass_fx( HF_syn, L_SUBFR16k, upsampled_HF_syn, hBWE_zero->mem_hp_interp_fx );
        Scale_sig( upsampled_HF_syn, 3 * L_SUBFR16k, -s );                /* Q_syn + exp1 + s */
        Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, -s ); /* Qx */
        Scale_sig( HF_syn, L_SUBFR16k, -s );                              /* Q_syn+exp1 */
        Scale_sig( upsampled_HF_syn, L_SUBFR48k, -1 );
    }
    ELSE IF( EQ_16( output_subfr, L_SUBFR32k ) ) /* 32kHz sampled output */
    {
        s = s_max( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP ) ), 2 ), 0 );
        Scale_sig( HF_syn, L_SUBFR16k, s );                                     /* Q_syn+exp1+s */
        Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, s ); /* Qx + s */
        Interpolate_allpass_steep_fx( HF_syn, hBWE_zero->mem_hp_interp_fx, L_SUBFR16k, upsampled_HF_syn );
        Scale_sig( upsampled_HF_syn, 2 * L_SUBFR16k, -s );                       /* Q_syn + exp1 */
        Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, -s ); /* Qx */
        Scale_sig( HF_syn, L_SUBFR16k, -s );                                     /* Q_syn+exp1 */
    }
    ELSE /* 16kHz sampled output */
    {
        Copy( HF_syn, upsampled_HF_syn, L_SUBFR16k ); /* Q_syn */
    }
    Vr_add( synth16k, upsampled_HF_syn, synth16k, output_subfr );

    return;
}
#endif

/*-------------------------------------------------------------------*
 * filt_6k_7k: