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

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include "options.h" /* Compilation switches                  */
       6             : #include "prot_fx.h" /* Function prototypes                    */
       7             : #include "rom_com.h" /* Function prototypes                    */
       8             : #include "stl.h"
       9             : 
      10         165 : void sinq_fx(
      11             :     const Word16 tmp, /* i  : sinus factor cos(tmp*i+phi)  Q15*/
      12             :     const Word16 phi, /* i  : sinus phase cos(tmp*i+phi)  Q15*/
      13             :     const Word16 N,   /* i  : size of output */
      14             :     Word16 x[]        /* o  : output vector  Q15*/
      15             : )
      16             : {
      17             :     Word16 i;
      18             :     Word16 tmp1, tmp2;
      19             :     Word32 L_tmp, A32, tmp_old, tmp_old_old;
      20             : 
      21             : 
      22         165 :     x[0] = phi;
      23         165 :     move16();                          /*sin(x) approximated by x; Q15 */
      24         165 :     tmp1 = add( tmp, phi );            /*Q15 */
      25         165 :     L_tmp = L_mult( tmp1, tmp1 );      /*Q31 */
      26         165 :     L_tmp = Mult_32_16( L_tmp, tmp1 ); /*Q31 */
      27         165 :     L_tmp = Mult_32_16( L_tmp, 5461 ); /*Q31; division by 6 */
      28         165 :     tmp2 = round_fx( L_tmp );          /*Q15 */
      29         165 :     x[1] = sub( tmp1, tmp2 );
      30         165 :     move16();                                 /* sin(x) approximated by (x-x^3/3!); Q15 */
      31         165 :     tmp1 = add_sat( shl_sat( tmp, 1 ), phi ); /*Q15 */
      32         165 :     L_tmp = L_mult( tmp1, tmp1 );             /*Q31 */
      33         165 :     L_tmp = Mult_32_16( L_tmp, tmp1 );        /*Q31 */
      34         165 :     L_tmp = Mult_32_16( L_tmp, 5461 );        /*Q31; division by 6 */
      35         165 :     tmp2 = round_fx( L_tmp );                 /*Q15 */
      36         165 :     x[2] = sub( tmp1, tmp2 );
      37         165 :     move16(); /* sin(x) approximated by (x-x^3/3!); Q15 */
      38             : 
      39             : 
      40         165 :     IF( GT_16( abs_s( tmp ), 3 ) )
      41             :     {
      42             :         /*A=(x[2]+x[0])/x[1]=2*cos(tmp); here approximated by 2*(1-tmp^2/2!)  */
      43         165 :         A32 = L_mult0( tmp, tmp );                                               /*Q30 */
      44         165 :         A32 = L_add( L_sub( 1073741824 /*1.Q30*/, A32 ), 1073741824 /*1.Q30*/ ); /*Q30 */
      45             :     }
      46             :     ELSE
      47             :     {
      48           0 :         A32 = L_deposit_l( 0 );
      49             :     }
      50             : 
      51         165 :     tmp_old = L_deposit_h( x[2] );     /*Q31 */
      52         165 :     tmp_old_old = L_deposit_h( x[1] ); /*Q31 */
      53             : 
      54       11942 :     FOR( i = 3; i < N; i++ )
      55             :     {
      56             :         /*L_tmp = Mult_32_16(A32,(*pt1++)); //30+15-15+1=Q31 */
      57             :         /* x[i] = shl(sub(round_fx(L_tmp), shr((*pt2++),1)),1); move16(); //Q15  */
      58       11777 :         L_tmp = Mult_32_32( A32, tmp_old );              /*Q30 */
      59       11777 :         L_tmp = L_sub( L_tmp, L_shr( tmp_old_old, 1 ) ); /*Q30 */
      60       11777 :         tmp_old_old = L_add( tmp_old, 0 );               /*Q31   */
      61       11777 :         tmp_old = L_shl_sat( L_tmp, 1 );                 /*Q31   */
      62       11777 :         x[i] = round_fx_sat( tmp_old );                  /*Q15 */
      63       11777 :         move16();
      64             :     }
      65             : 
      66         165 :     return;
      67             : }
      68             : 
      69             : /*--------------------------------------------------------------------------*/
      70             : /*  Function  Window_Ola                                                    */
      71             : /*  ~~~~~~~~~~~~~~~~~~~~                                                    */
      72             : /*                                                                          */
      73             : /*  Windowing, Overlap and Add                                              */
      74             : /*--------------------------------------------------------------------------*/
      75             : /*  Word32    ImdctOut[]  (i)   input                                       */
      76             : /*  Word32    auOut[]     (o)   output audio                                */
      77             : /*  Word16    Q_sig       (i/o) Q of Input and Output Signal                */
      78             : /*  Word32    OldauOut[]  (i/o) audio from previous frame                   */
      79             : /*  Word16    Q_old       (i/o)   Q for audio from previous frame             */
      80             : /*  Word16    L           (i)   length                                      */
      81             : /*--------------------------------------------------------------------------*/
      82             : 
      83     1780848 : void window_ola_fx(
      84             :     Word32 *wtda_audio,
      85             :     Word16 *auOut,
      86             :     Word16 *Q_sig, /* in Q IMDCT /out  auOut */
      87             :     Word16 *OldauOut,
      88             :     Word16 *Q_old, /* in/out Q OldauOut */
      89             :     const Word16 L,
      90             :     const Word16 right_mode,
      91             :     const Word16 left_mode, /* window overlap of current frame (0: full, 2: none, or 3: half) */
      92             :     const Word16 use_bfi_win,
      93             :     const Word16 oldHqVoicing,
      94             :     Word16 *oldgapsynth )
      95             : {
      96             :     Word16 i, decimate, decay, temp, temp_len;
      97             :     Word16 n, windecay48;
      98             :     Word16 win_right[R2_48];
      99             :     Word16 win_int_left[R1_16];
     100             :     Word16 win_left[R1_48];
     101             :     Word16 win_int_right[R2_16];
     102             :     Word16 *p1, *p2, *p3, *p4, *p5, *paout;
     103             :     Word32 *pa;
     104             :     Word32 ImdctOut[2 * L_FRAME48k]; /*for not to overwrite wtda_audio (ImdctOut) by the rescaling. If problem of max RAM, alternative solution is to output the new Q value of ImdctOut after rescaling */
     105             :     Word16 SS2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )];
     106             :     Word16 wret2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )];
     107             :     Word16 tmp2;
     108             : 
     109             :     /* Windows loading */
     110     1780848 :     tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
     111             : 
     112     1780848 :     temp = Find_Max_Norm16( OldauOut, L );
     113     1780848 :     Copy_Scale_sig( OldauOut, OldauOut, L, temp );
     114     1780848 :     *Q_old = add( *Q_old, temp );
     115             : 
     116             :     /* need to rescale input (because ImdctOut not full scaled and cause issue in 16 bit conversion) */
     117     1780848 :     temp = sub( Find_Max_Norm32( wtda_audio, L ), 2 ); /* rescale to temp-1 because left shift after */
     118  1164830384 :     FOR( i = 0; i < L; i++ )
     119             :     {
     120  1163049536 :         ImdctOut[i] = L_shl( wtda_audio[i], temp );
     121  1163049536 :         move32();
     122             :     }
     123     1780848 :     *Q_sig = add( *Q_sig, temp );
     124     1780848 :     move16();
     125             : 
     126             : 
     127             :     /* rescaling for overlapp add */
     128     1780848 :     IF( GT_16( add( *Q_old, 15 ), *Q_sig ) )
     129             :     {
     130     1577155 :         Copy_Scale_sig( OldauOut, OldauOut, L, sub( *Q_sig, add( *Q_old, 15 ) ) );
     131     1577155 :         *Q_old = sub( *Q_sig, 15 );
     132     1577155 :         move16();
     133             :     }
     134      203693 :     ELSE IF( LT_16( add( *Q_old, 15 ), *Q_sig ) )
     135             :     {
     136       27925 :         Scale_sig32( ImdctOut, L, sub( add( *Q_old, 15 ), *Q_sig ) );
     137       27925 :         *Q_sig = add( *Q_old, 15 );
     138       27925 :         move16();
     139             :     }
     140             : 
     141     1780848 :     *Q_sig = *Q_old; /*fixing output to new Q_old */
     142     1780848 :     move16();
     143             : 
     144             : 
     145     1780848 :     decimate = 1;
     146     1780848 :     move16(); /* L_FRAME 48k */
     147     1780848 :     decay = 0;
     148     1780848 :     move16();
     149     1780848 :     windecay48 = WINDECAY48;
     150     1780848 :     move16();
     151     1780848 :     n = R1_48 - R2_48;
     152     1780848 :     move16();
     153             : 
     154     1780848 :     test();
     155     1780848 :     IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) )
     156             :     {
     157      914619 :         decimate = 3;
     158      914619 :         move16();
     159      914619 :         decay = 1;
     160      914619 :         move16();
     161      914619 :         n = R1_16 - R2_16;
     162      914619 :         move16();
     163             : 
     164      914619 :         if ( EQ_16( L, L_FRAME32k ) )
     165             :         {
     166      651009 :             n = 2 * N16_CORE_SW;
     167      651009 :             move16();
     168             :         }
     169             :     }
     170      866229 :     ELSE IF( EQ_16( L, L_FRAME8k ) )
     171             :     {
     172           0 :         decimate = 6;
     173           0 :         move16();
     174           0 :         decay = 2;
     175           0 :         move16();
     176           0 :         n = ( R1_16 - R2_16 ) / 2;
     177           0 :         move16();
     178             :     }
     179      866229 :     ELSE IF( EQ_16( L, 512 ) )
     180             :     {
     181      230149 :         windecay48 = WINDECAY48_256;
     182      230149 :         move16();
     183      230149 :         decimate = 1;
     184      230149 :         move16();
     185      230149 :         decay = 0;
     186      230149 :         move16();
     187      230149 :         n = R1_25 - R2_25;
     188      230149 :         move16();
     189             :     }
     190      636080 :     ELSE IF( EQ_16( L, 256 ) )
     191             :     {
     192       94353 :         windecay48 = WINDECAY48_256;
     193       94353 :         move16();
     194       94353 :         decimate = 2;
     195       94353 :         move16();
     196       94353 :         decay = 0;
     197       94353 :         move16();
     198       94353 :         n = ( R1_25 - R2_25 ) / 2;
     199       94353 :         move16();
     200             :     }
     201             : 
     202             : 
     203     1780848 :     paout = auOut - n;
     204             : 
     205     1780848 :     IF( EQ_16( use_bfi_win, 1 ) )
     206             :     {
     207             : 
     208           2 :         temp = sub( L, n );
     209             : 
     210           2 :         tmp2 = div_s( 1, temp );                                             /*Q15 */
     211           2 :         tmp2 = round_fx( L_shl( L_mult( tmp2, 25736 /*(pi/2).Q14*/ ), 2 ) ); /*Q15 */
     212             : 
     213           2 :         sinq_fx( shr( tmp2, 1 ), shr( tmp2, 2 ), temp, SS2 );
     214             : 
     215           2 :         IF( EQ_16( L, L_FRAME32k ) )
     216             :         {
     217           1 :             p4 = SS2 + sub( shr( L, 1 ), 1 );
     218           1 :             p1 = wret2 + sub( shr( L, 1 ), n );
     219           1 :             p2 = win_int_left + L_FRAME16k / 2 - 1;
     220           1 :             p3 = win_left + ( L_FRAME16k / 2 - 1 ) * 3 + 1;
     221             : 
     222           1 :             temp_len = shr( L, 1 );
     223         161 :             FOR( i = 0; i < temp_len; i += 2 )
     224             :             {
     225         160 :                 *p1++ = div_s( shr( *p4--, 5 ), add( *p2--, 10 ) );
     226         160 :                 move16();
     227         160 :                 *p1++ = div_s( shr( *p4--, 5 ), add( *p3, 10 ) ); /*Wret2 Q10 */
     228         160 :                 move16();
     229         160 :                 p3 -= decimate;
     230             :             }
     231           1 :             p4 = SS2 + sub( temp, 1 );
     232           1 :             p1 = wret2;
     233           1 :             p2 = win_left + ( L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1;
     234           1 :             p3 = win_int_left + ( L_FRAME16k - N16_CORE_SW - 1 );
     235             : 
     236           1 :             temp_len = sub( shr( L, 1 ), n );
     237          71 :             FOR( i = 0; i < temp_len; i += 2 )
     238             :             {
     239          70 :                 *p1++ = div_s( shr( *p4--, 5 ), *p2 );
     240          70 :                 move16();
     241          70 :                 *p1++ = div_s( shr( *p4--, 5 ), *p3-- );
     242          70 :                 move16();
     243          70 :                 p2 -= decimate;
     244             :             }
     245             :         }
     246             :         ELSE
     247             :         {
     248             : 
     249           1 :             p2 = win_left + add( i_mult2( sub( shr( L, 1 ), 1 ), decimate ), decay );
     250           1 :             p1 = wret2 + sub( shr( L, 1 ), n );
     251           1 :             p4 = SS2 + sub( shr( L, 1 ), 1 );
     252             : 
     253           1 :             temp_len = shr( L, 1 );
     254         161 :             FOR( i = 0; i < temp_len; i++ )
     255             :             {
     256         160 :                 *p1++ = div_s( shr( *p4--, 5 ), add( *p2, 10 ) ); /*Wret2 Q10 */
     257         160 :                 move16();
     258         160 :                 p2 -= decimate;
     259             :             }
     260             : 
     261           1 :             p1 = wret2;
     262           1 :             p4 = SS2 + sub( temp, 1 );
     263             : 
     264             : 
     265           1 :             p2 = win_left + sub( sub( i_mult2( sub( L, n ), decimate ), decay ), 1 );
     266           1 :             temp_len = sub( shr( L, 1 ), n );
     267          71 :             FOR( i = 0; i < temp_len; i++ )
     268             :             {
     269          70 :                 *p1++ = div_s( shr( *p4--, 5 ), *p2 );
     270          70 :                 move16();
     271          70 :                 p2 -= decimate;
     272             :             }
     273             :         }
     274             : 
     275             : 
     276           2 :         p1 = paout + n;
     277           2 :         pa = ImdctOut + add( shr( L, 1 ), n );
     278             : 
     279           2 :         temp_len = sub( shr( L, 1 ), n );
     280         212 :         FOR( i = 0; i < temp_len; i++ )
     281             :         {
     282         210 :             *p1++ = round_fx( L_shl( *pa++, 1 ) );
     283         210 :             move16();
     284             :         }
     285             : 
     286             :         /*p1=paout+shr(L,1);*/
     287           2 :         pa = ImdctOut + sub( L, 1 );
     288           2 :         temp_len = shr( L, 1 );
     289         482 :         FOR( i = 0; i < temp_len; i++ )
     290             :         {
     291         480 :             *p1++ = round_fx( L_negate( L_shl( *pa--, 1 ) ) );
     292         480 :             move16();
     293             :         }
     294             : 
     295             : 
     296           2 :         p1 = auOut;
     297           2 :         p2 = SS2;
     298             : 
     299           2 :         IF( oldHqVoicing )
     300             :         {
     301             :             /* rescale oldgapsynth */
     302           0 :             Copy_Scale_sig( oldgapsynth, oldgapsynth, L, *Q_sig );
     303           0 :             p3 = SS2 + sub( temp, 1 );
     304           0 :             p4 = oldgapsynth + n;
     305           0 :             FOR( i = 0; i < temp; i++ )
     306             :             {
     307           0 :                 *p1 = add( mult( *p1, *p2 ), mult( *p4, *p3 ) ); /*   auOut[i]*SS2[i]+ oldgapsynth[i+n]*(SS2[L-n-i-1]);*/
     308           0 :                 move16();
     309           0 :                 p1++;
     310           0 :                 p2++;
     311           0 :                 p3--;
     312           0 :                 p4++;
     313             :             }
     314           0 :             Copy_Scale_sig( oldgapsynth, oldgapsynth, L, -( *Q_sig ) );
     315             :         }
     316             :         ELSE
     317             :         {
     318           2 :             p3 = wret2;
     319           2 :             p4 = OldauOut + n;
     320         692 :             FOR( i = 0; i < temp; i++ )
     321             :             {
     322         690 :                 *p1 = add_sat( mult( *p1, *p2 ), shl_sat( mult( *p4, *p3 ), 5 ) ); /*auOut[i]*SS2[i]+ OldauOut[i+n]*(SS2[L-n-i-1])/(wret2[i]+0.01f);;*/
     323         690 :                 move16();
     324         690 :                 p1++;
     325         690 :                 p2++;
     326         690 :                 p3++;
     327         690 :                 p4++;
     328             :             }
     329             :         }
     330             :     }
     331             : 
     332     1780848 :     IF( EQ_16( L, L_FRAME32k ) )
     333             :     {
     334             : 
     335      651009 :         IF( use_bfi_win == 0 )
     336             :         {
     337             :             /*decimate=3 */
     338             :             /*decay=1 */
     339      651008 :             p1 = paout + n;
     340      651008 :             pa = ImdctOut + add( shr( L, 1 ), n );
     341             :             /*p3=win_right+       sub(sub(sub(i_mult2(sub(shl(L,1),n),decimate),1),decay),WINDECAY48); */
     342      651008 :             p3 = win_right + ( ( 2 * L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1 - WINDECAY48 );
     343      651008 :             p5 = win_int_right + ( ( 2 * L_FRAME16k - N16_CORE_SW ) - 1 - WINDECAY16 );
     344      651008 :             p4 = OldauOut + n;
     345             : 
     346      651008 :             temp_len = sub( shr( L, 1 ), n );
     347    46221568 :             FOR( i = 0; i < temp_len; i += 2 )
     348             :             {
     349    45570560 :                 *p1++ = round_fx_sat( L_add_sat( L_shl_sat( Mult_32_16( *pa++, *p3 ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     350    45570560 :                 p3 -= decimate;
     351    45570560 :                 *p1++ = round_fx_sat( L_add_sat( L_shl_sat( Mult_32_16( *pa++, *p5-- ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     352    45570560 :                 move16();
     353             :                 /*  paout[i] = ImdctOut[L/2 + i] * win_right[(2*L_FRAME16k-(n16+(i-n)/2))*decimate-1-decay-windecay48]+OldauOut[i];
     354             :                 paout[i+1] = ImdctOut[L/2 + i +1] * win_int_right[2*L_FRAME16k-(n16+(i-n)/2)-1-windecay16]+OldauOut[i+1];*/
     355             :             }
     356             : 
     357      651008 :             pa = ImdctOut + sub( L, 1 );
     358      651008 :             p3 = win_right + ( ( 3 * L_FRAME16k / 2 - 1 ) * 3 + 1 - WINDECAY48 );
     359      651008 :             p5 = win_int_right + ( ( 3 * L_FRAME16k / 2 ) - 1 - WINDECAY16 );
     360             : 
     361      651008 :             temp_len = sub( shr( L, 1 ), n );
     362    46221568 :             FOR( i = 0; i < temp_len; i += 2 )
     363             :             {
     364    45570560 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p5-- ), 1 ) ) ); /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     365    45570560 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p3 ), 1 ) ) );   /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     366    45570560 :                 move16();
     367    45570560 :                 p3 -= decimate;
     368             :                 /* paout[L/2 + i ] = -ImdctOut[L - 1 - i] * win_int_right[(3*L_FRAME16k/2-1-i/2)-windecay16]+OldauOut[i+L/2];
     369             :                 paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)] * win_right[(3*L_FRAME16k/2-1-i/2)*decimate+decay-windecay48]+OldauOut[i+L/2+1]; */
     370             :             }
     371    59241728 :             FOR( i = 0; i < n; i += 2 )
     372             :             {
     373    58590720 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
     374    58590720 :                 move16();
     375    58590720 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
     376    58590720 :                 move16();
     377             :                 /*  paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)]+OldauOut[i+L/2+1] ;
     378             :                 paout[L/2 + i ] = -ImdctOut[L - 1 - i]+OldauOut[i+L/2]; */
     379             :             }
     380             :         }
     381             : 
     382      651009 :         p1 = OldauOut + shr( L, 1 );
     383      651009 :         pa = ImdctOut;
     384      651009 :         p2 = win_int_left + L_FRAME16k / 2 - 1;
     385      651009 :         p3 = win_left + ( L_FRAME16k / 2 - 1 ) * 3 + 1;
     386             : 
     387      651009 :         temp_len = shr( L, 1 );
     388   104812449 :         FOR( i = 0; i < temp_len; i += 2 )
     389             :         {
     390   104161440 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2-- ), 1 ) ) );
     391   104161440 :             move16();
     392   104161440 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p3 ), 1 ) ) );
     393   104161440 :             move16();
     394   104161440 :             p3 -= decimate;
     395             :             /* OldauOut[L/2 + i] = -ImdctOut[i] * win_int_left[(L_FRAME16k/2-i/2-1)];
     396             :             OldauOut[L/2 + i +1] = -ImdctOut[i+1] * win_left[(L_FRAME16k/2-i/2-1)*decimate+decay]*/
     397             :             ;
     398             :         }
     399             : 
     400      651009 :         p1 = OldauOut + n;
     401      651009 :         pa = ImdctOut + sub( sub( shr( L, 1 ), 1 ), n );
     402      651009 :         p2 = win_left + ( L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1;
     403      651009 :         p3 = win_int_left + ( L_FRAME16k - N16_CORE_SW - 1 );
     404      651009 :         temp_len = sub( shr( L, 1 ), n );
     405    46221639 :         FOR( i = 0; i < temp_len; i += 2 )
     406             :         {
     407    45570630 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) );
     408    45570630 :             move16();
     409    45570630 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p3-- ), 1 ) ) );
     410    45570630 :             move16();
     411    45570630 :             p2 -= decimate;
     412             :             /*  OldauOut[ i] = -ImdctOut[L/2 - 1 - i]  *win_left[(L_FRAME16k-i/2)*decimate-decay-1];
     413             :             OldauOut[ i +1] = -ImdctOut[L/2 - 1 - (i +1)] * win_int_left[L_FRAME16k-(i/2)-1];; */
     414             :         }
     415             :     }
     416             :     ELSE
     417             :     {
     418     1129839 :         IF( use_bfi_win == 0 )
     419             :         {
     420             : 
     421     1129838 :             p1 = paout + n;
     422     1129838 :             pa = ImdctOut + add( shr( L, 1 ), n );
     423     1129838 :             p3 = win_right + sub( sub( sub( i_mult2( sub( shl( L, 1 ), n ), decimate ), 1 ), decay ), windecay48 );
     424     1129838 :             p4 = OldauOut + n;
     425             : 
     426     1129838 :             temp_len = sub( shr( L, 1 ), n );
     427   164405594 :             FOR( i = 0; i < temp_len; i++ )
     428             :             {
     429   163275756 :                 *p1++ = round_fx_sat( L_add_sat( L_shl( Mult_32_16( *pa++, *p3 ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     430   163275756 :                 move16();
     431   163275756 :                 p3 -= decimate;
     432             :                 /*paout[i] = ImdctOut[L/2 + i] * win_right[(2*L-i)*decimate-1-decay-windecay48]+OldauOut[i];*/
     433             :             }
     434             : 
     435             : 
     436     1129838 :             pa = ImdctOut + sub( L, 1 );
     437     1129838 :             p3 = win_right + sub( add( i_mult2( sub( i_mult2( shr( L, 1 ), 3 ), 1 ), decimate ), decay ), windecay48 );
     438     1129838 :             temp_len = sub( shr( L, 1 ), n );
     439   164405594 :             FOR( i = 0; i < temp_len; i++ )
     440             :             {
     441   163275756 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p3 ), 1 ) ) ); /* (( Qin + Q15 -15)+1  + ( Qin - 15 + 16))-1 */
     442   163275756 :                 move16();
     443   163275756 :                 p3 -= decimate;
     444             :                 /* paout[L/2 + i] = -ImdctOut[L - 1 - i] * win_right[(3*L/2-1-i)*decimate+decay-windecay48]+OldauOut[i+L/2]; */
     445             :             }
     446   211055810 :             FOR( i = 0; i < n; i++ )
     447             :             {
     448   209925972 :                 *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
     449   209925972 :                 move16();
     450             :                 /*  paout[L/2 + i] = -ImdctOut[L - 1 - i] + OldauOut[i+L/2]; */
     451             :             }
     452             :         }
     453             : 
     454             : 
     455     1129839 :         p1 = OldauOut + shr( L, 1 );
     456     1129839 :         pa = ImdctOut;
     457     1129839 :         p2 = win_left + add( i_mult2( sub( shr( L, 1 ), 1 ), decimate ), decay );
     458             : 
     459     1129839 :         temp_len = shr( L, 1 );
     460   374331727 :         FOR( i = 0; i < temp_len; i++ )
     461             :         {
     462   373201888 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2 ), 1 ) ) );
     463   373201888 :             move16();
     464   373201888 :             p2 -= decimate;
     465             :             /*OldauOut[L/2 + i] = -ImdctOut[i] * win_left[(L/2-i-1)*decimate+decay]; */
     466             :         }
     467             : 
     468     1129839 :         p1 = OldauOut + n;
     469     1129839 :         pa = ImdctOut + sub( sub( shr( L, 1 ), 1 ), n );
     470     1129839 :         p2 = win_left + sub( sub( i_mult2( sub( L, n ), decimate ), decay ), 1 );
     471     1129839 :         temp_len = sub( shr( L, 1 ), n );
     472   164405665 :         FOR( i = 0; i < temp_len; i++ )
     473             :         {
     474   163275826 :             *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) );
     475   163275826 :             move16();
     476   163275826 :             p2 -= decimate;
     477             :             /* OldauOut[ i] = -ImdctOut[L/2 - 1 - i] * win_left[(L-i)*decimate-decay-1]; */
     478             :         }
     479             :     }
     480             : 
     481     1780848 :     p1 = OldauOut;
     482     1780848 :     pa = ImdctOut + sub( shr( L, 1 ), 1 );
     483     1780848 :     p2 = paout + L;
     484             : 
     485   328888530 :     FOR( i = 0; i < n; i++ )
     486             :     {
     487   327107682 :         *p1 = round_fx( L_negate( L_shl( *pa--, 1 ) ) );
     488   327107682 :         move16();
     489   327107682 :         *p2++ = *p1++;
     490   327107682 :         move16();
     491             :     }
     492             : 
     493     1780848 :     return;
     494             : }
     495             : 
     496             : /*-------------------------------------------------------------------*
     497             :  * window_ola_ext_fx()
     498             :  *
     499             :  *
     500             :  *-------------------------------------------------------------------*/
     501             : 
     502        1578 : void window_ola_ext_fx(
     503             :     const Word32 *ImdstOut, /* i  : input Qx                      */
     504             :     Word32 *auOut,          /* o  : output audio Qx               */
     505             :     Word32 *OldauOut,       /* i/o: audio from previous frame Qx  */
     506             :     const Word16 L,         /* i  : length                      */
     507             :     const Word16 right_mode,
     508             :     const Word16 left_mode,   /* i  : window overlap of current frame (0: full, 2: none, or 3: half) */
     509             :     const UWord16 kernel_type /* i  : transform kernel type  */
     510             : )
     511             : {
     512             :     Word16 temp;
     513        1578 :     IF( s_and( kernel_type, 1 ) )
     514             :     {
     515        1110 :         temp = MAX_16;
     516             :     }
     517             :     ELSE
     518             :     {
     519         468 :         temp = MIN_16;
     520             :     }
     521        1578 :     move16();
     522             : 
     523        1578 :     const Word16 sign_left = temp;
     524        1578 :     move16();
     525             : 
     526        1578 :     IF( GE_16( kernel_type, MDCT_II ) )
     527             :     {
     528        1068 :         temp = MIN_16;
     529             :     }
     530             :     ELSE
     531             :     {
     532         510 :         temp = MAX_16;
     533             :     }
     534        1578 :     move16();
     535             : 
     536        1578 :     const Word16 sign_right = temp;
     537        1578 :     move16();
     538             : 
     539             :     Word16 i, decimate, decay;
     540             :     Word16 n, n16, windecay48, windecay16;
     541             :     Word16 win_right[R2_48];
     542             :     Word16 win_int_left[R1_16];
     543             :     Word16 win_left[R1_48];
     544             :     Word16 win_int_right[R2_16];
     545             :     Word32 *paout;
     546             : 
     547        1578 :     n = shr( mult( shl( L, Q5 ), N_ZERO_BY_FS ), Q5 ); // Q0
     548        1578 :     n16 = N16_CORE_SW;
     549        1578 :     move16();
     550        1578 :     windecay48 = WINDECAY48;
     551        1578 :     move16();
     552        1578 :     windecay16 = WINDECAY16;
     553        1578 :     move16();
     554        1578 :     decimate = 1;
     555        1578 :     move16();
     556        1578 :     decay = 0;
     557        1578 :     move16();
     558             : 
     559        1578 :     tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
     560             : 
     561        1578 :     test();
     562        1578 :     IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) )
     563             :     {
     564        1024 :         decimate = 3;
     565        1024 :         move16();
     566        1024 :         decay = 1;
     567        1024 :         move16();
     568             :     }
     569         554 :     ELSE IF( EQ_16( L, L_FRAME8k ) )
     570             :     {
     571           0 :         decimate = 6;
     572           0 :         move16();
     573           0 :         decay = 2;
     574           0 :         move16();
     575             :     }
     576             : 
     577         554 :     ELSE IF( EQ_16( L, 512 ) )
     578             :     {
     579         397 :         windecay48 = WINDECAY48_256;
     580         397 :         move16();
     581         397 :         decimate = 1;
     582         397 :         move16();
     583         397 :         decay = 0;
     584         397 :         move16();
     585             :     }
     586         157 :     ELSE IF( EQ_16( L, 256 ) )
     587             :     {
     588           0 :         windecay48 = WINDECAY48_256;
     589           0 :         move16();
     590           0 :         decimate = 2;
     591           0 :         move16();
     592           0 :         decay = 0;
     593           0 :         move16();
     594             :     }
     595             : 
     596        1578 :     paout = auOut - n; // Qx
     597             : 
     598        1578 :     IF( EQ_16( L, L_FRAME32k ) )
     599             :     {
     600       22010 :         FOR( i = n; i < ( L >> 1 ); i += 2 )
     601             :         {
     602       21700 :             paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( L >> 1 ) + i )], sign_right ), win_right[( ( ( ( ( ( 2 * L_FRAME16k - ( n16 + ( ( i - n ) >> 1 ) ) ) ) * decimate ) - 1 ) - decay ) - windecay48 )] ), OldauOut[i] );
     603       21700 :             move32();
     604       21700 :             paout[i + 1] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( ( L >> 1 ) + i ) + 1 )], sign_right ), win_int_right[( ( ( 2 * L_FRAME16k - ( n16 + ( ( i - n ) >> 1 ) ) ) - 1 ) - windecay16 )] ), OldauOut[i + 1] );
     605       21700 :             move32();
     606             :         }
     607             : 
     608       22010 :         FOR( i = 0; i < ( L >> 1 ) - n; i += 2 )
     609             :         {
     610       21700 :             paout[( ( ( L >> 1 ) + i ) + 1 )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( ( L - 1 ) - ( i + 1 ) )] ), win_right[( ( ( ( ( 3 * L_FRAME16k / 2 - 1 - ( i >> 1 ) ) ) * decimate ) + decay ) - windecay48 )] ), OldauOut[( ( i + ( L >> 1 ) ) + 1 )] );
     611       21700 :             move32();
     612       21700 :             paout[( ( L >> 1 ) + i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( ( L - 1 ) - i )] ), win_int_right[( ( 3 * L_FRAME16k / 2 - 1 - ( i >> 1 ) ) - windecay16 )] ), OldauOut[( i + ( L >> 1 ) )] );
     613       21700 :             move32();
     614             :         }
     615             : 
     616       28210 :         FOR( i = ( ( L >> 1 ) - n ); i < ( L >> 1 ); i += 2 )
     617             :         {
     618       27900 :             paout[( ( ( L >> 1 ) + i ) + 1 )] = L_add_sat( L_negate( ImdstOut[( ( L - 1 ) - ( i + 1 ) )] ), OldauOut[( ( i + ( L >> 1 ) ) + 1 )] );
     619       27900 :             move32();
     620       27900 :             paout[( ( L >> 1 ) + i )] = L_add_sat( L_negate( ImdstOut[( L - ( 1 + i ) )] ), OldauOut[( i + ( L >> 1 ) )] );
     621       27900 :             move32();
     622             :         }
     623             : 
     624       49910 :         FOR( i = 0; i < ( L >> 1 ); i += 2 )
     625             :         {
     626       49600 :             OldauOut[( ( ( L >> 1 ) + i ) + 1 )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i + 1], sign_left ), win_left[( ( ( L_FRAME16k / 2 - 1 - ( i >> 1 ) ) * decimate ) + decay )] );
     627       49600 :             move32();
     628       49600 :             OldauOut[( ( L >> 1 ) + i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_int_left[( L_FRAME16k / 2 - 1 - ( i >> 1 ) )] );
     629       49600 :             move32();
     630             :         }
     631             : 
     632             : 
     633       22010 :         FOR( i = n; i < ( L >> 1 ); i += 2 )
     634             :         {
     635       21700 :             OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[( ( ( L >> 1 ) - 1 ) - i )] ), win_left[( ( ( ( L_FRAME16k - ( i >> 1 ) ) * decimate ) - decay ) - 1 )] );
     636       21700 :             move32();
     637       21700 :             OldauOut[i + 1] = Mpy_32_16_1( L_negate( ImdstOut[( ( ( L >> 1 ) - 1 ) - ( i + 1 ) )] ), win_int_left[( L_FRAME16k - 1 - ( i >> 1 ) )] );
     638       21700 :             move32();
     639             :         }
     640             :     }
     641             :     ELSE
     642             :     {
     643      128682 :         FOR( i = n; i < ( L >> 1 ); i++ )
     644             :         {
     645      127414 :             paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( L >> 1 ) + i )], sign_right ), win_right[( ( ( ( ( ( ( L << 1 ) - i ) ) * decimate ) - 1 ) - decay ) - windecay48 )] ), OldauOut[i] );
     646      127414 :             move32();
     647             :         }
     648             : 
     649      128682 :         FOR( i = 0; i < ( L >> 1 ) - n; i++ )
     650             :         {
     651      127414 :             paout[( ( L >> 1 ) + i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( L - ( 1 + i ) )] ), win_right[( ( ( ( ( ( ( 3 * ( L >> 1 ) ) - 1 ) - i ) ) * decimate ) + decay ) - windecay48 )] ), OldauOut[( i + ( L >> 1 ) )] );
     652      127414 :             move32();
     653             :         }
     654             : 
     655      165086 :         FOR( i = ( ( L >> 1 ) - n ); i < ( L >> 1 ); i++ )
     656             :         {
     657      163818 :             paout[( ( L >> 1 ) + i )] = L_add_sat( L_negate( ImdstOut[( L - ( 1 + i ) )] ), OldauOut[( i + ( L >> 1 ) )] );
     658      163818 :             move32();
     659             :         }
     660             : 
     661      292500 :         FOR( i = 0; i < ( L >> 1 ); i++ )
     662             :         {
     663      291232 :             OldauOut[( ( L >> 1 ) + i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_left[( ( ( ( ( L >> 1 ) - ( i + 1 ) ) ) * decimate ) + decay )] );
     664      291232 :             move32();
     665             :         }
     666             : 
     667             : 
     668      128682 :         FOR( i = n; i < ( L >> 1 ); i++ )
     669             :         {
     670      127414 :             OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[( ( L >> 1 ) - ( 1 + i ) )] ), win_left[( ( ( ( L - i ) * decimate ) - decay ) - 1 )] );
     671      127414 :             move32();
     672             :         }
     673             :     }
     674             : 
     675      221196 :     FOR( i = 0; i < n; i++ )
     676             :     {
     677      219618 :         OldauOut[i] = L_negate( ImdstOut[( ( L >> 1 ) - ( 1 + i ) )] );
     678      219618 :         move32();
     679             :     }
     680      221196 :     FOR( i = 0; i < n; i++ )
     681             :     {
     682      219618 :         paout[( L + i )] = OldauOut[i];
     683      219618 :         move32();
     684             :     }
     685             : 
     686        1578 :     return;
     687             : }
     688             : 
     689             : 
     690             : /*---------------------------------------------------------------------*
     691             :  * core_switching_OLA()
     692             :  *
     693             :  * modify window after HQ core decoding
     694             :  * overlapp ACELP and HQ
     695             :  *---------------------------------------------------------------------*/
     696          24 : void core_switching_OLA_fx(
     697             :     Word16 *mem_over_hp,       /* i  : upsampling filter memory       Qsubrf (except at 8kHz)  */
     698             :     const Word16 last_L_frame, /* i  : last L_frame lengthture             */
     699             :     const Word32 output_Fs,    /* i  : output sampling rate                */
     700             :     Word16 *synth,             /* i/o: synthesized signal from HQ core     Qsynth*/
     701             :     Word16 *synth_subfr_out,   /* i  : synthesized signal from ACELP core  Qsubfr*/
     702             :     Word16 *synth_subfr_bwe,   /* i  : synthesized BWE from ACELP core     Qbwe (todo) */
     703             :     const Word16 output_frame, /* i  : output frame length                 */
     704             :     const Word16 bwidth,       /* i  : output bandwidth                          */
     705             :     Word16 *Qsynth,
     706             :     Word16 *Qsubfr )
     707             : {
     708             :     Word16 i, Loverlapp, out_filt_length, filt_delay, L;
     709             :     Word16 tmp_buf_switch[SWITCH_MAX_GAP], tmp_buf_switch2[HQ_DELAY_COMP * HQ_DELTA_MAX + 2]; /*Q0 */
     710          24 :     const Word16 *pt_sin = NULL, *pt_cos;
     711             :     Word16 *pt2, *pt3, *pt;
     712             :     const Word16 *pt4, *pt5;
     713             :     Word16 tmp, tmp2, temp_len;
     714          24 :     Word16 decimate = 0, delta = 0; /* initialize just to avoid compiler warnings */
     715          24 :     move16();
     716          24 :     move16();
     717             :     const Word16 *on_win, *on_win_int;
     718             :     Word16 a, b, divisor, buf_offset;
     719             :     Word32 L_tmp;
     720             : 
     721             :     /* Scaling (if needed) */
     722          24 :     tmp = s_min( *Qsynth, *Qsubfr );
     723          24 :     Scale_sig( synth, output_frame, sub( tmp, *Qsynth ) );
     724          24 :     *Qsynth = tmp;
     725          24 :     move16();
     726          24 :     Scale_sig( synth_subfr_out, SWITCH_MAX_GAP, sub( tmp, *Qsubfr ) );
     727          24 :     Scale_sig( mem_over_hp, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) + 2, sub( tmp, *Qsubfr ) ); /* reScale mem over HP at Qsynth */
     728          24 :     *Qsubfr = tmp;
     729          24 :     move16();
     730             : 
     731             :     /* win = window_48kHz_fx;*/
     732             :     /* win_int = window_8_16_32kHz_fx;*/
     733          24 :     on_win = one_on_win_48k_fx;            // Q14
     734          24 :     on_win_int = one_on_win_8k_16k_48k_fx; // Q14
     735             : 
     736             : 
     737          24 :     SWITCH( output_frame )
     738             :     {
     739           0 :         case L_FRAME8k:
     740           0 :             decimate = 6;
     741           0 :             move16();
     742             :             /*decay = 2; move16();*/
     743           0 :             delta = 1;
     744           0 :             move16();
     745           0 :             pt_sin = sin_switch_8;
     746           0 :             BREAK;
     747           0 :         case L_FRAME16k:
     748           0 :             decimate = 3;
     749           0 :             move16();
     750             :             /*decay = 1; move16(); */
     751           0 :             delta = 2;
     752           0 :             move16();
     753           0 :             pt_sin = sin_switch_16;
     754           0 :             BREAK;
     755           5 :         case L_FRAME32k:
     756           5 :             decimate = 3;
     757           5 :             move16();
     758             :             /*decay = 1; move16(); */
     759           5 :             delta = 4;
     760           5 :             move16();
     761           5 :             pt_sin = sin_switch_32;
     762           5 :             BREAK;
     763          19 :         case L_FRAME48k:
     764          19 :             decimate = 1;
     765          19 :             move16();
     766             :             /*decay = 0; move16();*/
     767          19 :             delta = 6;
     768          19 :             move16();
     769          19 :             pt_sin = sin_switch_48;
     770          19 :             BREAK;
     771             :     }
     772             : 
     773          24 :     set16_fx( tmp_buf_switch, 0, SWITCH_MAX_GAP );
     774          24 :     set16_fx( tmp_buf_switch2, 0, HQ_DELAY_COMP * HQ_DELTA_MAX + 2 );
     775             : 
     776          24 :     Loverlapp = i_mult2( delta, SWITCH_OVERLAP_8k );
     777          24 :     pt_cos = pt_sin + Loverlapp - 1;
     778             : 
     779          24 :     Copy( synth_subfr_out, tmp_buf_switch, i_mult2( SWITCH_GAP_LENGTH_8k, delta ) ); /* copy 6.25 ms subframe  */
     780             : 
     781             : 
     782             :     /* conversion from 12.8kHz to output_Fs */
     783          24 :     IF( EQ_16( last_L_frame, L_FRAME ) )
     784             :     {
     785             :         /* resample filter memory */
     786           5 :         IF( EQ_16( output_frame, L_FRAME8k ) )
     787             :         {
     788           0 :             Copy( synth_subfr_out + SWITCH_GAP_LENGTH_8k, tmp_buf_switch + SWITCH_GAP_LENGTH_8k, NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */
     789             :         }
     790             :         ELSE
     791             :         {
     792           5 :             filt_delay = 0;
     793           5 :             move16();
     794           5 :             out_filt_length = 0;
     795           5 :             move16();
     796           5 :             out_filt_length = modify_Fs_intcub3m_sup_fx( mem_over_hp + 2, NS2SA_FX2( 12800, DELAY_CLDFB_NS ), 12800, tmp_buf_switch2, output_Fs, &filt_delay );
     797           5 :             pt = tmp_buf_switch2 + sub( out_filt_length, filt_delay );
     798           5 :             pt2 = pt - 1;
     799          15 :             FOR( i = 0; i < filt_delay; i++ )
     800             :             {
     801          10 :                 *pt++ = *pt2;
     802          10 :                 move16();
     803             :             }
     804             : 
     805           5 :             test();
     806           5 :             test();
     807           5 :             test();
     808           5 :             IF( ( EQ_16( bwidth, NB ) && GE_32( output_Fs, 16000 ) ) || ( GT_16( bwidth, NB ) && GT_32( output_Fs, 16000 ) ) )
     809             :             {
     810             :                 /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */
     811           5 :                 buf_offset = i_mult2( SWITCH_GAP_LENGTH_8k, delta );
     812           5 :                 divisor = getNormReciprocalWord16( out_filt_length );
     813         205 :                 FOR( i = 0; i < out_filt_length; i++ )
     814             :                 {
     815         200 :                     a = i_mult2( i, divisor );
     816         200 :                     b = sub( 32767, a );
     817             : 
     818         200 :                     L_tmp = L_mult( a, tmp_buf_switch2[i] );
     819         200 :                     tmp_buf_switch[buf_offset + i] = mac_r( L_tmp, b, synth_subfr_out[buf_offset + i] );
     820         200 :                     move16();
     821             :                 }
     822             :             }
     823             :             ELSE
     824             :             {
     825             :                 /* copy cubic resampled buffer (memory) */
     826           0 :                 Copy( tmp_buf_switch2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), out_filt_length );
     827             :             }
     828             :         }
     829             :     }
     830             :     ELSE
     831             :     {
     832             : 
     833             : 
     834          19 :         IF( ( output_frame - L_FRAME16k ) == 0 ) /* no resampling */
     835             :         {
     836           0 :             Copy( mem_over_hp + 2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) );
     837             :         }
     838             :         ELSE
     839             :         {
     840          19 :             IF( ( output_frame - L_FRAME8k ) == 0 ) /* not done yet */
     841             :             {
     842           0 :                 Copy( synth_subfr_out + SWITCH_GAP_LENGTH_8k, tmp_buf_switch + SWITCH_GAP_LENGTH_8k, NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */
     843             :             }
     844             :             ELSE
     845             :             {
     846          19 :                 out_filt_length = modify_Fs_intcub3m_sup_fx( mem_over_hp + 2, NS2SA( 16000, DELAY_CLDFB_NS ), 16000, tmp_buf_switch2, output_Fs, &filt_delay );
     847          19 :                 pt = tmp_buf_switch2 + sub( out_filt_length, filt_delay );
     848          19 :                 pt2 = pt - 1;
     849          57 :                 FOR( i = 0; i < filt_delay; i++ )
     850             :                 {
     851          38 :                     *pt++ = *pt2;
     852          38 :                     move16();
     853             :                 }
     854             : 
     855          19 :                 test();
     856          19 :                 test();
     857          19 :                 test();
     858          19 :                 IF( ( EQ_16( bwidth, NB ) && GE_32( output_Fs, 16000 ) ) || ( GT_16( bwidth, NB ) && GT_32( output_Fs, 16000 ) ) )
     859             :                 {
     860             :                     /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */
     861          19 :                     buf_offset = i_mult2( SWITCH_GAP_LENGTH_8k, delta );
     862          19 :                     divisor = getNormReciprocalWord16( out_filt_length );
     863        1159 :                     FOR( i = 0; i < out_filt_length; i++ )
     864             :                     {
     865        1140 :                         a = i_mult2( i, divisor );
     866        1140 :                         b = sub( 32767, a );
     867             : 
     868        1140 :                         L_tmp = L_mult( a, tmp_buf_switch2[i] );
     869        1140 :                         tmp_buf_switch[buf_offset + i] = mac_r( L_tmp, b, synth_subfr_out[buf_offset + i] );
     870        1140 :                         move16();
     871             :                     }
     872             :                 }
     873             :                 ELSE
     874             :                 {
     875             :                     /* copy cubic resampled buffer (memory) */
     876           0 :                     Copy( tmp_buf_switch2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), out_filt_length );
     877             :                 }
     878             :             }
     879             :         }
     880             :     }
     881             : 
     882             : 
     883             :     /* compensate aldo */
     884          24 :     L = i_mult2( delta, SWITCH_GAP_LENGTH_8k + NS2SA( 8000, DELAY_CLDFB_NS ) ); /* 6.25 ms gap + 1.25 ms resamp  */
     885          24 :     tmp = sub( L, Loverlapp );
     886             : 
     887             : 
     888          24 :     set16_fx( synth, 0, tmp );
     889             : 
     890             : 
     891          24 :     IF( EQ_16( output_frame, L_FRAME32k ) )
     892             :     {
     893             : 
     894           5 :         pt = synth + tmp;
     895           5 :         pt2 = pt + 1;
     896           5 :         pt5 = on_win + 210 - 1;
     897           5 :         pt4 = on_win_int + 70 - 1;
     898           5 :         temp_len = i_mult2( ( R2_16 >> 2 ), delta );
     899         355 :         FOR( i = 0; i < temp_len; i += 2 )
     900             :         {
     901         350 :             *pt = shl_sat( mult_r_sat( *pt, *pt5 ), 1 );
     902         350 :             move16(); /*      // Q14* Q15 + shl  ==> Q15 */
     903         350 :             *pt2 = shl_sat( mult_r_sat( *pt2, *pt4 ), 1 );
     904         350 :             move16(); /*/= win[(3*L_FRAME16k/2-1-i/2)*decimate+decay-L_FRAME48k*14/20]; */
     905         350 :             pt += 2;
     906         350 :             pt2 += 2;
     907         350 :             pt5 -= 3;
     908         350 :             pt4--;
     909             :         }
     910             :     }
     911             :     ELSE
     912             :     {
     913             : 
     914          19 :         pt = synth + tmp;
     915          19 :         pt5 = on_win + 210 - 1;
     916          19 :         temp_len = i_mult2( ( R2_16 >> 2 ), delta );
     917        4009 :         FOR( i = 0; i < temp_len; i++ )
     918             :         {
     919        3990 :             *pt = shl_sat( mult_r_sat( *pt, *pt5 ), 1 );
     920        3990 :             move16(); /*  /= win[(3*output_frame/2-1-i)*decimate+decay-L_FRAME48k*14/20]; */
     921        3990 :             pt++;
     922        3990 :             pt5 -= decimate;
     923        3990 :             move16();
     924             :         }
     925             :     }
     926             : 
     927             : 
     928          24 :     pt = synth + tmp;
     929          24 :     move16(); /*Q15 */
     930          24 :     pt2 = synth_subfr_bwe + tmp - NS2SA_FX2( output_Fs, DELAY_CLDFB_NS );
     931          24 :     move16(); /*Q15 */
     932          24 :     pt3 = tmp_buf_switch + tmp;
     933          24 :     move16(); /*Q15 */
     934             : 
     935        2034 :     FOR( i = 0; i < Loverlapp; i++ ) /*Windowing for overlapadd  */
     936             :     {
     937        2010 :         *pt = mult_r( *pt, *pt_sin );
     938        2010 :         move16();
     939        2010 :         pt_sin++;
     940        2010 :         tmp2 = mult_r( *pt_cos, *pt_cos );
     941        2010 :         pt_cos--;
     942        2010 :         *pt2 = mult_r( *pt2, tmp2 );
     943        2010 :         move16();
     944        2010 :         *pt3 = mult_r( *pt3, tmp2 );
     945        2010 :         move16();
     946        2010 :         pt++;
     947        2010 :         pt2++;
     948        2010 :         pt3++;
     949             :     }
     950             : 
     951          24 :     pt = synth;
     952          24 :     pt2 = tmp_buf_switch;
     953          24 :     tmp = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS );
     954          24 :     move16();
     955          24 :     pt3 = synth_subfr_bwe;
     956             : 
     957             :     /* overlapadd ACELP (tmp_buf_switch) + HQ (synth) */ /*Q15 */
     958        1364 :     FOR( i = 0; i < tmp; i++ )
     959             :     {
     960        1340 :         *pt = add( *pt, *pt2++ );
     961        1340 :         move16();
     962        1340 :         pt++;
     963             :     }
     964             : 
     965          24 :     temp_len = sub( L, tmp );
     966        6724 :     FOR( i = 0; i < temp_len; i++ )
     967             :     {
     968        6700 :         *pt = add_sat( add_sat( *pt, *pt2++ ), *pt3++ );
     969        6700 :         move16();
     970        6700 :         pt++;
     971             :     }
     972             : 
     973          24 :     return;
     974             : }

Generated by: LCOV version 1.14