Commit 9808fde9 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

SBA dirac fixed point changes, stereo_mdct_core_dec updates

[x] Add converions for TonalMDCTConceal_UpdateState,v_multc_fixed
[x] Sync all the intermediate converions for subfunctions present in
ivas_mdct_core_tns_ns_fx
[x] Added fixed function call in stereo_mdct_core_dec_fx
[x] Integrated fixed point implementation of ivas_sba_dirac_stereo_dec
parent 66189989
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -636,8 +636,8 @@ typedef enum
#define SBA_DIRAC_NRG_SMOOTH_LONG               10
#define SBA_DIRAC_NRG_SMOOTH_SHORT              3

#define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX  ((Word16)0x2666)
#define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX  ((Word32)0x0000B6D8)
#define SBA_DIRAC_NRG_SMOOTH_SHORT_BY_LONG_FX  ((Word16)0x2667)
#define SBA_DIRAC_NRG_SMOOTH_LONG_BY_LONG_SHORT_FX  ((Word32)0x5B6DB6DB)

/* PLC for DFT Stereo residual */
#define STEREO_DFT_RES_N_PEAKS_MAX              15                          /*Maximum number of peaks within residual signal in each frame (res_cod_band_max == 6 in 48kHz)*/
+3 −2
Original line number Diff line number Diff line
@@ -475,7 +475,8 @@ void filter_with_allpass_fx(
    const Word32 *sig,  /* i  : allpass input signal                */
    Word32 *out,        /* o  : filtered output                     */
    const int16_t len,  /* i  : length of input                     */
    basic_allpass_t *ap /* i/o: basic allpass structure             */
    basic_allpass_t *ap, /* i/o: basic allpass structure             */
    Word16 q_shift
);

Word32 stereo_dft_dmx_swb_nrg_fx(
@@ -1524,7 +1525,7 @@ void ivas_hq_pred_hb_bws_fx(
);

void synchro_synthesis_fixed_clean(
  const Word16 ivas_total_brate,     /* i  : IVAS total bitrate                  */
  const Word32 ivas_total_brate,     /* i  : IVAS total bitrate                  */
  CPE_DEC_HANDLE hCPE,                /* i/o: CPE decoder structure               */
  Word32 *output_fx[CPE_CHANNELS],        /* i/o: output synthesis signal             */
  const Word16 output_frame,         /* i  : Number of samples                   */
+105 −7
Original line number Diff line number Diff line
@@ -383,6 +383,102 @@ static void lerp_proc(Word16 *f, Word16 *f_out, Word16 bufferNewSize, Word16 buf

}


static void lerp_proc32(Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOldSize)
{

  Word16 i, idx, n;
  Word16 diff;
  Word32 pos, shift;
  Word32 buf[2 * L_FRAME_MAX];
  Word32 *ptr;

  ptr = f_out;
  test();
  test();
  test();
  IF (((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f)))
  {
    ptr = buf;
    move16();
  }

  IF(EQ_16(bufferNewSize, bufferOldSize))
  {
    Copy32(f, f_out, bufferNewSize);
    return;
  }

  shift = L_shl(L_deposit_l(div_s(bufferOldSize, shl(bufferNewSize, 4))), 4 - shift_e + 16);

  pos = L_sub(L_shr(shift, 1), 32768l/*1.0f Q15*/);

  /* Adjust interpolation shift to avoid accessing beyond end of input buffer. */
  if (LT_32(shift, 19661l/*0.3f Q16*/))
  {
    pos = L_sub(pos, 8520l/*0.13f Q16*/);
  }

  assert(pos_e == shift_e);

  /* first point of interpolation */
  IF(pos < 0)
  {

    diff = shr(extract_l(pos), 1);
    /*buf[0]=f[0]+pos*(f[1]-f[0]);*/
    move16();
    *ptr++ = L_add_sat(f[0], Mpy_32_16_1(L_sub(f[1], f[0]), diff));
  }
  ELSE
  {

      idx = extract_h(pos);
      diff = lshr(extract_l(pos), 1);
      move16();
      *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff));
  }

  pos = L_add(pos, shift);
  idx = s_max(0, extract_h(pos));

  n = sub(bufferNewSize, 1);
  FOR(i = 1; i < n; i++)
  {
    diff = lshr(extract_l(pos), 1);
    IF (LT_32(pos , 0))
    {
      diff = sub(16384/*0.5f Q15*/, diff);
    }
    move16();
    *ptr++ = L_add_sat(f[idx], Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff));
    pos = L_add(pos, shift);
    idx = extract_h(pos);
  }

  /* last point */

  IF (GT_32(pos, L_deposit_h(sub(bufferOldSize, 1))))
  {
    idx = sub(bufferOldSize, 2);
  }
  assert(idx <= 2 * L_FRAME_MAX);

  /* diff = t - point;*/
  diff = lshr(extract_l(L_shr(L_sub(pos, L_deposit_h(idx)), 1)), 1);

  move16();
  *ptr++ = L_add_sat(f[idx], L_shl_sat(Mpy_32_16_1(L_sub(f[idx + 1], f[idx]), diff), 1));
  test();
  test();
  test();
  IF(((f <= f_out) && (f + bufferOldSize >= f_out)) || ((f_out <= f) && (f_out + bufferNewSize >= f)))
  {
    Copy32(buf, f_out, bufferNewSize);
  }

}

