Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /****************************************************************************************
     19 Portions of this file are derived from the following 3GPP standard:
     20 
     21     3GPP TS 26.073
     22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
     26 Permission to distribute, modify and use this file under the standard license
     27 terms listed above has been obtained from the copyright holder.
     28 ****************************************************************************************/
     29 /*
     30 ------------------------------------------------------------------------------
     31 
     32 
     33 
     34  Pathname: ./audio/gsm-amr/c/src/pre_big.c
     35  Functions:
     36 
     37      Date: 02/04/2002
     38 
     39 ------------------------------------------------------------------------------
     40  REVISION HISTORY
     41 
     42  Description: Updated template used to PV coding template.
     43  Changed to accept the pOverflow flag for EPOC compatibility.
     44 
     45  Description:  Replaced "int" and/or "char" with OSCL defined types.
     46 
     47  Description:
     48 
     49 ------------------------------------------------------------------------------
     50  MODULE DESCRIPTION
     51 
     52     Big subframe (2 subframes) preprocessing
     53 ------------------------------------------------------------------------------
     54 */
     55 
     56 /*----------------------------------------------------------------------------
     57 ; INCLUDES
     58 ----------------------------------------------------------------------------*/
     59 #include "pre_big.h"
     60 #include "typedef.h"
     61 #include "basic_op.h"
     62 #include "syn_filt.h"
     63 #include "weight_a.h"
     64 #include "residu.h"
     65 #include "cnst.h"
     66 
     67 /*----------------------------------------------------------------------------
     68 ; MACROS
     69 ; Define module specific macros here
     70 ----------------------------------------------------------------------------*/
     71 
     72 /*----------------------------------------------------------------------------
     73 ; DEFINES
     74 ; Include all pre-processor statements here. Include conditional
     75 ; compile variables also.
     76 ----------------------------------------------------------------------------*/
     77 
     78 /*----------------------------------------------------------------------------
     79 ; LOCAL FUNCTION DEFINITIONS
     80 ; Function Prototype declaration
     81 ----------------------------------------------------------------------------*/
     82 
     83 /*----------------------------------------------------------------------------
     84 ; LOCAL VARIABLE DEFINITIONS
     85 ; Variable declaration - defined here and used outside this module
     86 ----------------------------------------------------------------------------*/
     87 
     88 /*
     89 ------------------------------------------------------------------------------
     90  FUNCTION NAME: pre_big
     91 ------------------------------------------------------------------------------
     92  INPUT AND OUTPUT DEFINITIONS
     93 
     94  Inputs:
     95     mode = enum Mode -- coder mode
     96     gamma1 = array of type const Word16 -- spectral exp. factor 1
     97     gamma1_12k2 = array of type const Word16 -- spectral exp. factor 1 for EFR
     98     gamma2 = array of type const Word16 -- spectral exp. factor 2
     99     A_t = array of type Word16 -- A(z) unquantized, for 4 subframes, Q12
    100     frameOffset = Word16 -- Start position in speech vector,   Q0
    101     speech[] = array of type Word16 -- speech,                            Q0
    102 
    103  Outputs:
    104     mem_w = array of type Word16 -- synthesis filter memory state,     Q0
    105     wsp   = array of type Word16 -- weighted speech                    Q0
    106     pOverflow = pointer of type Flag -- overflow indicator
    107 
    108  Returns:
    109     None
    110 
    111  Global Variables Used:
    112     None
    113 
    114  Local Variables Needed:
    115     None
    116 
    117 ------------------------------------------------------------------------------
    118  FUNCTION DESCRIPTION
    119 
    120 
    121 ------------------------------------------------------------------------------
    122  REQUIREMENTS
    123 
    124  None
    125 
    126 ------------------------------------------------------------------------------
    127  REFERENCES
    128 
    129  pre_big.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    130 
    131 ------------------------------------------------------------------------------
    132  PSEUDO-CODE
    133 
    134 
    135 ------------------------------------------------------------------------------
    136  RESOURCES USED [optional]
    137 
    138  When the code is written for a specific target processor the
    139  the resources used should be documented below.
    140 
    141  HEAP MEMORY USED: x bytes
    142 
    143  STACK MEMORY USED: x bytes
    144 
    145  CLOCK CYCLES: (cycle count equation for this function) + (variable
    146                 used to represent cycle count for each subroutine
    147                 called)
    148      where: (cycle count variable) = cycle count for [subroutine
    149                                      name]
    150 
    151 ------------------------------------------------------------------------------
    152  CAUTION [optional]
    153  [State any special notes, constraints or cautions for users of this function]
    154 
    155 ------------------------------------------------------------------------------
    156 */
    157 
    158 void pre_big(
    159     enum Mode mode,            /* i  : coder mode                             */
    160     const Word16 gamma1[],     /* i  : spectral exp. factor 1                 */
    161     const Word16 gamma1_12k2[],/* i  : spectral exp. factor 1 for EFR         */
    162     const Word16 gamma2[],     /* i  : spectral exp. factor 2                 */
    163     Word16 A_t[],              /* i  : A(z) unquantized, for 4 subframes, Q12 */
    164     Word16 frameOffset,        /* i  : Start position in speech vector,   Q0  */
    165     Word16 speech[],           /* i  : speech,                            Q0  */
    166     Word16 mem_w[],            /* i/o: synthesis filter memory state,     Q0  */
    167     Word16 wsp[],              /* o  : weighted speech                    Q0  */
    168     Flag   *pOverflow          /* o  : overflow indicator                     */
    169 )
    170 {
    171     Word16 Ap1[MP1];            /* A(z) with spectral expansion         */
    172     Word16 Ap2[MP1];            /* A(z) with spectral expansion         */
    173     const Word16 *g1;           /* Pointer to correct gammma1 vector    */
    174     Word16 aOffset;
    175     Word16 i;
    176 
    177     if (mode <= MR795)
    178     {
    179         g1 = gamma1;
    180     }
    181     else
    182     {
    183         g1 = gamma1_12k2;
    184     }
    185 
    186     if (frameOffset > 0)
    187     {
    188         aOffset = 2 * MP1;
    189     }
    190     else
    191     {
    192         aOffset = 0;
    193     }
    194 
    195     /* process two subframes (which form the "big" subframe) */
    196     for (i = 0; i < 2; i++)
    197     {
    198         Weight_Ai(&A_t[aOffset], g1, Ap1);
    199         Weight_Ai(&A_t[aOffset], gamma2, Ap2);
    200         Residu(Ap1, &speech[frameOffset], &wsp[frameOffset], L_SUBFR);
    201 
    202         Syn_filt(Ap2, &wsp[frameOffset], &wsp[frameOffset], L_SUBFR, mem_w, 1);
    203 
    204         aOffset = add(aOffset, MP1, pOverflow);
    205 
    206         frameOffset = add(frameOffset, L_SUBFR, pOverflow);
    207     }
    208 
    209     return;
    210 }
    211