/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

/******************************************************************

 iLBC Speech Coder ANSI-C Source Code

 WebRtcIlbcfix_EnhUpsample.c

******************************************************************/

#include "defines.h"
#include "constants.h"

/*----------------------------------------------------------------*
 * upsample finite array assuming zeros outside bounds
 *---------------------------------------------------------------*/

void WebRtcIlbcfix_EnhUpsample(
    int32_t *useq1, /* (o) upsampled output sequence */
    int16_t *seq1 /* (i) unupsampled sequence */
                                ){
  int j;
  int32_t *pu1, *pu11;
  int16_t *ps, *w16tmp;
  const int16_t *pp;

  /* filtering: filter overhangs left side of sequence */
  pu1=useq1;
  for (j=0;j<ENH_UPS0; j++) {
    pu11=pu1;
    /* i = 2 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+2;
    *pu11 = (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    pu11+=ENH_UPS0;
    /* i = 3 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+3;
    *pu11 = (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    pu11+=ENH_UPS0;
    /* i = 4 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+4;
    *pu11 = (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    pu1++;
  }

  /* filtering: simple convolution=inner products
     (not needed since the sequence is so short)
  */

  /* filtering: filter overhangs right side of sequence */

  /* Code with loops, which is equivivalent to the expanded version below

     filterlength = 5;
     hf1 = 2;
     for(j=0;j<ENH_UPS0; j++){
     pu = useq1 + (filterlength-hfl)*ENH_UPS0 + j;
     for(i=1; i<=hfl; i++){
     *pu=0;
     pp = polyp[j]+i;
     ps = seq1+dim1-1;
     for(k=0;k<filterlength-i;k++) {
     *pu += (*ps--) * *pp++;
     }
     pu+=ENH_UPS0;
     }
     }
  */
  pu1 = useq1 + 12;
  w16tmp = seq1+4;
  for (j=0;j<ENH_UPS0; j++) {
    pu11 = pu1;
    /* i = 1 */
    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+2;
    ps = w16tmp;
    *pu11 = (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    pu11+=ENH_UPS0;
    /* i = 2 */
    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+3;
    ps = w16tmp;
    *pu11 = (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    *pu11 += (*ps--) * *pp++;
    pu11+=ENH_UPS0;

    pu1++;
  }
}
