/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
/****************************************************************************************
Portions of this file are derived from the following 3GPP standard:

    3GPP TS 26.073
    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
    Available from http://www.3gpp.org

(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
Permission to distribute, modify and use this file under the standard license
terms listed above has been obtained from the copyright holder.
****************************************************************************************/
/*

 Pathname: ./audio/gsm-amr/c/src/residu.c

------------------------------------------------------------------------------
 REVISION HISTORY

 Description: Updated template used to PV coding template. First attempt at
          optimizing code.

 Description: Deleted stores listed in the Local Stores Needed/Modified
          section.

 Description: Updated file per comments gathered from Phase 2/3 review.

 Description: Updating to reflect variable name changes made in residu.asm

 Description: Synchronized file with UMTS version 3.2.0. Updated coding
              template. Removed unnecessary include files.

 Description: Made the following changes per comments from Phase 2/3 review:
              1. Modified FOR loops to count down.
              2. Fixed typecasting issue with TI C compiler.

 Description: Made the following changes
              1. Unrolled the convolutional loop.
              2. Performed 4 convolution per pass to avoid recalling the same
                 filter coefficient as many times.
              2. Eliminated math operations that check for saturation.

 Description:  Replaced "int" and/or "char" with OSCL defined types.

 Description: Changed round function name to pv_round to avoid conflict with
              round function in C standard library.

 Who:                           Date:
 Description:

------------------------------------------------------------------------------
*/

/*----------------------------------------------------------------------------
; INCLUDES
----------------------------------------------------------------------------*/
#include "residu.h"
#include "typedef.h"
#include "cnst.h"

/*----------------------------------------------------------------------------
; MACROS
; Define module specific macros here
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; DEFINES
; Include all pre-processor statements here. Include conditional
; compile variables also.
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/


/*
------------------------------------------------------------------------------
 FUNCTION NAME: Residu
------------------------------------------------------------------------------
 INPUT AND OUTPUT DEFINITIONS

 Inputs:
    coef_ptr = pointer to buffer containing the prediction coefficients
    input_ptr = pointer to buffer containing the speech signal
    input_len = filter order
    residual_ptr = pointer to buffer of residual signal

 Outputs:
    residual_ptr buffer contains the newly calculated the residual signal

 Returns:
    None

 Global Variables Used:
    None

 Local Variables Needed:
    None

------------------------------------------------------------------------------
 FUNCTION DESCRIPTION

 This function computes the LP residual by filtering the input speech through
 the LP inverse filter A(z).

------------------------------------------------------------------------------
 REQUIREMENTS

 None

------------------------------------------------------------------------------
 REFERENCES

 residu.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001

------------------------------------------------------------------------------
 PSEUDO-CODE

 Note: Input argument names were changed to be more descriptive. Shown below
       are the original names. Shown below are the name changes:
           a[]  <-->  coef_ptr[]
           x[]  <-->  input_ptr[]
           y[]  <-->  residual_ptr[]
           lg   <-->  input_len


void Residu (
    Word16 a[], // (i)     : prediction coefficients
    Word16 x[], // (i)     : speech signal
    Word16 y[], // (o)     : residual signal
    Word16 lg   // (i)     : size of filtering
)
{
    Word16 i, j;
    Word32 s;

    for (i = 0; i < lg; i++)
    {
        s = L_mult (x[i], a[0]);
        for (j = 1; j <= M; j++)
        {
            s = L_mac (s, a[j], x[i - j]);
        }
        s = L_shl (s, 3);
        y[i] = pv_round (s);
    }
    return;
}

------------------------------------------------------------------------------
 RESOURCES USED [optional]

 When the code is written for a specific target processor the
 the resources used should be documented below.

 HEAP MEMORY USED: x bytes

 STACK MEMORY USED: x bytes

 CLOCK CYCLES: (cycle count equation for this function) + (variable
                used to represent cycle count for each subroutine
                called)
     where: (cycle count variable) = cycle count for [subroutine
                                     name]

------------------------------------------------------------------------------
 CAUTION [optional]
 [State any special notes, constraints or cautions for users of this function]

------------------------------------------------------------------------------
*/

void Residu(
    Word16 coef_ptr[],      /* (i)     : prediction coefficients*/
    Word16 input_ptr[],     /* (i)     : speech signal          */
    Word16 residual_ptr[],  /* (o)     : residual signal        */
    Word16 input_len        /* (i)     : size of filtering      */
)
{


    Word16 i, j;
    Word32 s1;
    Word32 s2;
    Word32 s3;
    Word32 s4;
    Word16 *p_input1;
    Word16 *p_input2;
    Word16 *p_input3;
    Word16 *p_input4;
    Word16 *p_coef;
    Word16 *p_residual_ptr = &residual_ptr[input_len-1];
    Word16 *p_input_ptr    = &input_ptr[input_len-1-M];

    for (i = input_len >> 2; i != 0; i--)
    {
        s1       = 0x0000800L;
        s2       = 0x0000800L;
        s3       = 0x0000800L;
        s4       = 0x0000800L;
        p_coef  = &coef_ptr[M];
        p_input1 = p_input_ptr--;
        p_input2 = p_input_ptr--;
        p_input3 = p_input_ptr--;
        p_input4 = p_input_ptr--;

        for (j = M >> 1; j != 0; j--)
        {
            s1 += ((Word32) * (p_coef) * *(p_input1++));
            s2 += ((Word32) * (p_coef) * *(p_input2++));
            s3 += ((Word32) * (p_coef) * *(p_input3++));
            s4 += ((Word32) * (p_coef--) * *(p_input4++));
            s1 += ((Word32) * (p_coef) * *(p_input1++));
            s2 += ((Word32) * (p_coef) * *(p_input2++));
            s3 += ((Word32) * (p_coef) * *(p_input3++));
            s4 += ((Word32) * (p_coef--) * *(p_input4++));
        }

        s1 += (((Word32) * (p_coef)) * *(p_input1));
        s2 += (((Word32) * (p_coef)) * *(p_input2));
        s3 += (((Word32) * (p_coef)) * *(p_input3));
        s4 += (((Word32) * (p_coef)) * *(p_input4));

        *(p_residual_ptr--) = (Word16)(s1 >> 12);
        *(p_residual_ptr--) = (Word16)(s2 >> 12);
        *(p_residual_ptr--) = (Word16)(s3 >> 12);
        *(p_residual_ptr--) = (Word16)(s4 >> 12);

    }

    return;
}
