LCOV - code coverage report
Current view: top level - lib_com - modif_fs_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 735 866 84.9 %
Date: 2025-05-03 01:55:50 Functions: 11 11 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h" /* Compilation switches                   */
       7             : #include "cnst.h"    /* Common constants                       */
       8             : #include "prot_fx.h"
       9             : #include "rom_com.h" /* Static table prototypes                */
      10             : #include <assert.h>
      11             : #include "rom_enc.h" /*  prototypes                       */
      12             : #include "basop_util.h"
      13             : #include "ivas_prot_fx.h"
      14             : 
      15             : /*-----------------------------------------------------------------*
      16             :  * Local functions
      17             :  *-----------------------------------------------------------------*/
      18             : 
      19             : 
      20             : /*==============================================================================*/
      21             : /* FUNCTION      :  modify_Fs_fx ( )                        */
      22             : /*------------------------------------------------------------------------------*/
      23             : /* PURPOSE       :  Modify sampling freq by interpolation                 */
      24             : /*------------------------------------------------------------------------------*/
      25             : /* INPUT ARGUMENTS  :                              */
      26             : /*  const Word16 sigIn_fx[]     signal to decimate  Q_syn2-1          */
      27             : /*      const Word16 lg       length of input                     */
      28             : /*      const Word16 fin     frequency of input  Q0                          */
      29             : /*    const Word16 fout     frequency of output Q0              */
      30             : /*------------------------------------------------------------------------------*/
      31             : /* OUTPUT ARGUMENTS :                              */
      32             : /* Word16 sigOut_fx[]       decimated signal    Q_syn2-1          */
      33             : /*------------------------------------------------------------------------------*/
      34             : /* INPUT/OUTPUT ARGUMENTS :                            */
      35             : /*    Word16 mem_fx[]       filter memory     Q_syn2-1                   */
      36             : /*------------------------------------------------------------------------------*/
      37             : /* RETURN ARGUMENTS :                               */
      38             : /*           _ None.                            */
      39             : /*------------------------------------------------------------------------------*/
      40             : /* CALLED FROM : TX/RX                              */
      41             : /*==============================================================================*/
      42     3586244 : Word16 modify_Fs_ivas_fx(                          /* o  : length of output    Q0  */
      43             :                           const Word16 sigIn_fx[], /* i  : signal to decimate  Q0  */
      44             :                           Word16 lg,               /* i  : length of input     Q0  */
      45             :                           const Word32 fin,        /* i  : frequency of input  Q0  */
      46             :                           Word16 sigOut_fx[],      /* o  : decimated signal    Q0  */
      47             :                           const Word32 fout,       /* i  : frequency of output Q0  */
      48             :                           Word16 mem_fx[],         /* i/o: filter memory       Q0  */
      49             :                           const Word16 nblp,       /* i  : flag indicating if NB low-pass is applied */
      50             :                           Word16 *Q_new_inp,       /*scaling added on sigOut_fx */
      51             :                           Word16 *mem_decim_size   /*i: size modified for mem_fx*/
      52             : )
      53             : {
      54             :     Word16 i;
      55             : 
      56             :     Word16 lg_out, fac_num, fac_den, filt_len, frac, temp_n, mem_len;
      57             :     Word16 num_den;
      58             :     Word16 datastep, fracstep;
      59             :     Word16 *sigIn_ptr, *sigPtr;
      60             :     Word16 signal_tab_fx[3 * L_FILT_MAX + L_FRAME48k], *signal_fx, *signal_ana_fx; /* 3* as 2* for memory and 1* for future prediction */
      61             :     Word16 A_fx[M + 1], r_fx_h[M + 1], r_fx_l[M + 1];
      62             :     Word16 mem_len_ana;
      63             :     Word16 plus_sample_in;
      64             :     Word16 j;
      65             :     Word16 mu_preemph_fx;
      66             :     Word16 mem_preemph_fx;
      67             :     Word16 Q_r;
      68             :     Word16 mem_lev_fx[18];
      69             :     Word32 t0, t1, t2, L_tmp; /* temporary variables                         */
      70             :     Word32 LepsP[M + 1];
      71     3586244 :     Word16 flag_low_order = 0;
      72     3586244 :     move16();
      73             :     Word16 filt_len_tmp;
      74             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      75     3586244 :     Flag Overflow = 0;
      76     3586244 :     move32();
      77             : #endif
      78             :     const Resampling_cfg *cfg_ptr_fx;
      79             : 
      80             :     /*-------------------------------------------------------------------*
      81             :      * Find the resampling configuration
      82             :      *-------------------------------------------------------------------*/
      83     3586244 :     *Q_new_inp = 0;
      84     3586244 :     move16();
      85             :     /* check if fin and fout are the same */
      86     3586244 :     IF( EQ_32( fin, fout ) )
      87             :     {
      88             :         /* just copy the signal_fx and quit */
      89           0 :         Copy( sigIn_fx, sigOut_fx, lg );
      90           0 :         *mem_decim_size = 0;
      91           0 :         *Q_new_inp = 0;
      92           0 :         move16();
      93           0 :         move16();
      94           0 :         return lg;
      95             :     }
      96             :     ELSE
      97             :     {
      98             :         /* find the resampling configuration in the lookup table */
      99     3586244 :         cfg_ptr_fx = &resampling_cfg_tbl[0];
     100    47411792 :         WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( EQ_32( cfg_ptr_fx->fin_fx, fin ) && EQ_32( cfg_ptr_fx->fout_fx, fout ) ) )
     101             :         {
     102    43825548 :             test();
     103    43825548 :             test();
     104    43825548 :             cfg_ptr_fx++;
     105             :         }
     106             : 
     107             : 
     108             :         /* find config with NB 4kHz low-pass */
     109     3586244 :         test();
     110     3586244 :         test();
     111     3586244 :         IF( nblp && ( GT_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
     112             :         {
     113           0 :             flag_low_order = 1;
     114           0 :             move16();
     115           0 :             cfg_ptr_fx++;
     116           0 :             WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( ( EQ_32( cfg_ptr_fx->fin_fx, fin ) ) && ( EQ_32( cfg_ptr_fx->fout_fx, fout ) ) ) )
     117             :             {
     118           0 :                 test();
     119           0 :                 test();
     120           0 :                 cfg_ptr_fx++;
     121             :             }
     122             :         }
     123             : 
     124             :         /*-------------------------------------------------------------------*
     125             :          * Retrieve and/or calculate the resampling parameters
     126             :          *-------------------------------------------------------------------*/
     127     3586244 :         fac_num = cfg_ptr_fx->fac_num_fx;
     128     3586244 :         move16(); /*Q0*/
     129     3586244 :         fac_den = cfg_ptr_fx->fac_den_fx;
     130     3586244 :         move16();
     131             : 
     132     3586244 :         lg_out = idiv1616( i_mult2( lg, fac_num ), fac_den );
     133     3586244 :         filt_len = cfg_ptr_fx->filt_len_fx;
     134     3586244 :         move16();
     135     3586244 :         plus_sample_in = 0;
     136     3586244 :         move16(); /*default, regular delay*/
     137     3586244 :         frac = 0;
     138     3586244 :         move16();
     139             : 
     140     3586244 :         test();
     141     3586244 :         IF( ( EQ_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
     142             :         {
     143           0 :             plus_sample_in = 7;
     144           0 :             move16();
     145           0 :             frac = 4;
     146           0 :             move16();
     147             :         }
     148             : 
     149     3586244 :         mem_len = shl( filt_len, 1 );
     150     3586244 :         *mem_decim_size = mem_len;
     151     3586244 :         move16();
     152     3586244 :         signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) );
     153     3586244 :         signal_ana_fx = signal_fx;
     154     3586244 :         mem_len_ana = mem_len;
     155     3586244 :         move16();
     156             :     }
     157             : 
     158             : 
     159             :     /*-------------------------------------------------------------------*
     160             :      * Resample
     161             :      *-------------------------------------------------------------------*/
     162             :     /* append filter memory */
     163     3586244 :     Copy( mem_fx, signal_fx, mem_len );
     164             : 
     165     3586244 :     sigPtr = signal_fx + mem_len;
     166     3586244 :     Copy( sigIn_fx, sigPtr, lg );
     167             : 
     168     3586244 :     IF( plus_sample_in > 0 )
     169             :     {
     170           0 :         autocorr_fx( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, 1, r_fx_h, r_fx_l, &Q_r, LEN_WIN_SSS, wind_sss_fx, 0, 0 );
     171             : 
     172             : 
     173           0 :         t1 = L_Comp( r_fx_h[1], r_fx_l[1] ); /* R[1] in Q31      */
     174           0 :         t2 = L_abs( t1 );                    /* abs R[1]         */
     175           0 :         t0 = L_deposit_l( 0 );
     176           0 :         IF( r_fx_h[0] != 0 )
     177             :         {
     178           0 :             t0 = Div_32( t2, r_fx_h[0], r_fx_l[0] ); /* R[1]/R[0] in Q31 */
     179             :         }
     180           0 :         if ( t1 < 0 )
     181             :         {
     182           0 :             t0 = L_negate( t0 ); /* R[1]/R[0]       */
     183             :         }
     184             : 
     185             : 
     186           0 :         mu_preemph_fx = extract_h( t0 ); /*r_fx[1] / r_fx[0]; */
     187           0 :         mem_preemph_fx = signal_ana_fx[mem_len_ana + lg - LEN_WIN_SSS - 1];
     188           0 :         move16();
     189           0 :         PREEMPH_FX( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, mu_preemph_fx, LEN_WIN_SSS, &mem_preemph_fx );
     190             : 
     191             : 
     192             :         /* Autocorrelations */
     193           0 :         autocorr_fx( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, M, r_fx_h, r_fx_l, &Q_r,
     194             :                      LEN_WIN_SSS, wind_sss_fx, 0, 0 );
     195             : 
     196             :         /* Lag windowing */
     197           0 :         lag_wind( r_fx_h, r_fx_l, M, fin, LAGW_STRONG );
     198             : 
     199             :         /* Levinson-Durbin */
     200           0 :         set16_fx( mem_lev_fx, 0, 18 );
     201           0 :         E_LPC_lev_dur( r_fx_h, r_fx_l, A_fx, LepsP, M, NULL );
     202             : 
     203           0 :         Copy_Scale_sig( A_fx, A_fx, M + 1, sub( norm_s( A_fx[0] ), 2 ) );
     204             : 
     205           0 :         FOR( i = 0; i < plus_sample_in; i++ )
     206             :         {
     207           0 :             sigPtr = signal_fx + add( lg, add( mem_len, i ) );
     208           0 :             L_tmp = syn_kern_16( 0, A_fx, sigPtr );
     209           0 :             L_tmp = L_shl_sat( L_tmp, 3 );
     210           0 :             *sigPtr = round_fx_sat( L_tmp ); /* AZ ringing padding */
     211           0 :             move16();
     212             :         }
     213           0 :         mem_preemph_fx = signal_fx[mem_len + lg - LEN_WIN_SSS - 1];
     214           0 :         move16();
     215           0 :         deemph_fx( signal_fx + mem_len + lg - LEN_WIN_SSS, mu_preemph_fx, LEN_WIN_SSS + plus_sample_in, &mem_preemph_fx );
     216             :     }
     217             :     /* interpolation */
     218             : 
     219     3586244 :     datastep = shr( div_s( shl( fac_den, 7 ), shl( fac_num, 10 ) ), 12 );
     220             :     /* equivalent to 'datastep = fac_den % fac_num' */
     221     3586244 :     temp_n = i_mult2( datastep, fac_num ); /*Q0*/
     222     3586244 :     fracstep = sub( fac_den, temp_n );
     223             : 
     224     3586244 :     sigIn_ptr = signal_fx + add( filt_len, plus_sample_in );
     225             : 
     226     3586244 :     filt_len_tmp = filt_len;
     227     3586244 :     move16();
     228     3586244 :     IF( flag_low_order )
     229             :     {
     230           0 :         filt_len_tmp = shr( add( filt_len, 1 ), 1 );
     231             :     }
     232             : 
     233     3586244 :     Word16 norm_cfg_ptr = norm_s( sub( cfg_ptr_fx->filter_fx[0], 1 ) );
     234   525114657 :     FOR( i = 0; i < lg_out; i++ )
     235             :     {
     236   521528413 :         sigOut_fx[i] = round_fx_sat( Interpol_lc_fx( sigIn_ptr, cfg_ptr_fx->filter_fx, frac, fac_num, filt_len_tmp ) );
     237   521528413 :         move16();
     238   521528413 :         frac = add( frac, fracstep );
     239             : 
     240   521528413 :         j = sub( fac_num, frac );
     241   521528413 :         if ( j < 0 )
     242             :         {
     243   279084526 :             frac = sub( frac, fac_num );
     244             :         }
     245   521528413 :         sigIn_ptr += add( lshr( j, 15 ), datastep );
     246             :     }
     247     3586244 :     *Q_new_inp = negate( norm_cfg_ptr );
     248     3586244 :     move16();
     249             :     /* rescaling */
     250     3586244 :     test();
     251             : 
     252     3586244 :     IF( EQ_32( ( GT_16( fac_num, fac_den ) ), ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) ) )
     253             :     {
     254     3585992 :         IF( LT_16( fac_num, fac_den ) )
     255             :         {
     256     3585992 :             num_den = div_s( fac_num, fac_den ); /*Q15*/
     257     3585992 :             test();
     258     3585992 :             IF( GT_32( fin, 16000 ) && EQ_16( lg_out, 512 ) )
     259             :             {
     260             : 
     261     3730536 :                 FOR( i = 0; i < lg_out; i++ )
     262             :                 {
     263     3723264 :                     sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/
     264     3723264 :                     move16();
     265             :                 }
     266        7272 :                 *Q_new_inp = add( *Q_new_inp, 1 );
     267        7272 :                 move16();
     268             :             }
     269             :             ELSE
     270             :             {
     271     3578720 :                 test();
     272     3578720 :                 test();
     273     3578720 :                 test();
     274     3578720 :                 IF( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) )
     275             :                 {
     276     1307040 :                     num_den = shl_o( num_den, 1, &Overflow );
     277     1307040 :                     *Q_new_inp = add( *Q_new_inp, 1 );
     278     1307040 :                     move16();
     279             :                 }
     280   521126829 :                 FOR( i = 0; i < lg_out; i++ )
     281             :                 {
     282   517548109 :                     sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/
     283   517548109 :                     move16();
     284             :                 }
     285             :             }
     286             :         }
     287             :         ELSE
     288             :         {
     289           0 :             IF( EQ_16( fac_num, 8 ) )
     290             :             {
     291           0 :                 num_den = 26214;
     292           0 :                 move16();
     293           0 :                 FOR( i = 0; i < lg_out; i++ )
     294             :                 {
     295           0 :                     sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/
     296           0 :                     move16();
     297             :                 }
     298             :             }
     299             :             ELSE
     300             :             {
     301           0 :                 num_den = div_s( sub( fac_num, fac_den ), fac_den ); /*Q15*/
     302           0 :                 FOR( i = 0; i < lg_out; i++ )
     303             :                 {
     304           0 :                     sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/
     305           0 :                     move16();
     306             :                 }
     307           0 :                 *Q_new_inp = add( *Q_new_inp, 1 );
     308           0 :                 move16();
     309             :             }
     310             :         }
     311             :     }
     312         252 :     ELSE IF( ( LT_16( fac_num, fac_den ) ) && ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) )
     313             :     {
     314           0 :         FOR( i = 0; i < lg_out; i++ )
     315             :         {
     316           0 :             sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 );
     317           0 :             move16(); /*Q-1*/
     318             :         }
     319             :     }
     320             :     /* update the filter memory */
     321     3586244 :     sigPtr = signal_fx + lg;
     322     3586244 :     Copy( sigPtr, mem_fx, mem_len );
     323             : 
     324     3586244 :     return lg_out;
     325             : }
     326       12126 : Word16 modify_Fs_fx(                          /* o  : length of output    Q0  */
     327             :                      const Word16 sigIn_fx[], /* i  : signal to decimate  Q0  */
     328             :                      Word16 lg,               /* i  : length of input     Q0  */
     329             :                      const Word32 fin,        /* i  : frequency of input  Q0  */
     330             :                      Word16 sigOut_fx[],      /* o  : decimated signal    Q0  */
     331             :                      const Word32 fout,       /* i  : frequency of output Q0  */
     332             :                      Word16 mem_fx[],         /* i/o: filter memory       Q0  */
     333             :                      const Word16 nblp        /* i  : flag indicating if NB low-pass is applied */
     334             : )
     335             : {
     336             :     Word16 i;
     337             : 
     338             :     Word16 lg_out, fac_num, fac_den, filt_len, frac, temp_n, mem_len;
     339             :     Word16 num_den;
     340             :     Word16 datastep, fracstep;
     341             :     Word16 *sigIn_ptr, *sigPtr;
     342             :     Word16 signal_tab_fx[3 * L_FILT_MAX + L_FRAME48k], *signal_fx, *signal_ana_fx; /* 3* as 2* for memory and 1* for future prediction */
     343             :     Word16 A_fx[M + 1], r_fx_h[M + 1], r_fx_l[M + 1];
     344             :     Word16 mem_len_ana;
     345             :     Word16 plus_sample_in;
     346             :     Word16 j;
     347             :     Word16 mu_preemph_fx;
     348             :     Word16 mem_preemph_fx;
     349             :     Word16 Q_r;
     350             :     Word16 mem_lev_fx[18];
     351             :     Word32 t0, t1, t2, L_tmp; /* temporary variables                         */
     352             :     Word32 LepsP[M + 1];
     353       12126 :     Word16 flag_low_order = 0;
     354       12126 :     move16();
     355             :     Word16 filt_len_tmp;
     356             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     357       12126 :     Flag Overflow = 0;
     358       12126 :     move32();
     359             : #endif
     360             :     const Resampling_cfg *cfg_ptr_fx;
     361             : 
     362             :     /*-------------------------------------------------------------------*
     363             :      * Find the resampling configuration
     364             :      *-------------------------------------------------------------------*/
     365             : 
     366             :     /* check if fin and fout are the same */
     367       12126 :     IF( EQ_32( fin, fout ) )
     368             :     {
     369             :         /* just copy the signal_fx and quit */
     370           0 :         Copy( sigIn_fx, sigOut_fx, lg );
     371             : 
     372           0 :         return lg;
     373             :     }
     374             :     ELSE
     375             :     {
     376             :         /* find the resampling configuration in the lookup table */
     377       12126 :         cfg_ptr_fx = &resampling_cfg_tbl[0];
     378      116406 :         WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( EQ_32( cfg_ptr_fx->fin_fx, fin ) && EQ_32( cfg_ptr_fx->fout_fx, fout ) ) )
     379             :         {
     380      104280 :             test();
     381      104280 :             test();
     382      104280 :             cfg_ptr_fx++;
     383             :         }
     384             : 
     385             : 
     386             :         /* find config with NB 4kHz low-pass */
     387       12126 :         test();
     388       12126 :         test();
     389       12126 :         IF( nblp && ( GT_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
     390             :         {
     391           0 :             flag_low_order = 1;
     392           0 :             move16();
     393           0 :             cfg_ptr_fx++;
     394           0 :             WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( ( EQ_32( cfg_ptr_fx->fin_fx, fin ) ) && ( EQ_32( cfg_ptr_fx->fout_fx, fout ) ) ) )
     395             :             {
     396           0 :                 test();
     397           0 :                 test();
     398           0 :                 cfg_ptr_fx++;
     399             :             }
     400             :         }
     401             : 
     402             :         /*-------------------------------------------------------------------*
     403             :          * Retrieve and/or calculate the resampling parameters
     404             :          *-------------------------------------------------------------------*/
     405       12126 :         fac_num = cfg_ptr_fx->fac_num_fx;
     406       12126 :         move16(); /*Q0*/
     407       12126 :         fac_den = cfg_ptr_fx->fac_den_fx;
     408       12126 :         move16();
     409             : 
     410       12126 :         IF( GE_16( lg, L_FRAME ) )
     411             :         {
     412       12126 :             lg_out = cfg_ptr_fx->lg_out;
     413       12126 :             move16();
     414             :         }
     415             :         ELSE
     416             :         {
     417           0 :             lg_out = idiv1616( i_mult2( lg, fac_num ), fac_den );
     418             :         }
     419       12126 :         filt_len = cfg_ptr_fx->filt_len_fx;
     420       12126 :         move16();
     421       12126 :         plus_sample_in = 0;
     422       12126 :         move16(); /*default, regular delay*/
     423       12126 :         frac = 0;
     424       12126 :         move16();
     425             : 
     426       12126 :         test();
     427       12126 :         IF( ( EQ_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
     428             :         {
     429           0 :             plus_sample_in = 7;
     430           0 :             move16();
     431           0 :             frac = 4;
     432           0 :             move16();
     433             :         }
     434             : 
     435       12126 :         mem_len = shl( filt_len, 1 );
     436       12126 :         signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) );
     437       12126 :         signal_ana_fx = signal_fx;
     438       12126 :         mem_len_ana = mem_len;
     439       12126 :         move16();
     440             :     }
     441             : 
     442             : 
     443             :     /*-------------------------------------------------------------------*
     444             :      * Resample
     445             :      *-------------------------------------------------------------------*/
     446             :     /* append filter memory */
     447       12126 :     Copy( mem_fx, signal_fx, mem_len );
     448             : 
     449       12126 :     sigPtr = signal_fx + mem_len;
     450       12126 :     Copy( sigIn_fx, sigPtr, lg );
     451             : 
     452       12126 :     IF( plus_sample_in > 0 )
     453             :     {
     454           0 :         autocorr_fx( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), 1, r_fx_h, r_fx_l, &Q_r, LEN_WIN_SSS, wind_sss_fx, 0, 0 );
     455             : 
     456             : 
     457           0 :         t1 = L_Comp( r_fx_h[1], r_fx_l[1] ); /* R[1] in Q31      */
     458           0 :         t2 = L_abs( t1 );                    /* abs R[1]         */
     459           0 :         t0 = L_deposit_l( 0 );
     460           0 :         IF( r_fx_h[0] != 0 )
     461             :         {
     462           0 :             t0 = Div_32( t2, r_fx_h[0], r_fx_l[0] ); /* R[1]/R[0] in Q31 */
     463             :         }
     464           0 :         if ( t1 < 0 )
     465             :         {
     466           0 :             t0 = L_negate( t0 ); /* R[1]/R[0]       */
     467             :         }
     468             : 
     469             : 
     470           0 :         mu_preemph_fx = extract_h( t0 ); /*r_fx[1] / r_fx[0]; */
     471           0 :         mem_preemph_fx = signal_ana_fx[mem_len_ana + lg - LEN_WIN_SSS - 1];
     472           0 :         move16();
     473           0 :         PREEMPH_FX( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), mu_preemph_fx, LEN_WIN_SSS, &mem_preemph_fx );
     474             : 
     475             : 
     476             :         /* Autocorrelations */
     477           0 :         autocorr_fx( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), M, r_fx_h, r_fx_l, &Q_r,
     478             :                      LEN_WIN_SSS, wind_sss_fx, 0, 0 );
     479             : 
     480             :         /* Lag windowing */
     481           0 :         lag_wind( r_fx_h, r_fx_l, M, fin, LAGW_STRONG );
     482             : 
     483             :         /* Levinson-Durbin */
     484           0 :         set16_fx( mem_lev_fx, 0, 18 );
     485           0 :         E_LPC_lev_dur( r_fx_h, r_fx_l, A_fx, LepsP, M, NULL );
     486             : 
     487           0 :         Copy_Scale_sig( A_fx, A_fx, M + 1, sub( norm_s( A_fx[0] ), 2 ) );
     488             : 
     489           0 :         FOR( i = 0; i < plus_sample_in; i++ )
     490             :         {
     491           0 :             sigPtr = signal_fx + add( add( lg, mem_len ), i );
     492           0 :             move16(); /*+i*/
     493           0 :             L_tmp = syn_kern_16( 0, A_fx, sigPtr );
     494           0 :             L_tmp = L_shl_sat( L_tmp, 3 );
     495           0 :             *sigPtr = round_fx_sat( L_tmp ); /* AZ ringing padding */
     496             :         }
     497           0 :         mem_preemph_fx = signal_fx[mem_len + lg - LEN_WIN_SSS - 1];
     498           0 :         move16();
     499           0 :         deemph_fx( signal_fx + sub( add( mem_len, lg ), LEN_WIN_SSS ), mu_preemph_fx, add( LEN_WIN_SSS, plus_sample_in ), &mem_preemph_fx );
     500             :     }
     501             :     /* interpolation */
     502             : 
     503       12126 :     datastep = shr( div_s( shl( fac_den, 8 ), shl( fac_num, 11 ) ), 12 );
     504             :     /* equivalent to 'datastep = fac_den % fac_num' */
     505       12126 :     temp_n = i_mult2( datastep, fac_num ); /*Q0*/
     506       12126 :     fracstep = sub( fac_den, temp_n );
     507             : 
     508       12126 :     sigIn_ptr = signal_fx + add( filt_len, plus_sample_in );
     509             : 
     510       12126 :     filt_len_tmp = filt_len;
     511       12126 :     move16();
     512       12126 :     IF( flag_low_order )
     513             :     {
     514           0 :         filt_len_tmp = shr( add( filt_len, 1 ), 1 );
     515             :     }
     516             : 
     517     3455070 :     FOR( i = 0; i < lg_out; i++ )
     518             :     {
     519     3442944 :         sigOut_fx[i] = round_fx_sat( Interpol_lc_fx( sigIn_ptr, cfg_ptr_fx->filter_fx, frac, fac_num, filt_len_tmp ) );
     520     3442944 :         move16();
     521     3442944 :         frac = add( frac, fracstep );
     522             : 
     523     3442944 :         j = sub( fac_num, frac );
     524     3442944 :         if ( j < 0 )
     525             :         {
     526     1319102 :             frac = sub( frac, fac_num );
     527             :         }
     528     3442944 :         sigIn_ptr += add( lshr( j, 15 ), datastep );
     529             :     }
     530             :     /* rescaling */
     531       12126 :     test();
     532             : 
     533       12126 :     IF( EQ_32( ( GT_16( fac_num, fac_den ) ), ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) ) )
     534             :     {
     535        9934 :         IF( LT_16( fac_num, fac_den ) )
     536             :         {
     537        9934 :             num_den = div_s( fac_num, fac_den ); /*Q15*/
     538        9934 :             test();
     539        9934 :             IF( GT_32( fin, 16000 ) && EQ_16( lg_out, 512 ) )
     540             :             {
     541             : 
     542           0 :                 FOR( i = 0; i < lg_out; i++ )
     543             :                 {
     544           0 :                     sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/
     545             :                 }
     546             :             }
     547             :             ELSE
     548             :             {
     549        9934 :                 test();
     550        9934 :                 test();
     551        9934 :                 test();
     552        9934 :                 if ( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) )
     553             :                 {
     554             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     555        6200 :                     num_den = shl_o( num_den, 1, &Overflow );
     556             : #else
     557             :                     num_den = shl( num_den, 1 );
     558             : #endif
     559             :                 }
     560     2751438 :                 FOR( i = 0; i < lg_out; i++ )
     561             :                 {
     562     2741504 :                     sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/
     563     2741504 :                     move16();
     564             :                 }
     565             :             }
     566             :         }
     567             :         ELSE
     568             :         {
     569           0 :             IF( EQ_16( fac_num, 8 ) )
     570             :             {
     571           0 :                 num_den = 26214;
     572           0 :                 FOR( i = 0; i < lg_out; i++ )
     573             :                 {
     574           0 :                     sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/
     575           0 :                     move16();
     576             :                 }
     577             :             }
     578             :             ELSE
     579             :             {
     580           0 :                 num_den = div_s( sub( fac_num, fac_den ), fac_den ); /*Q15*/
     581           0 :                 FOR( i = 0; i < lg_out; i++ )
     582             :                 {
     583           0 :                     sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/
     584             :                 }
     585             :             }
     586             :         }
     587             :     }
     588        2192 :     ELSE IF( ( LT_16( fac_num, fac_den ) ) && ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) )
     589             :     {
     590           0 :         FOR( i = 0; i < lg_out; i++ )
     591             :         {
     592           0 :             sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 );
     593           0 :             move16(); /*Q-1*/
     594             :         }
     595             :     }
     596             :     /* update the filter memory */
     597       12126 :     sigPtr = signal_fx + lg;
     598       12126 :     Copy( sigPtr, mem_fx, mem_len );
     599             : 
     600       12126 :     return lg_out;
     601             : }
     602             : /*-------------------------------------------------------------------*
     603             :  * modify_Fs_intcub3m_sup()
     604             :  *
     605             :  *
     606             :  *-------------------------------------------------------------------*/
     607             : 
     608          24 : Word16 modify_Fs_intcub3m_sup_fx(                       /* o  : length of output    */
     609             :                                   const Word16 sigIn[], /* i  : signal to decimate with memory of 2 samples (indexes -2 & -1) */
     610             :                                   const Word16 lg,      /* i  : length of input (suppose that lg is such that lg_out is integer, ex multiple of 5 in case of 16kHz to 12.8 kHz) */
     611             :                                   const Word32 fin,     /* i  : frequency of input  */
     612             :                                   Word16 sigOut[],      /* o  : decimated signal    */
     613             :                                   const Word32 fout,    /* i  : frequency of output */
     614             :                                   Word16 *delayout      /* o  : delay of output */
     615             : )
     616             : {
     617             :     Word16 i, k, i1, i2, k1, k2, k3, kk, cind;
     618             :     Word16 lg_out, fk1, k2d, k3d;
     619             :     Word16 cc[4][4];
     620          24 :     const Word16( *cu )[3] = 0;
     621             :     Word16 *sigin_sr, *sigOutptr, *cptr;
     622             :     const Word16 *uptr, *ctptr;
     623             :     Word16 *sigin_sr_tab;
     624             :     Word16 lim, inc, lim2, lim3;
     625             :     Word32 vv32;
     626             : #define QSR 2 /* right shift to avoid overflow, 2 is OK */
     627             : 
     628          24 :     k = 0;
     629          24 :     move16(); /* to avoid compilation warnings */
     630          24 :     inc = 0;
     631          24 :     move16(); /* to avoid compilation warnings */
     632             : 
     633             :     /*-------------------------------------------------------------------*
     634             :      * Find the resampling configuration
     635             :      *-------------------------------------------------------------------*/
     636             : 
     637             :     /* check if fin and fout are the same */
     638          24 :     IF( EQ_32( fin, fout ) )
     639             :     {
     640             :         /* just copy the signal_fx and quit */
     641           0 :         Copy( sigIn, sigOut, lg );
     642           0 :         *delayout = 0;
     643           0 :         move16();
     644             : 
     645           0 :         return lg;
     646             :     }
     647             :     ELSE
     648             :     {
     649          24 :         sigin_sr_tab = (Word16 *) calloc( lg + 2, sizeof( *sigin_sr ) ); /*shift right*/
     650          24 :         sigin_sr = sigin_sr_tab + 2;
     651         532 :         FOR( i = -2; i < lg; i++ )
     652             :         {
     653         508 :             sigin_sr[i] = shr( sigIn[i], QSR );
     654         508 :             move16(); /* shift right : Q0 -> Q(-QSR) */
     655             :         }
     656             : 
     657             :         /* length of the interpolated signal */
     658             :         /*lg_out = (short)(lg * fout / fin); */
     659             : 
     660             :         /* cc[x][3]*s*s*s + cc[x][2]*s*s + cc[x][1]*s + cc[x][0]; indexes relatives of s : -1 0 1 2 */
     661             :         /* d : cc[x][0] = s[0] */
     662             :         /* b : cc[x][2] =(s[-1]+s[1])/2-s[0] */
     663             :         /* a : cc[x][3] = (s[-1]+s[2]-s[0]-s[1]-4*cc[x][2]) / 6 */
     664             :         /* c : cc[x][1] = s[1]-s[0]-cc[x][3]-cc[x][2] */
     665             : 
     666             :         /* coef inits using memory (indexes < 0) */
     667             :         /* cc[2][] : indexes -2 -1 0 1 */
     668          24 :         cptr = &( cc[2][0] );
     669          24 :         cptr[0] = mult_r( sigin_sr[-1], 10923 );
     670          24 :         move16(); /* sigIn[-1]/3    */
     671          24 :         cptr[2] = sub( shr( add( sigin_sr[-2], sigin_sr[0] ), 1 ), sigin_sr[-1] );
     672          24 :         move16(); /* (sigIn[-2]+sigIn[0])/2-sigIn[-1]; */
     673          24 :         cptr[3] = sub( mult_r( sub( add( sigin_sr[-2], sigin_sr[1] ), add( sigin_sr[-1], sigin_sr[0] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
     674          24 :         move16(); /*(sigIn[-2]+sigIn[1]-sigIn[-1]-sigIn[0]) / 6 - 4/6*cc[2][2]);*/
     675          24 :         cptr[1] = sub( sub( sigin_sr[0], sigin_sr[-1] ), add( cptr[3], cptr[2] ) );
     676          24 :         move16();
     677             : 
     678             :         /* cc[3][] : indexes -1 0 1 2 */
     679          24 :         cptr = &( cc[3][0] );
     680          24 :         cptr[0] = mult_r( sigin_sr[0], 10923 );
     681          24 :         move16(); /* sigIn[-1]/3    */
     682          24 :         cptr[2] = sub( shr( add( sigin_sr[-1], sigin_sr[1] ), 1 ), sigin_sr[0] );
     683          24 :         move16(); /* (sigIn[-1]+sigIn[1])/2-sigIn[0]; */
     684          24 :         cptr[3] = sub( mult_r( sub( add( sigin_sr[-1], sigin_sr[2] ), add( sigin_sr[0], sigin_sr[1] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
     685          24 :         move16(); /*(sigIn[-2]+sigIn[1]-sigIn[-1]-sigIn[0]) / 6 - 4/6*cc[2][2]);*/
     686          24 :         cptr[1] = sub( sub( sigin_sr[1], sigin_sr[0] ), add( cptr[3], cptr[2] ) );
     687          24 :         move16();
     688             : 
     689          24 :         sigOutptr = sigOut;
     690          24 :         cind = -1;
     691          24 :         move16();
     692          24 :         move16(); /* for the move */
     693          24 :         IF( EQ_32( fin, 12800 ) )
     694             :         {
     695           5 :             if ( EQ_32( fout, 8000 ) )
     696             :             {
     697           0 :                 cind = 0;
     698           0 :                 move16();
     699             :             }
     700           5 :             if ( EQ_32( fout, 16000 ) )
     701             :             {
     702           0 :                 cind = 1;
     703           0 :                 move16();
     704             :             }
     705           5 :             if ( EQ_32( fout, 32000 ) )
     706             :             {
     707           5 :                 cind = 2;
     708           5 :                 move16();
     709             :             }
     710           5 :             if ( EQ_32( fout, 48000 ) )
     711             :             {
     712           0 :                 cind = 3;
     713           0 :                 move16();
     714             :             }
     715             :         }
     716          24 :         IF( EQ_32( fin, 16000 ) )
     717             :         {
     718          19 :             if ( EQ_32( fout, 12800 ) )
     719             :             {
     720           0 :                 cind = 4;
     721           0 :                 move16();
     722             :             }
     723          19 :             if ( EQ_32( fout, 32000 ) )
     724             :             {
     725           0 :                 cind = 5;
     726           0 :                 move16();
     727             :             }
     728          19 :             if ( EQ_32( fout, 48000 ) )
     729             :             {
     730          19 :                 cind = 6;
     731          19 :                 move16();
     732             :             }
     733             :         }
     734          24 :         ctptr = &( ct2_fx[cind][0] );
     735          24 :         lg_out = mult_r( shl( lg, 2 ), ctptr[13] );
     736          24 :         *delayout = ctptr[9];
     737          24 :         move16();
     738             : 
     739          24 :         if ( EQ_16( ctptr[12], 15 ) )
     740             :         {
     741          24 :             cu = cu15_fx;
     742          24 :             move16(); /*pointer*/
     743             :         }
     744             : 
     745          24 :         if ( EQ_16( ctptr[12], 4 ) )
     746             :         {
     747           0 :             cu = cu4_fx;
     748           0 :             move16(); /*pointer*/
     749             :         }
     750             : 
     751          24 :         k2d = sub( ctptr[12], 1 ); /* shift of index in cu with respect to the next sample (ex 1.25 -> 0.25 ) */
     752          24 :         fk1 = shl( k2d, 1 );
     753          24 :         k3d = sub( fk1, 1 ); /* to compurte index in cu with respect to the last sample with - sign (ex 1.25 -> -0.75 ) */
     754             : 
     755          24 :         kk = 0;
     756          24 :         move16();
     757          24 :         i = 0;
     758          24 :         move16();
     759             : 
     760          24 :         lim = sub( lg, ctptr[11] );
     761          24 :         lim2 = sub( lg, 3 );
     762          24 :         lim3 = ctptr[10];
     763          24 :         move16();
     764         382 :         WHILE( LT_16( i, lim2 ) )
     765             :         {
     766         358 :             if ( GE_16( i, lim ) )
     767             :             {
     768          24 :                 lim3 = sub( ctptr[11], 3 ); /* last, incomplete period*/
     769             :             }
     770         358 :             *sigOutptr++ = sigIn[i];
     771         358 :             move16();
     772         746 :             FOR( k = 0; k < lim3; k++ )
     773             :             {
     774         388 :                 cptr = &( cc[kk][0] );
     775         388 :                 cptr[0] = mult_r( sigin_sr[i + 1], 10923 );
     776         388 :                 move16(); /* sigIn[-1]/3    */
     777         388 :                 cptr[2] = sub( shr( add( sigin_sr[i], sigin_sr[i + 2] ), 1 ), sigin_sr[i + 1] );
     778         388 :                 move16(); /* (sigIn[-1]+sigIn[1])/2-sigIn[0]; */
     779         388 :                 cptr[3] = sub( mult_r( sub( add( sigin_sr[i], sigin_sr[i + 3] ), add( sigin_sr[i + 1], sigin_sr[i + 2] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
     780         388 :                 move16(); /*(sigIn[-1]+sigIn[1]-sigIn[0]-sigIn[1]) / 6 - 4/6*cc[3][2]);*/
     781         388 :                 cptr[1] = sub( sub( sigin_sr[i + 2], sigin_sr[i + 1] ), add( cptr[3], cptr[2] ) );
     782         388 :                 move16();
     783         388 :                 i = add( i, 1 );
     784             : 
     785         388 :                 i2 = sub( kk, 2 );
     786         388 :                 i1 = sub( kk, 1 );
     787         388 :                 if ( i1 < 0 )
     788             :                 {
     789         115 :                     i1 = add( i1, 4 );
     790             :                 }
     791             : 
     792         388 :                 if ( i2 < 0 )
     793             :                 {
     794         206 :                     i2 = add( i2, 4 );
     795             :                 }
     796         388 :                 inc = ctptr[8];
     797         388 :                 move16();
     798        1164 :                 FOR( k1 = ctptr[k]; k1 < fk1; k1 += inc )
     799             :                 {
     800         776 :                     k2 = sub( k1, k2d );
     801         776 :                     k3 = sub( k3d, k1 );
     802         776 :                     cptr = &( cc[i2][0] );
     803         776 :                     uptr = &( cu[k1][0] );
     804         776 :                     vv32 = L_mult( 8192, *cptr++ );
     805         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     806         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     807         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
     808         776 :                     cptr = &( cc[i1][0] );
     809         776 :                     uptr = &( cu[k2][0] );
     810         776 :                     vv32 = L_mac( vv32, 8192, *cptr++ );
     811         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     812         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     813         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     814         776 :                     cptr = &( cc[kk][0] );
     815         776 :                     uptr = &( cu[k3][0] );
     816         776 :                     vv32 = L_mac( vv32, 8192, *cptr++ );
     817         776 :                     vv32 = L_msu( vv32, *uptr++, *cptr++ );
     818         776 :                     vv32 = L_mac( vv32, *uptr++, *cptr++ );
     819         776 :                     vv32 = L_msu( vv32, *uptr++, *cptr++ );
     820         776 :                     vv32 = L_shl( vv32, ( QSR + 2 ) ); /* Q(13-QSR+1) -> Q16 */
     821         776 :                     *sigOutptr++ = round_fx( vv32 );   /* Q16 -> Q0*/
     822             :                 }
     823             : 
     824         388 :                 kk = add( kk, 1 );
     825         388 :                 if ( EQ_16( kk, 4 ) )
     826             :                 {
     827          91 :                     kk = 0;
     828          91 :                     move16();
     829             :                 }
     830             :             }
     831             :         }
     832             : 
     833             : 
     834          24 :         kk = sub( kk, 1 );
     835          24 :         if ( kk < 0 )
     836             :         {
     837           0 :             kk = 3;
     838           0 :             move16();
     839             :         }
     840             : 
     841          24 :         if ( EQ_16( ctptr[10], 1 ) )
     842             :         {
     843          19 :             *sigOutptr++ = sigIn[i];
     844          19 :             move16();
     845             :         }
     846             : 
     847          72 :         FOR( k1 = ctptr[k]; k1 < fk1; k1 += inc )
     848             :         {
     849          48 :             k2 = sub( k1, k2d );
     850             : 
     851          48 :             cptr = &( cc[kk][0] );
     852          48 :             uptr = &( cu[k2][0] );
     853          48 :             vv32 = L_mult( 8192, *cptr++ );
     854          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ );
     855          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ );
     856          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
     857          48 :             vv32 = L_shl( vv32, ( QSR + 2 ) );      /* Q(13-QSR+1) -> Q16 */
     858          48 :             *sigOutptr++ = i_mult( round_fx( vv32 ), 3 );
     859          48 :             move16(); /* Q16 -> Q0*/
     860             :         }
     861             : 
     862          24 :         if ( LT_16( ctptr[10], 3 ) )
     863             :         {
     864          24 :             *sigOutptr++ = sigIn[i + 1];
     865          24 :             move16();
     866             :         }
     867             : 
     868          72 :         FOR( k1 = ctptr[k + 1]; k1 < fk1; k1 += inc )
     869             :         {
     870          48 :             cptr = &( cc[kk][0] );
     871          48 :             uptr = &( cu[k1][0] );
     872          48 :             vv32 = L_mult( 8192, *cptr++ );
     873          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ );
     874          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ );
     875          48 :             vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
     876          48 :             vv32 = L_shl( vv32, ( QSR + 2 ) );      /* Q(13-QSR+1) -> Q16 */
     877          48 :             *sigOutptr++ = i_mult( round_fx( vv32 ), 3 );
     878          48 :             move16(); /* Q16 -> Q0*/
     879             :         }
     880             : 
     881          24 :         if ( EQ_16( ctptr[10], 1 ) )
     882             :         {
     883          19 :             *sigOutptr = sigIn[i + 2];
     884          19 :             move16();
     885             :         }
     886             :     }
     887             : 
     888          24 :     free( sigin_sr_tab );
     889             : 
     890          24 :     return lg_out;
     891             : }
     892             : 
     893             : /*====================================================================*/
     894             : /* FUNCTION      :  Decimate_allpass_steep_fx1 ()                     */
     895             : /*-------------------------------------------------------------------*/
     896             : /* PURPOSE       :  decimation by a factor 2                     */
     897             : /*-------------------------------------------------------------------*/
     898             : /* INPUT ARGUMENTS  :                                                */
     899             : /*   _ (const Word16 *) in_fx :  input speech, Q0                    */
     900             : /*   _ (Word16 []) mem: Stateinfo, Q0                                */
     901             : /*                     Size: 2*ALLPASSSECTIONS_STEEP+1               */
     902             : /*   _ (Word16) N: Number of Input samples                           */
     903             : /*   _ (Word16 []) out_fx    :Output arry of size N/2 Q0             */
     904             : /*-------------------------------------------------------------------*/
     905             : /* OUTPUT ARGUMENTS :                                                */
     906             : /*   _ (Word16 []) out_fx : output-signal, Q0                        */
     907             : /*   _ (Word16 []) mem:gets updated, Q0                              */
     908             : /*-------------------------------------------------------------------*/
     909             : /* INPUT/OUTPUT ARGUMENTS :                                          */
     910             : /*-------------------------------------------------------------------*/
     911             : /* RETURN ARGUMENTS : _ None.                                        */
     912             : /*===================================================================*/
     913             : 
     914             : 
     915      586512 : void Decimate_allpass_steep_fx(
     916             :     const Word16 *in_fx,
     917             :     Word16 mem[],     /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
     918             :     Word16 N,         /* number of input samples */
     919             :     Word16 out_fx[] ) /* array of size N/2 */
     920             : {
     921             : 
     922             :     Word16 k;
     923             :     Word16 temp[ALLPASSSECTIONS_STEEP];
     924             :     Word32 Lacc, Lacc1;
     925             :     Word16 temp1, temp2;
     926      586512 :     Word16 sum = 0;
     927             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     928      586512 :     Flag Overflow = 0;
     929      586512 :     move32();
     930             : #endif
     931      586512 :     move16();
     932             : 
     933             :     /*upper allpass filter chain  */
     934             : 
     935             : 
     936   161475040 :     FOR( k = 0; k < N / 2; k++ )
     937             :     {
     938             : 
     939   160888528 :         Lacc = L_deposit_h( mem[0] );                                     /* Q(16+x)   */
     940   160888528 :         Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[2 * k], &Overflow ); /* Q(16+x)   */
     941   160888528 :         Lacc1 = L_deposit_h( in_fx[2 * k] );                              /* Q16+Qx    */
     942   160888528 :         temp1 = extract_h( Lacc );                                        /* Qx        */
     943   160888528 :         Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow );      /* Q16+Qx    */
     944   160888528 :         mem[0] = extract_h( Lacc1 );                                      /* Qx        */
     945   160888528 :         temp[0] = temp1;
     946   160888528 :         move16();
     947   160888528 :         move16();
     948             : 
     949   160888528 :         Lacc1 = L_deposit_h( mem[1] );                                   /* Q16+Qx    */
     950   160888528 :         Lacc1 = ( L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ) ); /* Q16+Qx    */
     951             : 
     952   160888528 :         temp2 = extract_h( Lacc1 );                                /* Qx        */
     953   160888528 :         Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow ); /* Q16+Qx    */
     954   160888528 :         mem[1] = extract_h( Lacc );                                /* Qx        */
     955   160888528 :         temp[1] = temp2;
     956   160888528 :         move16();
     957   160888528 :         move16();
     958             : 
     959             : 
     960   160888528 :         Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] );                                                /* Q(16+x)              */
     961   160888528 :         out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format            */
     962   160888528 :         move16();
     963   160888528 :         mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k], &Overflow ) ); /* Qx    */
     964   160888528 :         move16();
     965             :     }
     966             : 
     967             :     /* lower allpass filter chain  */
     968             : 
     969      586512 :     Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] );                                   /*  Q(16+x)     */
     970      586512 :     Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], mem[2 * ALLPASSSECTIONS_STEEP], &Overflow ); /*Q(16+x)   */
     971      586512 :     Lacc1 = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP] );                              /*  Q(16+x)     */
     972      586512 :     temp1 = extract_h( Lacc );                                                          /*  Qx          */
     973      586512 :     Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow );                        /*  Q(16+x)     */
     974      586512 :     mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 );
     975      586512 :     temp[0] = temp1;
     976      586512 :     move16();
     977             : 
     978      586512 :     Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] );       /*   Q(16+x) */
     979      586512 :     Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /*  Q(16+x) */
     980      586512 :     temp2 = extract_h( Lacc1 );                                  /*  Qx      */
     981      586512 :     temp[1] = temp2;
     982      586512 :     move16();
     983      586512 :     Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /*  Q(16+x) */
     984      586512 :     mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc );        /*  Qx      */
     985      586512 :     move16();
     986             : 
     987      586512 :     Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] );                          /* Q(16+x)  */
     988      586512 :     Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
     989      586512 :     temp[2] = extract_h( Lacc );                                                       /* temp[2] in Qx  */
     990      586512 :     move16();
     991      586512 :     Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /*   Q(16+x) */
     992      586512 :     mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 );                               /*   Qx      */
     993      586512 :     move16();
     994      586512 :     sum = mult_r( out_fx[0], 16384 );                                             /* Qx */
     995      586512 :     out_fx[0] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); /*    Qx  */
     996      586512 :     move16();
     997             : 
     998             : 
     999   160888528 :     FOR( k = 1; k < N / 2; k++ )
    1000             :     {
    1001             : 
    1002             : 
    1003   160302016 :         Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] );                     /* Q(16+x)           */
    1004   160302016 :         Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[2 * k - 1], &Overflow ); /* Q(16+x):temp[0]   */
    1005   160302016 :         Lacc1 = L_deposit_h( in_fx[2 * k - 1] );                              /* Q(16+x)           */
    1006   160302016 :         temp1 = extract_h( Lacc );                                            /* Qx                */
    1007   160302016 :         Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow );          /* Q(16+x)           */
    1008             : 
    1009   160302016 :         mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 ); /* Qx */
    1010   160302016 :         move16();
    1011   160302016 :         temp[0] = temp1;
    1012   160302016 :         move16();
    1013             : 
    1014             : 
    1015   160302016 :         Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] );       /* Q(16+x)  */
    1016   160302016 :         Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x)  */
    1017   160302016 :         temp2 = extract_h( Lacc1 );                                  /* Qx       */
    1018   160302016 :         temp[1] = temp2;
    1019   160302016 :         move16();
    1020   160302016 :         Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x)  */
    1021   160302016 :         mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc );        /* Qx       */
    1022             : 
    1023             : 
    1024   160302016 :         Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] );                              /* Q(16+x) */
    1025   160302016 :         Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[1], &Overflow );   /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
    1026   160302016 :         temp[2] = extract_h( Lacc );                                                           /*temp[2] in Qx  */
    1027   160302016 :         Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */
    1028   160302016 :         mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 );                               /* Qx  */
    1029             : 
    1030             : 
    1031   160302016 :         sum = mult_r( out_fx[k], 16384 ); /* Qx */
    1032   160302016 :         out_fx[k] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) );
    1033   160302016 :         move16();
    1034   160302016 :         move16(); /* Qx  */
    1035             :     }
    1036             : 
    1037             :     /* z^(-1) */
    1038             : 
    1039      586512 :     mem[2 * ALLPASSSECTIONS_STEEP] = in_fx[N - 1];
    1040      586512 :     move16(); /* Qx */
    1041      586512 : }
    1042             : 
    1043             : 
    1044             : /*-------------------------------------------------------------------*
    1045             :  * Interpolate_allpass_steep()
    1046             :  *
    1047             :  * Interpolation by a factor 2
    1048             :  *-------------------------------------------------------------------*/
    1049             : 
    1050       23795 : void Interpolate_allpass_steep_fx(
    1051             :     const Word16 *in_fx,
    1052             :     Word16 mem[],     /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
    1053             :     Word16 N,         /* number of input samples */
    1054             :     Word16 out_fx[] ) /* array of size 2*N */
    1055             : {
    1056             : 
    1057             :     Word16 k;
    1058       23795 :     Word32 Lacc = 0, Lacc1 = 0;
    1059             :     Word16 temp1, temp2;
    1060             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    1061       23795 :     Flag Overflow = 0;
    1062       23795 :     move32();
    1063             : #endif
    1064             :     /*** State in Q0,in_fx Q0, AP1_STEEP in Q15 AP2_STEEP in Q15  OP in Q0 ************/
    1065             :     /*upper allpass filter chain     */
    1066             : 
    1067     3354975 :     FOR( k = 0; k < N; k++ )
    1068             :     {
    1069             : 
    1070     3331180 :         Lacc = L_deposit_h( mem[0] );                                 /* Q(16+x) */
    1071     3331180 :         Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[k], &Overflow ); /* Q(16+x):temp[0] */
    1072     3331180 :         Lacc1 = L_deposit_h( in_fx[k] );                              /* Q(16+x) */
    1073     3331180 :         temp1 = round_fx_o( Lacc, &Overflow );                        /* Qx */
    1074     3331180 :         Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow );  /* Q(16+x)  */
    1075             : 
    1076     3331180 :         mem[0] = round_fx_o( Lacc1, &Overflow );
    1077     3331180 :         move16();
    1078     3331180 :         Lacc1 = L_deposit_h( mem[1] );                                   /* Q(16+x) */
    1079     3331180 :         Lacc1 = ( L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ) ); /* Q(16+x):temp[1] */
    1080     3331180 :         Lacc = L_deposit_h( temp1 );
    1081             : 
    1082     3331180 :         temp2 = round_fx_o( Lacc1, &Overflow );                    /* Qx */
    1083     3331180 :         Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */
    1084     3331180 :         mem[1] = round_fx_o( Lacc, &Overflow );                    /* Qx */
    1085     3331180 :         move16();
    1086             : 
    1087     3331180 :         Lacc1 = L_deposit_h( temp2 );
    1088     3331180 :         Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] );                                                                    /* Q(16+x) */
    1089     3331180 :         out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */
    1090     3331180 :         move16();
    1091     3331180 :         mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1], &Overflow ), &Overflow ); /* Qx  */
    1092     3331180 :         move16();
    1093             :     }
    1094             : 
    1095             :     /*  lower allpass filter chain    */
    1096             : 
    1097     3354975 :     FOR( k = 0; k < N; k++ )
    1098             :     {
    1099     3331180 :         Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] );             /* Q(16+x) */
    1100     3331180 :         Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[k], &Overflow ); /* Q(16+x):temp[0] */
    1101     3331180 :         Lacc1 = L_deposit_h( in_fx[k] );                              /* Q(16+x) */
    1102     3331180 :         temp1 = round_fx_o( Lacc, &Overflow );                        /* Qx */
    1103     3331180 :         Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow );  /* Q(16+x)  */
    1104             : 
    1105     3331180 :         mem[ALLPASSSECTIONS_STEEP] = round_fx_o( Lacc1, &Overflow );
    1106     3331180 :         Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] );       /* Q(16+x) */
    1107     3331180 :         Lacc1 = L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x):temp[1] */
    1108             : 
    1109     3331180 :         temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */
    1110     3331180 :         Lacc = L_deposit_h( temp1 );
    1111     3331180 :         Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow );      /* Q(16+x) */
    1112     3331180 :         mem[ALLPASSSECTIONS_STEEP + 1] = round_fx_o( Lacc, &Overflow ); /* Qx */
    1113             : 
    1114     3331180 :         Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
    1115     3331180 :         Lacc1 = L_deposit_h( temp2 );
    1116     3331180 :         out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */
    1117     3331180 :         move16();
    1118     3331180 :         mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k], &Overflow ), &Overflow ); /* Qx */
    1119     3331180 :         move16();
    1120             :     }
    1121             : 
    1122       23795 :     return;
    1123             : }
    1124             : 
    1125             : 
    1126             : /*-------------------------------------------------------------------*
    1127             :  * interpolate_3_over_2_allpass_fx()
    1128             :  *
    1129             :  * Interpolate 3/2 using allpass iir polyphase filter. Delay 4 samples @48k
    1130             :  *-------------------------------------------------------------------*/
    1131             : 
    1132        1603 : void interpolate_3_over_2_allpass_fx(
    1133             :     const Word16 *input_fx,
    1134             :     /* i  : input signal            */ /* Q_input */
    1135             :     const Word16 len,                  /* i  : number of input samples */
    1136             :     Word16 *out_fx,
    1137             :     /* o  : output signal           */ /* Q_input */
    1138             :     Word16 *mem_fx,
    1139             :     /* i/o: memory                  */                             /* Q_input */
    1140             :     const Word16 *filt_coeff_fx /* i  : filter coefficients     */ /* Q15*/
    1141             : )
    1142             : {
    1143             :     /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
    1144             :     Word16 i, loop_len;
    1145             :     Word16 input_fx_temp[L_FRAME32k];                                                                     /* Limiting length of input signal to a max of L_FRAME32k samples */
    1146             :     Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ /* will be in Q_current */
    1147             :     Word16 out1_buff[L_FRAME48k * 2];
    1148             :     Word16 *out1;
    1149             :     Word16 mem_temp;
    1150             : 
    1151             :     Word16 s;
    1152             : 
    1153        1603 :     s = 0;
    1154        1603 :     move16();
    1155     1017909 :     FOR( i = 0; i < len; i++ )
    1156             :     {
    1157     1016306 :         s = s_max( s, abs_s( input_fx[i] ) );
    1158             :     }
    1159       25648 :     FOR( i = 0; i < INTERP_3_2_MEM_LEN; i++ )
    1160             :     {
    1161       24045 :         s = s_max( s, abs_s( mem_fx[i] ) );
    1162             :     }
    1163        1603 :     s = s_max( sub( norm_s( s ), 2 ), 0 );
    1164        1603 :     Copy_Scale_sig( input_fx, input_fx_temp, len, s );
    1165        1603 :     Scale_sig( mem_fx, INTERP_3_2_MEM_LEN, s );
    1166        1603 :     out1 = out1_buff;
    1167             : 
    1168     1017909 :     FOR( i = 0; i < len; i++ )
    1169             :     {
    1170             :         /* Upper branch */
    1171             :         /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
    1172             :         Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
    1173             :         mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
    1174             : 
    1175     1016306 :         Vu[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[0], sub_sat( input_fx_temp[i], mem_fx[1] ) ) );
    1176     1016306 :         move16(); /* all Vu's in : Q_current*/
    1177     1016306 :         Vu[1] = add_sat( mem_fx[1], mult_r_sat( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
    1178     1016306 :         move16();
    1179     1016306 :         mem_fx[3] = add_sat( mem_fx[2], mult_r_sat( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
    1180     1016306 :         move16();
    1181             : 
    1182             : 
    1183     1016306 :         mem_fx[1] = Vu[0];
    1184     1016306 :         move16();
    1185     1016306 :         mem_fx[2] = Vu[1];
    1186     1016306 :         move16();
    1187     1016306 :         *out1++ = mem_fx[3];
    1188     1016306 :         move16();
    1189             : 
    1190             :         /* Middle branch */
    1191             :         /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
    1192             :         Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
    1193             :         mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
    1194     1016306 :         Vm[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[3], sub_sat( input_fx_temp[i], mem_fx[4] ) ) );
    1195     1016306 :         move16();
    1196     1016306 :         Vm[1] = add_sat( mem_fx[4], mult_r_sat( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
    1197     1016306 :         move16();
    1198     1016306 :         mem_fx[6] = add_sat( mem_fx[5], mult_r_sat( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
    1199     1016306 :         move16();
    1200     1016306 :         mem_fx[4] = Vm[0];
    1201     1016306 :         move16();
    1202     1016306 :         mem_fx[5] = Vm[1];
    1203     1016306 :         move16();
    1204     1016306 :         *out1++ = mem_fx[6];
    1205     1016306 :         move16();
    1206             : 
    1207             :         /* Lower branch */
    1208             :         /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
    1209             :         Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
    1210             :         mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
    1211     1016306 :         Vl[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[6], sub_sat( input_fx_temp[i], mem_fx[7] ) ) );
    1212     1016306 :         move16();
    1213     1016306 :         Vl[1] = add_sat( mem_fx[7], mult_r_sat( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
    1214     1016306 :         move16();
    1215     1016306 :         mem_fx[9] = add_sat( mem_fx[8], mult_r_sat( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
    1216     1016306 :         move16();
    1217     1016306 :         mem_fx[0] = input_fx_temp[i];
    1218     1016306 :         move16();
    1219     1016306 :         mem_fx[7] = Vl[0];
    1220     1016306 :         move16();
    1221     1016306 :         mem_fx[8] = Vl[1];
    1222     1016306 :         move16();
    1223     1016306 :         *out1++ = mem_fx[9];
    1224     1016306 :         move16();
    1225             :     }
    1226             : 
    1227             :     /* loop_len = len*3/2 */
    1228        1603 :     loop_len = shr( i_mult( len, 3 ), 1 );
    1229             : 
    1230             :     /*decimate by 2 and LPF*/
    1231     1526062 :     FOR( i = 0; i < loop_len; i++ )
    1232             :     {
    1233     1524459 :         mem_temp = out1_buff[shl( i, 1 )];
    1234     1524459 :         move16();
    1235     1524459 :         out_fx[i] = add_sat( mult_r_sat( 1550 /* 0.0473147f Q15*/, add_sat( mem_temp, mem_fx[10] ) ), mult_r_sat( -4965 /*-0.151521f Q15*/, add_sat( mem_fx[11], mem_fx[14] ) ) );
    1236     1524459 :         out_fx[i] = add_sat( out_fx[i], mult_r_sat( 20125 /*0.614152f Q15*/, add_sat( mem_fx[12], mem_fx[13] ) ) );
    1237     1524459 :         mem_fx[10] = mem_fx[11];
    1238     1524459 :         move16();
    1239     1524459 :         mem_fx[11] = mem_fx[12];
    1240     1524459 :         move16();
    1241     1524459 :         mem_fx[12] = mem_fx[13];
    1242     1524459 :         move16();
    1243     1524459 :         mem_fx[13] = mem_fx[14];
    1244     1524459 :         move16();
    1245     1524459 :         mem_fx[14] = mem_temp;
    1246     1524459 :         move16();
    1247             :     }
    1248        1603 :     Scale_sig( out_fx, i_mult( 3, shr( len, 1 ) ), -s );
    1249        1603 :     Scale_sig( mem_fx, INTERP_3_2_MEM_LEN, -s );
    1250        1603 :     return;
    1251             : }
    1252             : 
    1253             : 
    1254             : /*-------------------------------------------------------------------*
    1255             :  * interpolate_3_over_1_allpass_fx()
    1256             :  *
    1257             :  * Interpolate 3/1 using allpass iir polyphase filter. Delay 4 samples @48k
    1258             :  *-------------------------------------------------------------------*/
    1259             : 
    1260        3295 : void ivas_interpolate_3_over_1_allpass_fx(
    1261             :     const Word16 *input_fx,
    1262             :     /* i  : input signal            */ /* Q_input */
    1263             :     const Word16 len,                  /* i  : number of input samples */
    1264             :     Word16 *out_fx,
    1265             :     /* o  : output signal           */                /* Q_input */
    1266             :     Word16 *mem_fx /* i/o: memory                  */ /* Q_input */
    1267             : )
    1268             : {
    1269             :     /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
    1270             :     Word16 i;
    1271             :     Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
    1272             :     Word16 *out1;
    1273             :     Word16 mem_temp;
    1274        3295 :     const Word16 *filt_coeff_fx = allpass_poles_3_ov_2;
    1275             : 
    1276        3295 :     out1 = &out_fx[0];
    1277             : 
    1278     1057695 :     FOR( i = 0; i < len; i++ )
    1279             :     {
    1280             :         /* Upper branch */
    1281             :         /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
    1282             :         Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
    1283             :         mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
    1284             : 
    1285     1054400 :         Vu[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[0], sub_sat( input_fx[i], mem_fx[1] ) ) );
    1286     1054400 :         move16(); /* all Vu's in : Q_current*/
    1287     1054400 :         Vu[1] = add_sat( mem_fx[1], mult_r( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
    1288     1054400 :         move16();
    1289     1054400 :         mem_fx[3] = add_sat( mem_fx[2], mult_r( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
    1290     1054400 :         move16();
    1291             : 
    1292             : 
    1293     1054400 :         mem_fx[1] = Vu[0];
    1294     1054400 :         move16();
    1295     1054400 :         mem_fx[2] = Vu[1];
    1296     1054400 :         move16();
    1297     1054400 :         *out1++ = mem_fx[3];
    1298     1054400 :         move16();
    1299             : 
    1300             :         /* Middle branch */
    1301             :         /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
    1302             :         Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
    1303             :         mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
    1304     1054400 :         Vm[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[3], sub_sat( input_fx[i], mem_fx[4] ) ) );
    1305     1054400 :         move16();
    1306     1054400 :         Vm[1] = add_sat( mem_fx[4], mult_r( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
    1307     1054400 :         move16();
    1308     1054400 :         mem_fx[6] = add_sat( mem_fx[5], mult_r( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
    1309     1054400 :         move16();
    1310             : 
    1311     1054400 :         mem_fx[4] = Vm[0];
    1312     1054400 :         move16();
    1313     1054400 :         mem_fx[5] = Vm[1];
    1314     1054400 :         move16();
    1315     1054400 :         *out1++ = mem_fx[6];
    1316     1054400 :         move16();
    1317             : 
    1318             :         /* Lower branch */
    1319             :         /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
    1320             :         Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
    1321             :         mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
    1322     1054400 :         Vl[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[6], sub_sat( input_fx[i], mem_fx[7] ) ) );
    1323     1054400 :         move16();
    1324     1054400 :         Vl[1] = add_sat( mem_fx[7], mult_r( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
    1325     1054400 :         move16();
    1326     1054400 :         mem_fx[9] = add_sat( mem_fx[8], mult_r( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
    1327     1054400 :         move16();
    1328             : 
    1329     1054400 :         mem_fx[0] = input_fx[i];
    1330     1054400 :         move16();
    1331     1054400 :         mem_fx[7] = Vl[0];
    1332     1054400 :         move16();
    1333     1054400 :         mem_fx[8] = Vl[1];
    1334     1054400 :         move16();
    1335     1054400 :         *out1++ = mem_fx[9];
    1336     1054400 :         move16();
    1337             :     }
    1338             :     /*LPF*/
    1339     3166495 :     FOR( i = 0; i < len * 3; i++ )
    1340             :     {
    1341     3163200 :         mem_temp = out_fx[i];
    1342     3163200 :         move16();
    1343     3163200 :         out_fx[i] = sub_sat( mult_r( 18768 /*0.57276865021499168f Q15*/, add_sat( mem_fx[12], mem_fx[11] ) ), mult_r( 2425 /*0.074004974641176793f Q15*/, add_sat( mem_temp, mem_fx[10] ) ) );
    1344     3163200 :         mem_fx[10] = mem_fx[11];
    1345     3163200 :         move16();
    1346     3163200 :         mem_fx[11] = mem_fx[12];
    1347     3163200 :         move16();
    1348     3163200 :         mem_fx[12] = mem_temp;
    1349     3163200 :         move16();
    1350             :     }
    1351        3295 :     return;
    1352             : }
    1353             : 
    1354       50072 : void interpolate_3_over_1_allpass_fx(
    1355             :     const Word16 *input_fx,
    1356             :     /* i  : input signal            */ /* Q_input */
    1357             :     const Word16 len,                  /* i  : number of input samples */
    1358             :     Word16 *out_fx,
    1359             :     /* o  : output signal           */                /* Q_input */
    1360             :     Word16 *mem_fx /* i/o: memory                  */ /* Q_input */
    1361             : )
    1362             : {
    1363             :     /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
    1364             :     Word16 i;
    1365             :     Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
    1366             :     Word16 *out1;
    1367             :     Word16 mem_temp;
    1368       50072 :     const Word16 *filt_coeff_fx = allpass_poles_3_ov_2; // Q15
    1369             : 
    1370       50072 :     out1 = &out_fx[0];
    1371             : 
    1372     4055832 :     FOR( i = 0; i < len; i++ )
    1373             :     {
    1374             :         /* Upper branch */
    1375             :         /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
    1376             :         Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
    1377             :         mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
    1378             : 
    1379     4005760 :         Vu[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[0], sub_sat( input_fx[i], mem_fx[1] ) ) );
    1380     4005760 :         move16(); /* all Vu's in : Q_current*/
    1381     4005760 :         Vu[1] = add_sat( mem_fx[1], mult_r( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
    1382     4005760 :         move16();
    1383     4005760 :         mem_fx[3] = add_sat( mem_fx[2], mult_r( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
    1384     4005760 :         move16();
    1385             : 
    1386             : 
    1387     4005760 :         mem_fx[1] = Vu[0];
    1388     4005760 :         move16();
    1389     4005760 :         mem_fx[2] = Vu[1];
    1390     4005760 :         move16();
    1391     4005760 :         *out1++ = mem_fx[3];
    1392     4005760 :         move16();
    1393             : 
    1394             :         /* Middle branch */
    1395             :         /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
    1396             :         Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
    1397             :         mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
    1398     4005760 :         Vm[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[3], sub_sat( input_fx[i], mem_fx[4] ) ) );
    1399     4005760 :         move16();
    1400     4005760 :         Vm[1] = add_sat( mem_fx[4], mult_r( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
    1401     4005760 :         move16();
    1402     4005760 :         mem_fx[6] = add_sat( mem_fx[5], mult_r( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
    1403     4005760 :         move16();
    1404             : 
    1405     4005760 :         mem_fx[4] = Vm[0];
    1406     4005760 :         move16();
    1407     4005760 :         mem_fx[5] = Vm[1];
    1408     4005760 :         move16();
    1409     4005760 :         *out1++ = mem_fx[6];
    1410     4005760 :         move16();
    1411             : 
    1412             :         /* Lower branch */
    1413             :         /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
    1414             :         Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
    1415             :         mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
    1416     4005760 :         Vl[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[6], sub_sat( input_fx[i], mem_fx[7] ) ) );
    1417     4005760 :         move16();
    1418     4005760 :         Vl[1] = add_sat( mem_fx[7], mult_r( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
    1419     4005760 :         move16();
    1420     4005760 :         mem_fx[9] = add_sat( mem_fx[8], mult_r( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
    1421     4005760 :         move16();
    1422             : 
    1423     4005760 :         mem_fx[0] = input_fx[i];
    1424     4005760 :         move16();
    1425     4005760 :         mem_fx[7] = Vl[0];
    1426     4005760 :         move16();
    1427     4005760 :         mem_fx[8] = Vl[1];
    1428     4005760 :         move16();
    1429     4005760 :         *out1++ = mem_fx[9];
    1430     4005760 :         move16();
    1431             :     }
    1432             :     /*LPF*/
    1433    12067352 :     FOR( i = 0; i < len * 3; i++ )
    1434             :     {
    1435    12017280 :         mem_temp = out_fx[i];
    1436    12017280 :         move16();
    1437    12017280 :         out_fx[i] = sub_sat( mult_r( 18768 /*0.57276865021499168f Q15*/, add_sat( mem_fx[12], mem_fx[11] ) ), mult_r( 2425 /*0.074004974641176793f Q15*/, add_sat( mem_temp, mem_fx[10] ) ) );
    1438    12017280 :         mem_fx[10] = mem_fx[11];
    1439    12017280 :         move16();
    1440    12017280 :         mem_fx[11] = mem_fx[12];
    1441    12017280 :         move16();
    1442    12017280 :         mem_fx[12] = mem_temp;
    1443    12017280 :         move16();
    1444             :     }
    1445       50072 :     return;
    1446             : }
    1447             : 
    1448             : 
    1449             : /*-------------------------------------------------------------------*
    1450             :  * decimate_3_over_2_allpass_fx()
    1451             :  *
    1452             :  * Decimate 2/3 using allpass iir polyphase filter. Delay 4 samples @48k
    1453             :  *-------------------------------------------------------------------*/
    1454             : 
    1455      129010 : void decimate_2_over_3_allpass_fx(
    1456             :     const Word16 *input,
    1457             :     /* i  : input signal            */ /* Q_input */
    1458             :     const Word16 len,                  /* i  : number of input samples */
    1459             :     Word16 *out_fx,
    1460             :     /* o  : output signal           */ /* Q_input */
    1461             :     Word16 *mem_fx,
    1462             :     /* i/o: memory                  */ /* Q_input */
    1463             :     const Word16 *filt_coeff_fx,
    1464             :     /* i  : filter coefficients     */ /* Q15*/
    1465             :     const Word16 *lp_num_fx,           /* i  : Num Coefficients : Q15 */
    1466             :     const Word16 *lp_den_fx,           /* o  : Den Coefficients : Q15 */
    1467             :     Word16 *lp_mem_fx                  /* o  : Filter memories  : Q_input */
    1468             : )
    1469             : {
    1470             : 
    1471             :     Word16 i, loop_len;
    1472             :     Word16 Vu1, Vm1, Vl1;             /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
    1473      129010 :     Word16 Vu0 = 0, Vm0 = 0, Vl0 = 0; /* initialize just to avoid compiler warnings */
    1474             :     Word16 out1_buff[L_FRAME48k * 2];
    1475             :     Word16 *out1, *in;
    1476             :     Word16 out, tmp;
    1477             :     Word16 mem_fx_11, mem_fx_7, mem_fx_3;
    1478             :     Word16 sc, input_fx[960];
    1479      129010 :     sc = s_min( s_min( sub( Find_Max_Norm16( input, len ), 2 ), sub( Find_Max_Norm16( mem_fx, 12 ), 2 ) ), sub( Find_Max_Norm16( lp_mem_fx, 3 ), 2 ) );
    1480      129010 :     Scale_sig( lp_mem_fx, 3, sc );
    1481      129010 :     Copy_Scale_sig( input, input_fx, len, sc );
    1482      129010 :     Scale_sig( mem_fx, 12, sc );
    1483      129010 :     out1 = out1_buff;
    1484             :     /* *out1++ = lp_num[0] * ( input[0] + lp_mem[0] ) - lp_den[2] * lp_mem[2]; */
    1485      129010 :     *out1++ = msu_r( L_mult( lp_num_fx[0], add( input_fx[0], lp_mem_fx[0] ) ), lp_den_fx[2], lp_mem_fx[2] );
    1486      129010 :     move16();
    1487             :     /* *out1++ = lp_num[1] * input[0] - lp_den[2] * lp_mem[1]; */
    1488      129010 :     *out1++ = msu_r( L_mult( lp_num_fx[1], input_fx[0] ), lp_den_fx[2], lp_mem_fx[1] );
    1489      129010 :     move16();
    1490             : 
    1491   113292000 :     FOR( i = 1; i < len; i++ )
    1492             :     {
    1493             :         /* tmp = lp_num[0] * ( input[i] + input[i-1] ) - lp_den[2] * out1[-2];
    1494             :          *out1++ = tmp; */
    1495   113162990 :         tmp = msu_r( L_mult( lp_num_fx[0], add( input_fx[i], input_fx[i - 1] ) ), lp_den_fx[2], out1[-2] );
    1496   113162990 :         *out1++ = tmp;
    1497   113162990 :         move16();
    1498             :         /* tmp = lp_num[1] * input[i] - lp_den[2] * out1[-2];
    1499             :          *out1++ = tmp; */
    1500   113162990 :         tmp = msu_r( L_mult( lp_num_fx[1], input_fx[i] ), lp_den_fx[2], out1[-2] );
    1501   113162990 :         *out1++ = tmp;
    1502   113162990 :         move16();
    1503             :     }
    1504      129010 :     lp_mem_fx[0] = input_fx[len - 1];
    1505      129010 :     move16();
    1506      129010 :     lp_mem_fx[1] = out1[-1];
    1507      129010 :     move16();
    1508      129010 :     lp_mem_fx[2] = out1[-2];
    1509      129010 :     move16();
    1510             : 
    1511             :     /* do the all pass polyphase filter with pi/3 cutoff */
    1512      129010 :     out1 = out_fx;
    1513      129010 :     in = out1_buff;
    1514             :     /* loop_len = len*2/3 */
    1515      129010 :     loop_len = shl( len, 1 ) / 3; /* Replace with a better way to divide by 3 when len is divisible by 3 */
    1516             : 
    1517      129010 :     assert( loop_len > 0 );
    1518             : 
    1519      129010 :     mem_fx_11 = mem_fx[11];
    1520      129010 :     move16();
    1521      129010 :     mem_fx_7 = mem_fx[7];
    1522      129010 :     move16();
    1523      129010 :     mem_fx_3 = mem_fx[3];
    1524      129010 :     move16();
    1525    75657010 :     FOR( i = 0; i < loop_len; i++ )
    1526             :     {
    1527             :         /* Lower branch */
    1528             :         /*Vl0 = mem[8] + filt_coeff[6] * (*in - mem[9]);
    1529             :           Vl1 = mem[9] + filt_coeff[7] * (Vl0 - mem[10]);
    1530             :           mem[11] = mem[10] + filt_coeff[8] * (Vl1 - mem[11]); */
    1531    75528000 :         tmp = mult_r( filt_coeff_fx[6], sub( *in++, mem_fx[9] ) );
    1532    75528000 :         if ( i == 0 )
    1533             :         {
    1534      129010 :             Vl0 = add( mem_fx[8], tmp );
    1535             :         }
    1536    75528000 :         if ( i != 0 )
    1537             :         {
    1538    75398990 :             Vl0 = add( *( in - 4 ), tmp );
    1539             :         }
    1540    75528000 :         Vl1 = add( mem_fx[9], mult_r( filt_coeff_fx[7], sub( Vl0, mem_fx[10] ) ) );
    1541    75528000 :         mem_fx_11 = add( mem_fx[10], mult_r( filt_coeff_fx[8], sub( Vl1, mem_fx_11 ) ) );
    1542             : 
    1543             :         /* mem[8] = *in++;
    1544             :           mem[9] = Vl0;
    1545             :           mem[10] = Vl1;
    1546             :           *out1 = mem[11]; */
    1547             : 
    1548    75528000 :         mem_fx[9] = Vl0;
    1549    75528000 :         move16();
    1550    75528000 :         mem_fx[10] = Vl1;
    1551    75528000 :         move16();
    1552             : 
    1553             :         /* Middle branch */
    1554             :         /* Vm0 = mem[4] + filt_coeff[3] * (*in - mem[5]);
    1555             :            Vm1 = mem[5] + filt_coeff[4] * (Vm0-mem[6]);
    1556             :            mem[7] = mem[6] + filt_coeff[5] * (Vm1-mem[7]); */
    1557    75528000 :         tmp = mult_r( filt_coeff_fx[3], sub( *in++, mem_fx[5] ) );
    1558    75528000 :         if ( i == 0 )
    1559             :         {
    1560      129010 :             Vm0 = add( mem_fx[4], tmp );
    1561             :         }
    1562    75528000 :         if ( i != 0 )
    1563             :         {
    1564    75398990 :             Vm0 = add( *( in - 4 ), tmp );
    1565             :         }
    1566    75528000 :         Vm1 = add( mem_fx[5], mult_r( filt_coeff_fx[4], sub( Vm0, mem_fx[6] ) ) );
    1567    75528000 :         mem_fx_7 = add( mem_fx[6], mult_r( filt_coeff_fx[5], sub( Vm1, mem_fx_7 ) ) );
    1568             : 
    1569    75528000 :         mem_fx[5] = Vm0;
    1570    75528000 :         move16();
    1571    75528000 :         mem_fx[6] = Vm1;
    1572    75528000 :         move16();
    1573    75528000 :         out = add( mem_fx_11, mem_fx_7 );
    1574             : 
    1575             :         /* Upper branch */
    1576             :         /* Vu0 = mem[0] + filt_coeff[0] * ( *in - mem[1] );
    1577             :            Vu1 = mem[1] + filt_coeff[1] * ( Vu0 - mem[2] );
    1578             :            mem[3] = mem[2] + filt_coeff[2] * ( Vu1 - mem[3] ); */
    1579    75528000 :         tmp = mult_r( filt_coeff_fx[0], sub( *in++, mem_fx[1] ) );
    1580    75528000 :         if ( i == 0 )
    1581             :         {
    1582      129010 :             Vu0 = add( mem_fx[0], tmp );
    1583             :         }
    1584    75528000 :         if ( i != 0 )
    1585             :         {
    1586    75398990 :             Vu0 = add( *( in - 4 ), tmp );
    1587             :         }
    1588    75528000 :         Vu1 = add( mem_fx[1], mult_r( filt_coeff_fx[1], sub( Vu0, mem_fx[2] ) ) );
    1589    75528000 :         mem_fx_3 = add( mem_fx[2], mult_r( filt_coeff_fx[2], sub( Vu1, mem_fx_3 ) ) );
    1590             : 
    1591    75528000 :         mem_fx[1] = Vu0;
    1592    75528000 :         move16();
    1593    75528000 :         mem_fx[2] = Vu1;
    1594    75528000 :         move16();
    1595    75528000 :         *out1++ = add( out, mem_fx_3 );
    1596    75528000 :         move16();
    1597             :     }
    1598      129010 :     mem_fx[8] = *( in - 3 );
    1599      129010 :     move16();
    1600      129010 :     mem_fx[4] = *( in - 2 );
    1601      129010 :     move16();
    1602      129010 :     mem_fx[0] = *( in - 1 );
    1603      129010 :     move16();
    1604      129010 :     mem_fx[11] = mem_fx_11;
    1605      129010 :     move16();
    1606      129010 :     mem_fx[7] = mem_fx_7;
    1607      129010 :     move16();
    1608      129010 :     mem_fx[3] = mem_fx_3;
    1609      129010 :     move16();
    1610             : 
    1611      129010 :     Scale_sig( mem_fx, 12, negate( sc ) );
    1612      129010 :     Scale_sig( out_fx, loop_len, negate( sc ) );
    1613      129010 :     Scale_sig( lp_mem_fx, 3, negate( sc ) );
    1614      129010 :     return;
    1615             : }
    1616             : 
    1617             : 
    1618             : /*-------------------------------------------------------------------*
    1619             :  * retro_interp4_5_fx()
    1620             :  *
    1621             :  *
    1622             :  *-------------------------------------------------------------------*/
    1623             : 
    1624         522 : void retro_interp4_5_fx(
    1625             :     const Word16 *syn_fx,
    1626             :     Word16 *pst_old_syn_fx )
    1627             : {
    1628             :     Word16 *pf5, *pf4;
    1629             :     Word16 c;
    1630             : 
    1631             :     /* resample st->pst_old_syn in a reverse way to preserve time-alignment */
    1632         522 :     pf4 = (Word16 *) &pst_old_syn_fx[58];
    1633         522 :     pf5 = (Word16 *) pst_old_syn_fx;
    1634       30276 :     FOR( c = 0; c < 57; c++ )
    1635             :     {
    1636       29754 :         *pf5++ = pf4[0];
    1637       29754 :         move16();
    1638             :         /* *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; */
    1639       29754 :         *pf5++ = mac_r( L_mult( 6554, pf4[0] ), 26214, pf4[1] );
    1640       29754 :         move16();
    1641             :         /* *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; */
    1642       29754 :         *pf5++ = mac_r( L_mult( 13107, pf4[1] ), 19661, pf4[2] );
    1643       29754 :         move16();
    1644             :         /* *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; */
    1645       29754 :         *pf5++ = mac_r( L_mult( 19661, pf4[2] ), 13107, pf4[3] );
    1646       29754 :         move16();
    1647             :         /* *pf5++ = 0.8f * pf4[3] + 0.2f * pf4[4]; */
    1648       29754 :         *pf5++ = mac_r( L_mult( 26214, pf4[3] ), 6554, pf4[4] );
    1649       29754 :         move16();
    1650       29754 :         pf4 += 4;
    1651             :     }
    1652         522 :     *pf5++ = pf4[0];
    1653         522 :     move16();
    1654             :     /* *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; */
    1655         522 :     *pf5++ = mac_r( L_mult( 6554, pf4[0] ), 26214, pf4[1] );
    1656         522 :     move16();
    1657             :     /* *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; */
    1658         522 :     *pf5++ = mac_r( L_mult( 13107, pf4[1] ), 19661, pf4[2] );
    1659         522 :     move16();
    1660             :     /* *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; */
    1661         522 :     *pf5++ = mac_r( L_mult( 19661, pf4[2] ), 13107, pf4[3] );
    1662         522 :     move16();
    1663             :     /* *pf5++ = 0.8f * pf4[3] + 0.2f * syn[0]; */
    1664         522 :     *pf5++ = mac_r( L_mult( 26214, pf4[3] ), 6554, syn_fx[0] );
    1665         522 :     move16();
    1666             :     /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */
    1667             : 
    1668         522 :     return;
    1669             : }
    1670             : 
    1671             : 
    1672             : /*-------------------------------------------------------------------*
    1673             :  * retro_interp5_4_fx()
    1674             :  *
    1675             :  *
    1676             :  *-------------------------------------------------------------------*/
    1677             : 
    1678        1086 : void retro_interp5_4_fx(
    1679             :     Word16 *pst_old_syn_fx )
    1680             : {
    1681             :     Word16 *pf5, *pf4;
    1682             :     Word16 c;
    1683             : 
    1684             :     /* resample st->pst_old_syn in a reverse way to preserve time-alignment */
    1685        1086 :     pf4 = (Word16 *) &pst_old_syn_fx[NBPSF_PIT_MAX - 1];
    1686        1086 :     pf5 = pf4;
    1687       64074 :     FOR( c = 0; c < 58; c++ )
    1688             :     {
    1689             :         /* *pf4-- = 0.75f * pf5[0] + 0.25f * pf5[-1]; */
    1690       62988 :         *pf4-- = mac_r( L_mult( 24576, pf5[0] ), 8192, pf5[-1] );
    1691       62988 :         move16();
    1692             :         /* *pf4-- = 0.50f * pf5[-1] + 0.50f * pf5[-2]; */
    1693       62988 :         *pf4-- = mac_r( L_mult( 16384, pf5[-1] ), 16384, pf5[-2] );
    1694       62988 :         move16();
    1695             :         /* *pf4-- = 0.25f * pf5[-2] + 0.75f * pf5[-3]; */
    1696       62988 :         *pf4-- = mac_r( L_mult( 8192, pf5[-2] ), 24576, pf5[-3] );
    1697       62988 :         move16();
    1698       62988 :         *pf4-- = pf5[-4];
    1699       62988 :         move16();
    1700       62988 :         pf5 -= 5;
    1701             :     }
    1702             :     /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */
    1703             : 
    1704        1086 :     return;
    1705             : }

Generated by: LCOV version 1.14