#ifdef IVAS_FLOAT_FIXED

static void L_lerp_proc_fx( const Word32 *f_fx, Word32 *f_out_fx, const Word16 bufferNewSize, const Word16 bufferOldSize );
@@ -397,10 +493,12 @@ void L_lerp_fx( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 bufferOld
{
    Word16 tmpNewSize;
    Word16 guard_bits = s_max(find_guarded_bits_fx(bufferNewSize / bufferOldSize), find_guarded_bits_fx(bufferOldSize / bufferNewSize)) + 1;
    q -= guard_bits;

    IF (getScaleFactor32(f, bufferOldSize) < guard_bits)
    {
        *q -= guard_bits;
        FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f[ind] = L_shr(f[ind], guard_bits);
        FOR(Word16 ind = 0; ind < bufferNewSize; ind++) f_out[ind] = L_shr(f_out[ind], guard_bits);
    }

    IF ( 128 * bufferNewSize > bufferOldSize * 507 )
    {
@@ -457,7 +555,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe
                tmpNewSize = bufferNewSize;
            }

            L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize );
            lerp_proc32( f, f_out, tmpNewSize, bufferOldSize );

            f = f_out;
            bufferOldSize = tmpNewSize;
@@ -474,7 +572,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe
                tmpNewSize = bufferNewSize;
            }

            L_lerp_proc_fx( f, f_out, tmpNewSize, bufferOldSize );
            lerp_proc32( f, f_out, tmpNewSize, bufferOldSize );

            f = f_out;
            bufferOldSize = tmpNewSize;
@@ -483,7 +581,7 @@ void L_lerp_fx_q11( Word32 *f, Word32 *f_out, Word16 bufferNewSize, Word16 buffe
    }
    ELSE
    {
        L_lerp_proc_fx( f, f_out, bufferNewSize, bufferOldSize );
        lerp_proc32(f, f_out, bufferNewSize, bufferOldSize);
    }

    return;
+8 −0
Original line number Diff line number Diff line
@@ -500,6 +500,14 @@ void delay_signal_fx(
    Word32 mem[],        /* i/o: synchronization memory                  */
    const int16_t delay /* i  : delay in samples                        */
);
void delay_signal_q_adj_fx(
    Word32 x[],          /* i/o: signal to be delayed                    */
    const int16_t len,  /* i  : length of the input signal              */
    Word32 mem[],        /* i/o: synchronization memory                  */
    const int16_t delay, /* i  : delay in samples                        */
    const Word16 q_x,
    const Word16 q_mem
);
#endif
ivas_error push_indice(
+1 −1
Original line number Diff line number Diff line
@@ -2400,7 +2400,7 @@ void calc_normal_length_fx(
  Word16 Q_syn
);

Word32 ivas_calc_tilt_bwe_fx(            /* o  : Tilt in Q24       */
Word16 ivas_calc_tilt_bwe_fx(            /* o  : Tilt in Q24       */
  const Word32 *sp,        /* i  : i   signal      */
  const Word16 exp_sp,         /* i  : Exp of inp signal */
  const Word16 N            /* i  : signal length     */
Loading