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  Pathname: ./audio/gsm-amr/c/src/vad1.c
     31  Functions:
     32 
     33 ------------------------------------------------------------------------------
     34  REVISION HISTORY
     35 
     36  Description: Updated template used to PV coding template.
     37  Changed to accept the pOverflow flag for EPOC compatibility.
     38 
     39  Description: Made changes per review comments
     40  (1) Removed include of "count.h"
     41  (2) Replaced "basic_op.h" with individual include files
     42  (3) Removed some unnecessary instances of sub().
     43 
     44  Description:  Replaced OSCL mem type functions and eliminated include
     45                files that now are chosen by OSCL definitions
     46 
     47  Description:  Replaced "int" and/or "char" with OSCL defined types.
     48 
     49  Description: Changed round function name to pv_round to avoid conflict with
     50               round function in C standard library.
     51 
     52  Who:                           Date:
     53  Description:
     54 
     55 ------------------------------------------------------------------------------
     56  MODULE DESCRIPTION
     57 
     58 
     59 ------------------------------------------------------------------------------
     60 */
     61 
     62 /*----------------------------------------------------------------------------
     63 ; INCLUDES
     64 ----------------------------------------------------------------------------*/
     65 
     66 #include <stdlib.h>
     67 #include <string.h>
     68 
     69 #include "vad.h"
     70 #include "typedef.h"
     71 #include "shr.h"
     72 #include "basic_op.h"
     73 #include "cnst_vad.h"
     74 
     75 /*----------------------------------------------------------------------------
     76 ; MACROS
     77 ; Define module specific macros here
     78 ----------------------------------------------------------------------------*/
     79 
     80 /*----------------------------------------------------------------------------
     81 ; DEFINES
     82 ; Include all pre-processor statements here. Include conditional
     83 ; compile variables also.
     84 ----------------------------------------------------------------------------*/
     85 
     86 /*----------------------------------------------------------------------------
     87 ; LOCAL FUNCTION DEFINITIONS
     88 ; Function Prototype declaration
     89 ----------------------------------------------------------------------------*/
     90 
     91 /*----------------------------------------------------------------------------
     92 ; LOCAL VARIABLE DEFINITIONS
     93 ; Variable declaration - defined here and used outside this module
     94 ----------------------------------------------------------------------------*/
     95 
     96 /*
     97 ------------------------------------------------------------------------------
     98  FUNCTION NAME: first_filter_stage
     99 ------------------------------------------------------------------------------
    100  INPUT AND OUTPUT DEFINITIONS
    101 
    102  Inputs:
    103     data -- array of type Word16 -- filter memory
    104     in   -- array of type Word16 -- input signal
    105 
    106  Outputs:
    107     data -- array of type Word16 -- filter memory
    108     out  -- array of type Word16 -- output values, every other
    109                                     output is low-pass part and
    110                                     other is high-pass part every
    111 
    112     pOverflow -- pointer to type Flag -- overflow indicator
    113 
    114  Returns:
    115     None
    116 
    117  Global Variables Used:
    118     None
    119 
    120  Local Variables Needed:
    121     None
    122 
    123 ------------------------------------------------------------------------------
    124  FUNCTION DESCRIPTION
    125 
    126  Purpose      : Scale input down by one bit. Calculate 5th order
    127                 half-band lowpass/highpass filter pair with
    128                 decimation.
    129 ------------------------------------------------------------------------------
    130  REQUIREMENTS
    131 
    132  None
    133 
    134 ------------------------------------------------------------------------------
    135  REFERENCES
    136 
    137  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    138 
    139 ------------------------------------------------------------------------------
    140  PSEUDO-CODE
    141 
    142 
    143 ------------------------------------------------------------------------------
    144  RESOURCES USED [optional]
    145 
    146  When the code is written for a specific target processor the
    147  the resources used should be documented below.
    148 
    149  HEAP MEMORY USED: x bytes
    150 
    151  STACK MEMORY USED: x bytes
    152 
    153  CLOCK CYCLES: (cycle count equation for this function) + (variable
    154                 used to represent cycle count for each subroutine
    155                 called)
    156      where: (cycle count variable) = cycle count for [subroutine
    157                                      name]
    158 
    159 ------------------------------------------------------------------------------
    160  CAUTION [optional]
    161  [State any special notes, constraints or cautions for users of this function]
    162 
    163 ------------------------------------------------------------------------------
    164 */
    165 
    166 static void first_filter_stage(
    167     Word16 in[],      /* i   : input signal                  */
    168     Word16 out[],     /* o   : output values, every other    */
    169     /*       output is low-pass part and   */
    170     /*       other is high-pass part every */
    171     Word16 data[],    /* i/o : filter memory                 */
    172     Flag  *pOverflow  /* o : Flag set when overflow occurs   */
    173 )
    174 {
    175     Word16 temp0;
    176     Word16 temp1;
    177     Word16 temp2;
    178     Word16 temp3;
    179     Word16 i;
    180     Word16 data0;
    181     Word16 data1;
    182 
    183     data0 = data[0];
    184     data1 = data[1];
    185 
    186     for (i = 0; i < FRAME_LEN / 4; i++)
    187     {
    188         temp0 = mult(COEFF5_1, data0, pOverflow);
    189         temp1 = shr(in[4*i+0], 2, pOverflow);
    190         temp0 = sub(temp1, temp0, pOverflow);
    191 
    192         temp1 = mult(COEFF5_1, temp0, pOverflow);
    193         temp1 = add(data0, temp1, pOverflow);
    194 
    195         temp3 = mult(COEFF5_2, data1, pOverflow);
    196         temp2 = shr(in[4*i+1], 2, pOverflow);
    197 
    198         temp3 = sub(temp2, temp3, pOverflow);
    199 
    200         temp2 = mult(COEFF5_2, temp3, pOverflow);
    201         temp2 = add(data1, temp2, pOverflow);
    202 
    203         out[4*i+0] = add(temp1, temp2, pOverflow);
    204         out[4*i+1] = sub(temp1, temp2, pOverflow);
    205 
    206         temp1 = mult(COEFF5_1, temp0, pOverflow);
    207         temp2 = shr(in[4*i+2], 2, pOverflow);
    208         data0 = sub(temp2, temp1, pOverflow);
    209 
    210         temp1 = mult(COEFF5_1, data0, pOverflow);
    211         temp1 = add(temp0, temp1, pOverflow);
    212 
    213         data1 = mult(COEFF5_2, temp3, pOverflow);
    214         temp2 = shr(in[4*i+3], 2, pOverflow);
    215         data1 = sub(temp2, data1, pOverflow);
    216 
    217         temp2 = mult(COEFF5_2, data1, pOverflow);
    218         temp2 = add(temp3, temp2, pOverflow);
    219 
    220         out[4*i+2] = add(temp1, temp2, pOverflow);
    221         out[4*i+3] = sub(temp1, temp2, pOverflow);
    222     }
    223 
    224     data[0] = data0;
    225     data[1] = data1;
    226 }
    227 
    228 
    229 /*
    230 ------------------------------------------------------------------------------
    231  FUNCTION NAME: filter5
    232 ------------------------------------------------------------------------------
    233  INPUT AND OUTPUT DEFINITIONS
    234 
    235  Inputs:
    236     in0 -- array of type Word16 -- input values; output low-pass part
    237     in1 -- array of type Word16 -- input values; output high-pass part
    238     data -- array of type Word16 -- updated filter memory
    239 
    240  Outputs:
    241     in0 -- array of type Word16 -- input values; output low-pass part
    242     in1 -- array of type Word16 -- input values; output high-pass part
    243     data -- array of type Word16 -- updated filter memory
    244     pOverflow -- pointer to type Flag -- overflow indicator
    245 
    246  Returns:
    247     None
    248 
    249  Global Variables Used:
    250     None
    251 
    252  Local Variables Needed:
    253     None
    254 
    255 ------------------------------------------------------------------------------
    256  FUNCTION DESCRIPTION
    257 
    258  Purpose      : Fifth-order half-band lowpass/highpass filter pair with
    259                 decimation.
    260 ------------------------------------------------------------------------------
    261  REQUIREMENTS
    262 
    263  None
    264 
    265 ------------------------------------------------------------------------------
    266  REFERENCES
    267 
    268  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    269 
    270 ------------------------------------------------------------------------------
    271  PSEUDO-CODE
    272 
    273 
    274 ------------------------------------------------------------------------------
    275  RESOURCES USED [optional]
    276 
    277  When the code is written for a specific target processor the
    278  the resources used should be documented below.
    279 
    280  HEAP MEMORY USED: x bytes
    281 
    282  STACK MEMORY USED: x bytes
    283 
    284  CLOCK CYCLES: (cycle count equation for this function) + (variable
    285                 used to represent cycle count for each subroutine
    286                 called)
    287      where: (cycle count variable) = cycle count for [subroutine
    288                                      name]
    289 
    290 ------------------------------------------------------------------------------
    291  CAUTION [optional]
    292  [State any special notes, constraints or cautions for users of this function]
    293 
    294 ------------------------------------------------------------------------------
    295 */
    296 
    297 static void filter5(Word16 *in0,    /* i/o : input values; output low-pass part  */
    298                     Word16 *in1,    /* i/o : input values; output high-pass part */
    299                     Word16 data[],  /* i/o : updated filter memory               */
    300                     Flag  *pOverflow  /* o : Flag set when overflow occurs       */
    301                    )
    302 {
    303     Word16 temp0;
    304     Word16 temp1;
    305     Word16 temp2;
    306 
    307     temp0 = mult(COEFF5_1, data[0], pOverflow);
    308     temp0 = sub(*in0, temp0, pOverflow);
    309 
    310     temp1 = mult(COEFF5_1, temp0, pOverflow);
    311     temp1 = add(data[0], temp1, pOverflow);
    312     data[0] = temp0;
    313 
    314     temp0 = mult(COEFF5_2, data[1], pOverflow);
    315     temp0 = sub(*in1, temp0, pOverflow);
    316 
    317     temp2 = mult(COEFF5_2, temp0, pOverflow);
    318     temp2 = add(data[1], temp2, pOverflow);
    319 
    320     data[1] = temp0;
    321 
    322     temp0 = add(temp1, temp2, pOverflow);
    323     *in0 = shr(temp0, 1, pOverflow);
    324 
    325     temp0 = sub(temp1, temp2, pOverflow);
    326     *in1 = shr(temp0, 1, pOverflow);
    327 }
    328 
    329 
    330 
    331 
    332 /*
    333 ------------------------------------------------------------------------------
    334  FUNCTION NAME: filter3
    335 ------------------------------------------------------------------------------
    336  INPUT AND OUTPUT DEFINITIONS
    337 
    338 
    339  Inputs:
    340     in0 -- array of type Word16 -- input values; output low-pass part
    341     in1 -- array of type Word16 -- input values; output high-pass part
    342     data -- array of type Word16 -- updated filter memory
    343 
    344  Outputs:
    345     in0 -- array of type Word16 -- input values; output low-pass part
    346     in1 -- array of type Word16 -- input values; output high-pass part
    347     data -- array of type Word16 -- updated filter memory
    348     pOverflow -- pointer to type Flag -- overflow indicator
    349 
    350  Returns:
    351     None
    352 
    353  Global Variables Used:
    354     None
    355 
    356  Local Variables Needed:
    357     None
    358 
    359 ------------------------------------------------------------------------------
    360  FUNCTION DESCRIPTION
    361 
    362  Purpose      : Third-order half-band lowpass/highpass filter pair with
    363                 decimation.
    364 ------------------------------------------------------------------------------
    365  REQUIREMENTS
    366 
    367  None
    368 
    369 ------------------------------------------------------------------------------
    370  REFERENCES
    371 
    372  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    373 
    374 ------------------------------------------------------------------------------
    375  PSEUDO-CODE
    376 
    377 
    378 ------------------------------------------------------------------------------
    379  RESOURCES USED [optional]
    380 
    381  When the code is written for a specific target processor the
    382  the resources used should be documented below.
    383 
    384  HEAP MEMORY USED: x bytes
    385 
    386  STACK MEMORY USED: x bytes
    387 
    388  CLOCK CYCLES: (cycle count equation for this function) + (variable
    389                 used to represent cycle count for each subroutine
    390                 called)
    391      where: (cycle count variable) = cycle count for [subroutine
    392                                      name]
    393 
    394 ------------------------------------------------------------------------------
    395  CAUTION [optional]
    396  [State any special notes, constraints or cautions for users of this function]
    397 
    398 ------------------------------------------------------------------------------
    399 */
    400 
    401 static void filter3(
    402     Word16 *in0,      /* i/o : input values; output low-pass part  */
    403     Word16 *in1,      /* i/o : input values; output high-pass part */
    404     Word16 *data,     /* i/o : updated filter memory               */
    405     Flag  *pOverflow  /* o : Flag set when overflow occurs         */
    406 )
    407 {
    408     Word16 temp1;
    409     Word16 temp2;
    410 
    411     temp1 = mult(COEFF3, *data, pOverflow);
    412     temp1 = sub(*in1, temp1, pOverflow);
    413 
    414     temp2 = mult(COEFF3, temp1, pOverflow);
    415     temp2 = add(*data, temp2, pOverflow);
    416 
    417     *data = temp1;
    418 
    419     temp1 = sub(*in0, temp2, pOverflow);
    420 
    421     *in1 = shr(temp1, 1, pOverflow);
    422 
    423     temp1 = add(*in0, temp2, pOverflow);
    424 
    425     *in0 = shr(temp1, 1, pOverflow);
    426 }
    427 
    428 
    429 
    430 
    431 /*
    432 ------------------------------------------------------------------------------
    433  FUNCTION NAME: level_calculation
    434 ------------------------------------------------------------------------------
    435  INPUT AND OUTPUT DEFINITIONS
    436 
    437  Inputs:
    438     data -- array of type Word16 -- signal buffer
    439     sub_level -- pointer to type Word16 -- level calculated at the end of
    440                                            the previous frame
    441 
    442     count1 -- Word16 -- number of samples to be counted
    443     count2 -- Word16 -- number of samples to be counted
    444     ind_m  -- Word16 -- step size for the index of the data buffer
    445     ind_a  -- Word16 -- starting index of the data buffer
    446     scale  -- Word16 -- scaling for the level calculation
    447 
    448  Outputs:
    449     sub_level -- pointer to tyep Word16 -- level of signal calculated from the
    450                                            last (count2 - count1) samples.
    451     pOverflow -- pointer to type Flag -- overflow indicator
    452 
    453  Returns:
    454     signal level
    455 
    456  Global Variables Used:
    457 
    458 
    459  Local Variables Needed:
    460     None
    461 
    462 ------------------------------------------------------------------------------
    463  FUNCTION DESCRIPTION
    464 
    465  Purpose      : Calculate signal level in a sub-band. Level is calculated
    466                 by summing absolute values of the input data.
    467 
    468 ------------------------------------------------------------------------------
    469  REQUIREMENTS
    470 
    471  None
    472 
    473 ------------------------------------------------------------------------------
    474  REFERENCES
    475 
    476  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    477 
    478 ------------------------------------------------------------------------------
    479  PSEUDO-CODE
    480 
    481 
    482 ------------------------------------------------------------------------------
    483  RESOURCES USED [optional]
    484 
    485  When the code is written for a specific target processor the
    486  the resources used should be documented below.
    487 
    488  HEAP MEMORY USED: x bytes
    489 
    490  STACK MEMORY USED: x bytes
    491 
    492  CLOCK CYCLES: (cycle count equation for this function) + (variable
    493                 used to represent cycle count for each subroutine
    494                 called)
    495      where: (cycle count variable) = cycle count for [subroutine
    496                                      name]
    497 
    498 ------------------------------------------------------------------------------
    499  CAUTION [optional]
    500  [State any special notes, constraints or cautions for users of this function]
    501 
    502 ------------------------------------------------------------------------------
    503 */
    504 
    505 static Word16 level_calculation(
    506     Word16 data[],     /* i   : signal buffer                                */
    507     Word16 *sub_level, /* i   : level calculate at the end of                */
    508     /*       the previous frame                           */
    509     /* o   : level of signal calculated from the last     */
    510     /*       (count2 - count1) samples                    */
    511     Word16 count1,     /* i   : number of samples to be counted              */
    512     Word16 count2,     /* i   : number of samples to be counted              */
    513     Word16 ind_m,      /* i   : step size for the index of the data buffer   */
    514     Word16 ind_a,      /* i   : starting index of the data buffer            */
    515     Word16 scale,      /* i   : scaling for the level calculation            */
    516     Flag  *pOverflow   /* o : Flag set when overflow occurs                  */
    517 )
    518 {
    519     Word32 l_temp1;
    520     Word32 l_temp2;
    521     Word16 level;
    522     Word16 i;
    523 
    524     l_temp1 = 0L;
    525 
    526     for (i = count1; i < count2; i++)
    527     {
    528         l_temp1 = L_mac(l_temp1, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
    529     }
    530 
    531     l_temp2 = L_add(l_temp1, L_shl(*sub_level, sub(16, scale, pOverflow), pOverflow), pOverflow);
    532     *sub_level = extract_h(L_shl(l_temp1, scale, pOverflow));
    533 
    534     for (i = 0; i < count1; i++)
    535     {
    536         l_temp2 = L_mac(l_temp2, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
    537     }
    538     level = extract_h(L_shl(l_temp2, scale, pOverflow));
    539 
    540     return level;
    541 }
    542 
    543 
    544 
    545 
    546 /*
    547 ------------------------------------------------------------------------------
    548  FUNCTION NAME: filter_bank
    549 ------------------------------------------------------------------------------
    550  INPUT AND OUTPUT DEFINITIONS
    551 
    552  Inputs:
    553     st -- pointer to type vadState1 --  State struct
    554     in -- array of type Word16 -- input frame
    555 
    556  Outputs:
    557     level -- array of type Word16 -- signal levels at each band
    558     st -- pointer to type vadState1 --  State struct
    559     pOverflow -- pointer to type Flag -- overflow indicator
    560 
    561  Returns:
    562     None
    563 
    564  Global Variables Used:
    565     None
    566 
    567  Local Variables Needed:
    568     None
    569 
    570 ------------------------------------------------------------------------------
    571  FUNCTION DESCRIPTION
    572 
    573  Purpose      : Divides input signal into 9-bands and calculas level of
    574                 the signal in each band
    575 
    576 ------------------------------------------------------------------------------
    577  REQUIREMENTS
    578 
    579  None
    580 
    581 ------------------------------------------------------------------------------
    582  REFERENCES
    583 
    584  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    585 
    586 ------------------------------------------------------------------------------
    587  PSEUDO-CODE
    588 
    589 
    590 ------------------------------------------------------------------------------
    591  RESOURCES USED [optional]
    592 
    593  When the code is written for a specific target processor the
    594  the resources used should be documented below.
    595 
    596  HEAP MEMORY USED: x bytes
    597 
    598  STACK MEMORY USED: x bytes
    599 
    600  CLOCK CYCLES: (cycle count equation for this function) + (variable
    601                 used to represent cycle count for each subroutine
    602                 called)
    603      where: (cycle count variable) = cycle count for [subroutine
    604                                      name]
    605 
    606 ------------------------------------------------------------------------------
    607  CAUTION [optional]
    608  [State any special notes, constraints or cautions for users of this function]
    609 
    610 ------------------------------------------------------------------------------
    611 */
    612 
    613 static void filter_bank(
    614     vadState1 *st,    /* i/o : State struct                    */
    615     Word16 in[],      /* i   : input frame                     */
    616     Word16 level[],   /* 0   : signal levels at each band      */
    617     Flag  *pOverflow  /* o   : Flag set when overflow occurs   */
    618 )
    619 {
    620     Word16 i;
    621     Word16 tmp_buf[FRAME_LEN];
    622 
    623     /* calculate the filter bank */
    624 
    625     first_filter_stage(in, tmp_buf, st->a_data5[0], pOverflow);
    626 
    627     for (i = 0; i < FRAME_LEN / 4; i++)
    628     {
    629         filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1], pOverflow);
    630         filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2], pOverflow);
    631     }
    632     for (i = 0; i < FRAME_LEN / 8; i++)
    633     {
    634         filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0], pOverflow);
    635         filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1], pOverflow);
    636         filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4], pOverflow);
    637     }
    638 
    639     for (i = 0; i < FRAME_LEN / 16; i++)
    640     {
    641         filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2], pOverflow);
    642         filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3], pOverflow);
    643     }
    644 
    645     /* calculate levels in each frequency band */
    646 
    647     /* 3000 - 4000 Hz*/
    648     level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN / 4 - 8,
    649                                  FRAME_LEN / 4, 4, 1, 15, pOverflow);
    650     /* 2500 - 3000 Hz*/
    651     level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN / 8 - 4,
    652                                  FRAME_LEN / 8, 8, 7, 16, pOverflow);
    653     /* 2000 - 2500 Hz*/
    654     level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN / 8 - 4,
    655                                  FRAME_LEN / 8, 8, 3, 16, pOverflow);
    656     /* 1500 - 2000 Hz*/
    657     level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN / 8 - 4,
    658                                  FRAME_LEN / 8, 8, 2, 16, pOverflow);
    659     /* 1000 - 1500 Hz*/
    660     level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN / 8 - 4,
    661                                  FRAME_LEN / 8, 8, 6, 16, pOverflow);
    662     /* 750 - 1000 Hz*/
    663     level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN / 16 - 2,
    664                                  FRAME_LEN / 16, 16, 4, 16, pOverflow);
    665     /* 500 - 750 Hz*/
    666     level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN / 16 - 2,
    667                                  FRAME_LEN / 16, 16, 12, 16, pOverflow);
    668     /* 250 - 500 Hz*/
    669     level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN / 16 - 2,
    670                                  FRAME_LEN / 16, 16, 8, 16, pOverflow);
    671     /* 0 - 250 Hz*/
    672     level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN / 16 - 2,
    673                                  FRAME_LEN / 16, 16, 0, 16, pOverflow);
    674 }
    675 
    676 
    677 
    678 /*
    679 ------------------------------------------------------------------------------
    680  FUNCTION NAME: update_cntrl
    681 ------------------------------------------------------------------------------
    682  INPUT AND OUTPUT DEFINITIONS
    683 
    684  Inputs:
    685     st -- pointer to type vadState1 --  State struct
    686     level -- array of type Word16 -- sub-band levels of the input frame
    687 
    688  Outputs:
    689     st -- pointer to type vadState1 --  State struct
    690     pOverflow -- pointer to type Flag -- overflow indicator
    691 
    692  Returns:
    693     None
    694 
    695  Global Variables Used:
    696     None
    697 
    698  Local Variables Needed:
    699     None
    700 
    701 ------------------------------------------------------------------------------
    702  FUNCTION DESCRIPTION
    703 
    704  Purpose    : Control update of the background noise estimate.
    705  Inputs     : pitch:      flags for pitch detection
    706               stat_count: stationary counter
    707               tone:       flags indicating presence of a tone
    708               complex:      flags for complex  detection
    709               vadreg:     intermediate VAD flags
    710  Output     : stat_count: stationary counter
    711 
    712 
    713 ------------------------------------------------------------------------------
    714  REQUIREMENTS
    715 
    716  None
    717 
    718 ------------------------------------------------------------------------------
    719  REFERENCES
    720 
    721  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    722 
    723 ------------------------------------------------------------------------------
    724  PSEUDO-CODE
    725 
    726 
    727 ------------------------------------------------------------------------------
    728  RESOURCES USED [optional]
    729 
    730  When the code is written for a specific target processor the
    731  the resources used should be documented below.
    732 
    733  HEAP MEMORY USED: x bytes
    734 
    735  STACK MEMORY USED: x bytes
    736 
    737  CLOCK CYCLES: (cycle count equation for this function) + (variable
    738                 used to represent cycle count for each subroutine
    739                 called)
    740      where: (cycle count variable) = cycle count for [subroutine
    741                                      name]
    742 
    743 ------------------------------------------------------------------------------
    744  CAUTION [optional]
    745  [State any special notes, constraints or cautions for users of this function]
    746 
    747 ------------------------------------------------------------------------------
    748 */
    749 
    750 static void update_cntrl(
    751     vadState1 *st,   /* i/o : State struct                       */
    752     Word16 level[],  /* i   : sub-band levels of the input frame */
    753     Flag  *pOverflow /* o   : Flag set when overflow occurs      */
    754 )
    755 {
    756     Word16 i;
    757     Word16 temp;
    758     Word16 stat_rat;
    759     Word16 exp;
    760     Word16 num;
    761     Word16 denom;
    762     Word16 alpha;
    763 
    764     /* handle highband complex signal input  separately       */
    765     /* if ther has been highband correlation for some time    */
    766     /* make sure that the VAD update speed is low for a while */
    767     if (st->complex_warning != 0)
    768     {
    769         if (st->stat_count < CAD_MIN_STAT_COUNT)
    770         {
    771             st->stat_count = CAD_MIN_STAT_COUNT;
    772         }
    773     }
    774     /* NB stat_count is allowed to be decreased by one below again  */
    775     /* deadlock in speech is not possible unless the signal is very */
    776     /* complex and need a high rate                                 */
    777 
    778     /* if fullband pitch or tone have been detected for a while, initialize stat_count */
    779     if (((Word16)(st->pitch & 0x6000) == 0x6000) ||
    780             ((Word16)(st->tone & 0x7c00) == 0x7c00))
    781     {
    782         st->stat_count = STAT_COUNT;
    783     }
    784     else
    785     {
    786         /* if 8 last vad-decisions have been "0", reinitialize stat_count */
    787         if ((st->vadreg & 0x7f80) == 0)
    788         {
    789             st->stat_count = STAT_COUNT;
    790         }
    791         else
    792         {
    793             stat_rat = 0;
    794             for (i = 0; i < COMPLEN; i++)
    795             {
    796                 if (level[i] > st->ave_level[i])
    797                 {
    798                     num = level[i];
    799                     denom = st->ave_level[i];
    800                 }
    801                 else
    802                 {
    803                     num = st->ave_level[i];
    804                     denom = level[i];
    805                 }
    806                 /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
    807                 if (num < STAT_THR_LEVEL)
    808                 {
    809                     num = STAT_THR_LEVEL;
    810                 }
    811                 if (denom < STAT_THR_LEVEL)
    812                 {
    813                     denom = STAT_THR_LEVEL;
    814                 }
    815 
    816                 exp = norm_s(denom);
    817 
    818                 denom = shl(denom, exp, pOverflow);
    819 
    820                 /* stat_rat = num/denom * 64 */
    821                 temp = shr(num, 1, pOverflow);
    822                 temp = div_s(temp, denom);
    823 
    824                 stat_rat = add(stat_rat, shr(temp, sub(8, exp, pOverflow), pOverflow), pOverflow);
    825             }
    826 
    827             /* compare stat_rat with a threshold and update stat_count */
    828             if (stat_rat > STAT_THR)
    829             {
    830                 st->stat_count = STAT_COUNT;
    831             }
    832             else
    833             {
    834                 if ((st->vadreg & 0x4000) != 0)
    835                 {
    836                     if (st->stat_count != 0)
    837                     {
    838                         st->stat_count = sub(st->stat_count, 1, pOverflow);
    839                     }
    840                 }
    841             }
    842         }
    843     }
    844 
    845     /* Update average amplitude estimate for stationarity estimation */
    846     alpha = ALPHA4;
    847     if (st->stat_count == STAT_COUNT)
    848     {
    849         alpha = 32767;
    850     }
    851     else if ((st->vadreg & 0x4000) == 0)
    852     {
    853         alpha = ALPHA5;
    854     }
    855 
    856     for (i = 0; i < COMPLEN; i++)
    857     {
    858         temp = sub(level[i], st->ave_level[i], pOverflow);
    859         temp = mult_r(alpha, temp, pOverflow);
    860 
    861         st->ave_level[i] =
    862             add(
    863                 st->ave_level[i],
    864                 temp,
    865                 pOverflow);
    866     }
    867 }
    868 
    869 
    870 
    871 /*
    872 ------------------------------------------------------------------------------
    873  FUNCTION NAME: hangover_addition
    874 ------------------------------------------------------------------------------
    875  INPUT AND OUTPUT DEFINITIONS
    876 
    877  Inputs:
    878     noise_level -- Word16 -- average level of the noise estimates
    879     low_power   -- Word16 -- flag power of the input frame
    880 
    881  Outputs:
    882     st -- pointer to type vadState1 --  State struct
    883     pOverflow -- pointer to type Flag -- overflow indicato
    884 
    885  Returns:
    886     VAD_flag indicating final VAD decision (Word16)
    887 
    888  Global Variables Used:
    889     None
    890 
    891  Local Variables Needed:
    892     None
    893 
    894 ------------------------------------------------------------------------------
    895  FUNCTION DESCRIPTION
    896 
    897  Function     : hangover_addition
    898  Purpose      : Add hangover for complex signal or after speech bursts
    899  Inputs       : burst_count:  counter for the length of speech bursts
    900                 hang_count:   hangover counter
    901                 vadreg:       intermediate VAD decision
    902  Outputs      : burst_count:  counter for the length of speech bursts
    903                 hang_count:   hangover counter
    904  Return value : VAD_flag indicating final VAD decision
    905 
    906 
    907 ------------------------------------------------------------------------------
    908  REQUIREMENTS
    909 
    910  None
    911 
    912 ------------------------------------------------------------------------------
    913  REFERENCES
    914 
    915  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    916 
    917 ------------------------------------------------------------------------------
    918  PSEUDO-CODE
    919 
    920 
    921 ------------------------------------------------------------------------------
    922  RESOURCES USED [optional]
    923 
    924  When the code is written for a specific target processor the
    925  the resources used should be documented below.
    926 
    927  HEAP MEMORY USED: x bytes
    928 
    929  STACK MEMORY USED: x bytes
    930 
    931  CLOCK CYCLES: (cycle count equation for this function) + (variable
    932                 used to represent cycle count for each subroutine
    933                 called)
    934      where: (cycle count variable) = cycle count for [subroutine
    935                                      name]
    936 
    937 ------------------------------------------------------------------------------
    938  CAUTION [optional]
    939  [State any special notes, constraints or cautions for users of this function]
    940 
    941 ------------------------------------------------------------------------------
    942 */
    943 
    944 static Word16 hangover_addition(
    945     vadState1 *st,      /* i/o : State struct                     */
    946     Word16 noise_level, /* i   : average level of the noise       */
    947     /*       estimates                        */
    948     Word16 low_power,   /* i   : flag power of the input frame    */
    949     Flag  *pOverflow    /* o   : Flag set when overflow occurs    */
    950 )
    951 {
    952     Word16 hang_len;
    953     Word16 burst_len;
    954 
    955     /*
    956        Calculate burst_len and hang_len
    957        burst_len: number of consecutive intermediate vad flags with "1"-decision
    958                   required for hangover addition
    959        hang_len:  length of the hangover
    960        */
    961 
    962     if (noise_level > HANG_NOISE_THR)
    963     {
    964         burst_len = BURST_LEN_HIGH_NOISE;
    965         hang_len = HANG_LEN_HIGH_NOISE;
    966     }
    967     else
    968     {
    969         burst_len = BURST_LEN_LOW_NOISE;
    970         hang_len = HANG_LEN_LOW_NOISE;
    971     }
    972 
    973     /* if the input power (pow_sum) is lower than a threshold, clear
    974        counters and set VAD_flag to "0"  "fast exit"                 */
    975     if (low_power != 0)
    976     {
    977         st->burst_count = 0;
    978         st->hang_count = 0;
    979         st->complex_hang_count = 0;
    980         st->complex_hang_timer = 0;
    981         return 0;
    982     }
    983 
    984     if (st->complex_hang_timer > CVAD_HANG_LIMIT)
    985     {
    986         if (st->complex_hang_count < CVAD_HANG_LENGTH)
    987         {
    988             st->complex_hang_count = CVAD_HANG_LENGTH;
    989         }
    990     }
    991 
    992     /* long time very complex signal override VAD output function */
    993     if (st->complex_hang_count != 0)
    994     {
    995         st->burst_count = BURST_LEN_HIGH_NOISE;
    996         st->complex_hang_count = sub(st->complex_hang_count, 1, pOverflow);
    997         return 1;
    998     }
    999     else
   1000     {
   1001         /* let hp_corr work in from a noise_period indicated by the VAD */
   1002         if (((st->vadreg & 0x3ff0) == 0) &&
   1003                 (st->corr_hp_fast > CVAD_THRESH_IN_NOISE))
   1004         {
   1005             return 1;
   1006         }
   1007     }
   1008 
   1009     /* update the counters (hang_count, burst_count) */
   1010     if ((st->vadreg & 0x4000) != 0)
   1011     {
   1012         st->burst_count = add(st->burst_count, 1, pOverflow);
   1013 
   1014         if (st->burst_count >= burst_len)
   1015         {
   1016             st->hang_count = hang_len;
   1017         }
   1018         return 1;
   1019     }
   1020     else
   1021     {
   1022         st->burst_count = 0;
   1023         if (st->hang_count > 0)
   1024         {
   1025             st->hang_count = sub(st->hang_count, 1, pOverflow);
   1026             return 1;
   1027         }
   1028     }
   1029     return 0;
   1030 }
   1031 
   1032 
   1033 
   1034 /*
   1035 ------------------------------------------------------------------------------
   1036  FUNCTION NAME: noise_estimate_update
   1037 ------------------------------------------------------------------------------
   1038  INPUT AND OUTPUT DEFINITIONS
   1039 
   1040  Inputs:
   1041     st -- pointer to type vadState1 --  State struct
   1042     level -- array of type Word16 -- sub-band levels of the input frame
   1043 
   1044  Outputs:
   1045     st -- pointer to type vadState1 --  State struct
   1046     pOverflow -- pointer to type Flag -- overflow indicator
   1047 
   1048  Returns:
   1049     None
   1050 
   1051  Global Variables Used:
   1052     None
   1053 
   1054  Local Variables Needed:
   1055     None
   1056 
   1057 ------------------------------------------------------------------------------
   1058  FUNCTION DESCRIPTION
   1059 
   1060  Purpose    : Update of background noise estimate
   1061  Inputs     : bckr_est:   background noise estimate
   1062               pitch:      flags for pitch detection
   1063               stat_count: stationary counter
   1064  Outputs    : bckr_est:   background noise estimate
   1065 
   1066 ------------------------------------------------------------------------------
   1067  REQUIREMENTS
   1068 
   1069  None
   1070 
   1071 ------------------------------------------------------------------------------
   1072  REFERENCES
   1073 
   1074  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1075 
   1076 ------------------------------------------------------------------------------
   1077  PSEUDO-CODE
   1078 
   1079 
   1080 ------------------------------------------------------------------------------
   1081  RESOURCES USED [optional]
   1082 
   1083  When the code is written for a specific target processor the
   1084  the resources used should be documented below.
   1085 
   1086  HEAP MEMORY USED: x bytes
   1087 
   1088  STACK MEMORY USED: x bytes
   1089 
   1090  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1091                 used to represent cycle count for each subroutine
   1092                 called)
   1093      where: (cycle count variable) = cycle count for [subroutine
   1094                                      name]
   1095 
   1096 ------------------------------------------------------------------------------
   1097  CAUTION [optional]
   1098  [State any special notes, constraints or cautions for users of this function]
   1099 
   1100 ------------------------------------------------------------------------------
   1101 */
   1102 
   1103 static void noise_estimate_update(
   1104     vadState1 *st,    /* i/o : State struct                       */
   1105     Word16 level[],   /* i   : sub-band levels of the input frame */
   1106     Flag  *pOverflow  /* o : Flag set when overflow occurs        */
   1107 )
   1108 {
   1109     Word16 i;
   1110     Word16 alpha_up;
   1111     Word16 alpha_down;
   1112     Word16 bckr_add;
   1113 
   1114     /* Control update of bckr_est[] */
   1115     update_cntrl(st, level, pOverflow);
   1116 
   1117     /* Choose update speed */
   1118     bckr_add = 2;
   1119 
   1120     if (((0x7800 & st->vadreg) == 0) &&
   1121             ((st->pitch & 0x7800) == 0)
   1122             && (st->complex_hang_count == 0))
   1123     {
   1124         alpha_up = ALPHA_UP1;
   1125         alpha_down = ALPHA_DOWN1;
   1126     }
   1127     else
   1128     {
   1129         if ((st->stat_count == 0)
   1130                 && (st->complex_hang_count == 0))
   1131         {
   1132             alpha_up = ALPHA_UP2;
   1133             alpha_down = ALPHA_DOWN2;
   1134         }
   1135         else
   1136         {
   1137             alpha_up = 0;
   1138             alpha_down = ALPHA3;
   1139             bckr_add = 0;
   1140         }
   1141     }
   1142 
   1143     /* Update noise estimate (bckr_est) */
   1144     for (i = 0; i < COMPLEN; i++)
   1145     {
   1146         Word16 temp;
   1147 
   1148         temp = sub(st->old_level[i], st->bckr_est[i], pOverflow);
   1149 
   1150         if (temp < 0)
   1151         { /* update downwards*/
   1152             temp = mult_r(alpha_down, temp, pOverflow);
   1153             temp = add(st->bckr_est[i], temp, pOverflow);
   1154 
   1155             st->bckr_est[i] = add(-2, temp, pOverflow);
   1156 
   1157             /* limit minimum value of the noise estimate to NOISE_MIN */
   1158             if (st->bckr_est[i] < NOISE_MIN)
   1159             {
   1160                 st->bckr_est[i] = NOISE_MIN;
   1161             }
   1162         }
   1163         else
   1164         { /* update upwards */
   1165             temp = mult_r(alpha_up, temp, pOverflow);
   1166             temp = add(st->bckr_est[i], temp, pOverflow);
   1167             st->bckr_est[i] = add(bckr_add, temp, pOverflow);
   1168 
   1169             /* limit maximum value of the noise estimate to NOISE_MAX */
   1170             if (st->bckr_est[i] > NOISE_MAX)
   1171             {
   1172                 st->bckr_est[i] = NOISE_MAX;
   1173             }
   1174         }
   1175     }
   1176 
   1177     /* Update signal levels of the previous frame (old_level) */
   1178     for (i = 0; i < COMPLEN; i++)
   1179     {
   1180         st->old_level[i] = level[i];
   1181     }
   1182 }
   1183 
   1184 
   1185 /*
   1186 ------------------------------------------------------------------------------
   1187  FUNCTION NAME: complex_estimate_adapt
   1188 ------------------------------------------------------------------------------
   1189  INPUT AND OUTPUT DEFINITIONS
   1190 
   1191  Inputs:
   1192     st -- pointer to type vadState1 --  State struct
   1193     low_power -- Word16 -- very low level flag of the input frame
   1194 
   1195  Outputs:
   1196     st -- pointer to type vadState1 --  State struct
   1197     pOverflow -- pointer to type Flag -- overflow indicator
   1198 
   1199  Returns:
   1200     None
   1201 
   1202  Global Variables Used:
   1203     None
   1204 
   1205  Local Variables Needed:
   1206     None
   1207 
   1208 ------------------------------------------------------------------------------
   1209  FUNCTION DESCRIPTION
   1210 
   1211  Function   : complex_estimate_adapt
   1212  Purpose    : Update/adapt of complex signal estimate
   1213  Inputs     : low_power:   low signal power flag
   1214  Outputs    : st->corr_hp_fast:   long term complex signal estimate
   1215 
   1216 ------------------------------------------------------------------------------
   1217  REQUIREMENTS
   1218 
   1219  None
   1220 
   1221 ------------------------------------------------------------------------------
   1222  REFERENCES
   1223 
   1224  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1225 
   1226 ------------------------------------------------------------------------------
   1227  PSEUDO-CODE
   1228 
   1229 
   1230 ------------------------------------------------------------------------------
   1231  RESOURCES USED [optional]
   1232 
   1233  When the code is written for a specific target processor the
   1234  the resources used should be documented below.
   1235 
   1236  HEAP MEMORY USED: x bytes
   1237 
   1238  STACK MEMORY USED: x bytes
   1239 
   1240  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1241                 used to represent cycle count for each subroutine
   1242                 called)
   1243      where: (cycle count variable) = cycle count for [subroutine
   1244                                      name]
   1245 
   1246 ------------------------------------------------------------------------------
   1247  CAUTION [optional]
   1248  [State any special notes, constraints or cautions for users of this function]
   1249 
   1250 ------------------------------------------------------------------------------
   1251 */
   1252 
   1253 static void complex_estimate_adapt(
   1254     vadState1 *st,      /* i/o : VAD state struct                       */
   1255     Word16 low_power,   /* i   : very low level flag of the input frame */
   1256     Flag  *pOverflow    /* o : Flag set when overflow occurs            */
   1257 )
   1258 {
   1259     Word16 alpha;            /* Q15 */
   1260     Word32 L_tmp;            /* Q31 */
   1261 
   1262 
   1263     /* adapt speed on own state */
   1264     if (st->best_corr_hp < st->corr_hp_fast) /* decrease */
   1265     {
   1266         if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
   1267         {  /* low state  */
   1268             alpha = CVAD_ADAPT_FAST;
   1269         }
   1270         else
   1271         {  /* high state */
   1272             alpha = CVAD_ADAPT_REALLY_FAST;
   1273         }
   1274     }
   1275     else  /* increase */
   1276     {
   1277         if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
   1278         {
   1279             alpha = CVAD_ADAPT_FAST;
   1280         }
   1281         else
   1282         {
   1283             alpha = CVAD_ADAPT_SLOW;
   1284         }
   1285     }
   1286 
   1287     L_tmp = L_deposit_h(st->corr_hp_fast);
   1288     L_tmp = L_msu(L_tmp, alpha, st->corr_hp_fast, pOverflow);
   1289     L_tmp = L_mac(L_tmp, alpha, st->best_corr_hp, pOverflow);
   1290     st->corr_hp_fast = pv_round(L_tmp, pOverflow);           /* Q15 */
   1291 
   1292     if (st->corr_hp_fast < CVAD_MIN_CORR)
   1293     {
   1294         st->corr_hp_fast = CVAD_MIN_CORR;
   1295     }
   1296 
   1297     if (low_power != 0)
   1298     {
   1299         st->corr_hp_fast = CVAD_MIN_CORR;
   1300     }
   1301 }
   1302 
   1303 
   1304 /*
   1305 ------------------------------------------------------------------------------
   1306  FUNCTION NAME: complex_vad
   1307 ------------------------------------------------------------------------------
   1308  INPUT AND OUTPUT DEFINITIONS
   1309 
   1310  Inputs:
   1311     st -- pointer to type vadState1 --  State struct
   1312     low_power -- Word16 -- flag power of the input frame
   1313 
   1314  Outputs:
   1315     st -- pointer to type vadState1 --  State struct
   1316     pOverflow -- pointer to type Flag -- overflow indicator
   1317 
   1318 
   1319  Returns:
   1320     the complex background decision
   1321 
   1322  Global Variables Used:
   1323     None
   1324 
   1325  Local Variables Needed:
   1326     None
   1327 
   1328 ------------------------------------------------------------------------------
   1329  FUNCTION DESCRIPTION
   1330 
   1331  Purpose      : complex background decision
   1332  Return value : the complex background decision
   1333 
   1334 ------------------------------------------------------------------------------
   1335  REQUIREMENTS
   1336 
   1337  None
   1338 
   1339 ------------------------------------------------------------------------------
   1340  REFERENCES
   1341 
   1342  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1343 
   1344 ------------------------------------------------------------------------------
   1345  PSEUDO-CODE
   1346 
   1347 
   1348 ------------------------------------------------------------------------------
   1349  RESOURCES USED [optional]
   1350 
   1351  When the code is written for a specific target processor the
   1352  the resources used should be documented below.
   1353 
   1354  HEAP MEMORY USED: x bytes
   1355 
   1356  STACK MEMORY USED: x bytes
   1357 
   1358  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1359                 used to represent cycle count for each subroutine
   1360                 called)
   1361      where: (cycle count variable) = cycle count for [subroutine
   1362                                      name]
   1363 
   1364 ------------------------------------------------------------------------------
   1365  CAUTION [optional]
   1366  [State any special notes, constraints or cautions for users of this function]
   1367 
   1368 ------------------------------------------------------------------------------
   1369 */
   1370 
   1371 static Word16 complex_vad(
   1372     vadState1 *st,    /* i/o : VAD state struct              */
   1373     Word16 low_power, /* i   : flag power of the input frame */
   1374     Flag  *pOverflow  /* o : Flag set when overflow occurs   */
   1375 )
   1376 {
   1377     st->complex_high = shr(st->complex_high, 1, pOverflow);
   1378     st->complex_low = shr(st->complex_low, 1, pOverflow);
   1379 
   1380     if (low_power == 0)
   1381     {
   1382         if (st->corr_hp_fast > CVAD_THRESH_ADAPT_HIGH)
   1383         {
   1384             st->complex_high |= 0x4000;
   1385         }
   1386 
   1387         if (st->corr_hp_fast > CVAD_THRESH_ADAPT_LOW)
   1388         {
   1389             st->complex_low |= 0x4000;
   1390         }
   1391     }
   1392 
   1393     if (st->corr_hp_fast > CVAD_THRESH_HANG)
   1394     {
   1395         st->complex_hang_timer = add(st->complex_hang_timer, 1, pOverflow);
   1396     }
   1397     else
   1398     {
   1399         st->complex_hang_timer =  0;
   1400     }
   1401 
   1402     return ((Word16)(st->complex_high & 0x7f80) == 0x7f80 ||
   1403             (Word16)(st->complex_low & 0x7fff) == 0x7fff);
   1404 }
   1405 
   1406 
   1407 /*
   1408 ------------------------------------------------------------------------------
   1409  FUNCTION NAME: vad_decision
   1410 ------------------------------------------------------------------------------
   1411  INPUT AND OUTPUT DEFINITIONS
   1412 
   1413  Inputs:
   1414     st -- pointer to type vadState1 --  State struct
   1415     level -- array of type Word16 -- sub-band levels of the input frame
   1416     pow_sum -- Word32 -- power of the input frame
   1417 
   1418  Outputs:
   1419     st -- pointer to type vadState1 --  State struct
   1420     pOverflow -- pointer to type Flag -- overflow indicator
   1421 
   1422  Returns:
   1423     VAD_flag (Word16)
   1424 
   1425  Global Variables Used:
   1426     None
   1427 
   1428  Local Variables Needed:
   1429     None
   1430 
   1431 ------------------------------------------------------------------------------
   1432  FUNCTION DESCRIPTION
   1433 
   1434  Purpose      : Calculates VAD_flag
   1435  Inputs       : bckr_est:    background noise estimate
   1436                 vadreg:      intermediate VAD flags
   1437  Outputs      : noise_level: average level of the noise estimates
   1438                 vadreg:      intermediate VAD flags
   1439  Return value : VAD_flag
   1440 
   1441 ------------------------------------------------------------------------------
   1442  REQUIREMENTS
   1443 
   1444  None
   1445 
   1446 ------------------------------------------------------------------------------
   1447  REFERENCES
   1448 
   1449  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1450 
   1451 ------------------------------------------------------------------------------
   1452  PSEUDO-CODE
   1453 
   1454 
   1455 ------------------------------------------------------------------------------
   1456  RESOURCES USED [optional]
   1457 
   1458  When the code is written for a specific target processor the
   1459  the resources used should be documented below.
   1460 
   1461  HEAP MEMORY USED: x bytes
   1462 
   1463  STACK MEMORY USED: x bytes
   1464 
   1465  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1466                 used to represent cycle count for each subroutine
   1467                 called)
   1468      where: (cycle count variable) = cycle count for [subroutine
   1469                                      name]
   1470 
   1471 ------------------------------------------------------------------------------
   1472  CAUTION [optional]
   1473  [State any special notes, constraints or cautions for users of this function]
   1474 
   1475 ------------------------------------------------------------------------------
   1476 */
   1477 
   1478 static Word16 vad_decision(
   1479     vadState1 *st,         /* i/o : State struct                       */
   1480     Word16 level[COMPLEN], /* i   : sub-band levels of the input frame */
   1481     Word32 pow_sum,        /* i   : power of the input frame           */
   1482     Flag  *pOverflow       /* o : Flag set when overflow occurs        */
   1483 )
   1484 {
   1485     Word16 i;
   1486     Word16 snr_sum;
   1487     Word32 L_temp;
   1488     Word16 vad_thr;
   1489     Word16 temp;
   1490     Word16 noise_level;
   1491     Word16 low_power_flag;
   1492     Word16 temp1;
   1493 
   1494     /*
   1495        Calculate squared sum of the input levels (level)
   1496        divided by the background noise components (bckr_est).
   1497        */
   1498     L_temp = 0;
   1499 
   1500     for (i = 0; i < COMPLEN; i++)
   1501     {
   1502         Word16 exp;
   1503 
   1504         exp = norm_s(st->bckr_est[i]);
   1505         temp = shl(st->bckr_est[i], exp, pOverflow);
   1506         temp = div_s(shr(level[i], 1, pOverflow), temp);
   1507         temp = shl(temp, sub(exp, UNIRSHFT - 1, pOverflow), pOverflow);
   1508         L_temp = L_mac(L_temp, temp, temp, pOverflow);
   1509     }
   1510 
   1511     snr_sum = extract_h(L_shl(L_temp, 6, pOverflow));
   1512     snr_sum = mult(snr_sum, INV_COMPLEN, pOverflow);
   1513 
   1514     /* Calculate average level of estimated background noise */
   1515     L_temp = 0;
   1516     for (i = 0; i < COMPLEN; i++)
   1517     {
   1518         L_temp = L_add(L_temp, st->bckr_est[i], pOverflow);
   1519     }
   1520 
   1521     noise_level = extract_h(L_shl(L_temp, 13, pOverflow));
   1522 
   1523     /* Calculate VAD threshold */
   1524     temp1 = sub(noise_level, VAD_P1, pOverflow);
   1525     temp1 = mult(VAD_SLOPE, temp1, pOverflow);
   1526     vad_thr = add(temp1, VAD_THR_HIGH, pOverflow);
   1527 
   1528     if (vad_thr < VAD_THR_LOW)
   1529     {
   1530         vad_thr = VAD_THR_LOW;
   1531     }
   1532 
   1533     /* Shift VAD decision register */
   1534     st->vadreg = shr(st->vadreg, 1, pOverflow);
   1535 
   1536     /* Make intermediate VAD decision */
   1537     if (snr_sum > vad_thr)
   1538     {
   1539         st->vadreg |= 0x4000;
   1540     }
   1541     /* primary vad decsion made */
   1542 
   1543     /* check if the input power (pow_sum) is lower than a threshold" */
   1544     if (L_sub(pow_sum, VAD_POW_LOW, pOverflow) < 0)
   1545     {
   1546         low_power_flag = 1;
   1547     }
   1548     else
   1549     {
   1550         low_power_flag = 0;
   1551     }
   1552 
   1553     /* update complex signal estimate st->corr_hp_fast and hangover reset timer using */
   1554     /* low_power_flag and corr_hp_fast  and various adaptation speeds                 */
   1555     complex_estimate_adapt(st, low_power_flag, pOverflow);
   1556 
   1557     /* check multiple thresholds of the st->corr_hp_fast value */
   1558     st->complex_warning = complex_vad(st, low_power_flag, pOverflow);
   1559 
   1560     /* Update speech subband vad background noise estimates */
   1561     noise_estimate_update(st, level, pOverflow);
   1562 
   1563     /*  Add speech and complex hangover and return speech VAD_flag */
   1564     /*  long term complex hangover may be added */
   1565     st->speech_vad_decision = hangover_addition(st, noise_level, low_power_flag, pOverflow);
   1566 
   1567     return (st->speech_vad_decision);
   1568 }
   1569 
   1570 
   1571 /*
   1572 ------------------------------------------------------------------------------
   1573  FUNCTION NAME: vad1_init
   1574 ------------------------------------------------------------------------------
   1575  INPUT AND OUTPUT DEFINITIONS
   1576 
   1577  Inputs:
   1578     state -- double pointer to type vadState1 -- pointer to memory to
   1579                                                  be initialized.
   1580 
   1581  Outputs:
   1582     state -- points to initalized area in memory.
   1583 
   1584  Returns:
   1585     None
   1586 
   1587  Global Variables Used:
   1588     None
   1589 
   1590  Local Variables Needed:
   1591     None
   1592 
   1593 ------------------------------------------------------------------------------
   1594  FUNCTION DESCRIPTION
   1595 
   1596  Allocates state memory and initializes state memory
   1597 
   1598 ------------------------------------------------------------------------------
   1599  REQUIREMENTS
   1600 
   1601  None
   1602 
   1603 ------------------------------------------------------------------------------
   1604  REFERENCES
   1605 
   1606  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1607 
   1608 ------------------------------------------------------------------------------
   1609  PSEUDO-CODE
   1610 
   1611 
   1612 ------------------------------------------------------------------------------
   1613  RESOURCES USED [optional]
   1614 
   1615  When the code is written for a specific target processor the
   1616  the resources used should be documented below.
   1617 
   1618  HEAP MEMORY USED: x bytes
   1619 
   1620  STACK MEMORY USED: x bytes
   1621 
   1622  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1623                 used to represent cycle count for each subroutine
   1624                 called)
   1625      where: (cycle count variable) = cycle count for [subroutine
   1626                                      name]
   1627 
   1628 ------------------------------------------------------------------------------
   1629  CAUTION [optional]
   1630  [State any special notes, constraints or cautions for users of this function]
   1631 
   1632 ------------------------------------------------------------------------------
   1633 */
   1634 
   1635 Word16 vad1_init(vadState1 **state)
   1636 {
   1637     vadState1* s;
   1638 
   1639     if (state == (vadState1 **) NULL)
   1640     {
   1641         return -1;
   1642     }
   1643     *state = NULL;
   1644 
   1645     /* allocate memory */
   1646     if ((s = (vadState1 *) malloc(sizeof(vadState1))) == NULL)
   1647     {
   1648         return -1;
   1649     }
   1650 
   1651     vad1_reset(s);
   1652 
   1653     *state = s;
   1654 
   1655     return 0;
   1656 }
   1657 
   1658 /*
   1659 ------------------------------------------------------------------------------
   1660  FUNCTION NAME: vad1_reset
   1661 ------------------------------------------------------------------------------
   1662  INPUT AND OUTPUT DEFINITIONS
   1663 
   1664  Inputs:
   1665     state -- pointer to type vadState1 --  State struct
   1666 
   1667  Outputs:
   1668     state -- pointer to type vadState1 --  State struct
   1669 
   1670  Returns:
   1671     None
   1672 
   1673  Global Variables Used:
   1674     None
   1675 
   1676  Local Variables Needed:
   1677     None
   1678 
   1679 ------------------------------------------------------------------------------
   1680  FUNCTION DESCRIPTION
   1681 
   1682  Purpose:    Resets state memory to zero
   1683 
   1684 ------------------------------------------------------------------------------
   1685  REQUIREMENTS
   1686 
   1687  None
   1688 
   1689 ------------------------------------------------------------------------------
   1690  REFERENCES
   1691 
   1692  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1693 
   1694 ------------------------------------------------------------------------------
   1695  PSEUDO-CODE
   1696 
   1697 
   1698 ------------------------------------------------------------------------------
   1699  RESOURCES USED [optional]
   1700 
   1701  When the code is written for a specific target processor the
   1702  the resources used should be documented below.
   1703 
   1704  HEAP MEMORY USED: x bytes
   1705 
   1706  STACK MEMORY USED: x bytes
   1707 
   1708  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1709                 used to represent cycle count for each subroutine
   1710                 called)
   1711      where: (cycle count variable) = cycle count for [subroutine
   1712                                      name]
   1713 
   1714 ------------------------------------------------------------------------------
   1715  CAUTION [optional]
   1716  [State any special notes, constraints or cautions for users of this function]
   1717 
   1718 ------------------------------------------------------------------------------
   1719 */
   1720 
   1721 Word16 vad1_reset(vadState1 *state)
   1722 {
   1723     Word16 i;
   1724     Word16 j;
   1725 
   1726     if (state == (vadState1 *) NULL)
   1727     {
   1728         return -1;
   1729     }
   1730 
   1731     /* Initialize pitch detection variables */
   1732     state->oldlag_count = 0;
   1733     state->oldlag = 0;
   1734     state->pitch = 0;
   1735     state->tone = 0;
   1736 
   1737     state->complex_high = 0;
   1738     state->complex_low = 0;
   1739     state->complex_hang_timer = 0;
   1740 
   1741     state->vadreg = 0;
   1742 
   1743     state->stat_count = 0;
   1744     state->burst_count = 0;
   1745     state->hang_count = 0;
   1746     state->complex_hang_count = 0;
   1747 
   1748     /* initialize memory used by the filter bank */
   1749     for (i = 0; i < 3; i++)
   1750     {
   1751         for (j = 0; j < 2; j++)
   1752         {
   1753             state->a_data5[i][j] = 0;
   1754         }
   1755     }
   1756 
   1757     for (i = 0; i < 5; i++)
   1758     {
   1759         state->a_data3[i] = 0;
   1760     }
   1761 
   1762     /* initialize the rest of the memory */
   1763     for (i = 0; i < COMPLEN; i++)
   1764     {
   1765         state->bckr_est[i] = NOISE_INIT;
   1766         state->old_level[i] = NOISE_INIT;
   1767         state->ave_level[i] = NOISE_INIT;
   1768         state->sub_level[i] = 0;
   1769     }
   1770 
   1771     state->best_corr_hp = CVAD_LOWPOW_RESET;
   1772 
   1773     state->speech_vad_decision = 0;
   1774     state->complex_warning = 0;
   1775     state->sp_burst_count = 0;
   1776 
   1777     state->corr_hp_fast = CVAD_LOWPOW_RESET;
   1778 
   1779     return 0;
   1780 }
   1781 
   1782 
   1783 /*
   1784 ------------------------------------------------------------------------------
   1785  FUNCTION NAME: vad1_exit
   1786 ------------------------------------------------------------------------------
   1787  INPUT AND OUTPUT DEFINITIONS
   1788 
   1789  Inputs:
   1790     state -- pointer to type vadState1 --  State struct
   1791 
   1792  Outputs:
   1793     None
   1794 
   1795  Returns:
   1796     None
   1797 
   1798  Global Variables Used:
   1799     None
   1800 
   1801  Local Variables Needed:
   1802     None
   1803 
   1804 ------------------------------------------------------------------------------
   1805  FUNCTION DESCRIPTION
   1806 
   1807     The memory used for state memory is freed
   1808 
   1809 ------------------------------------------------------------------------------
   1810  REQUIREMENTS
   1811 
   1812  None
   1813 
   1814 ------------------------------------------------------------------------------
   1815  REFERENCES
   1816 
   1817  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1818 
   1819 ------------------------------------------------------------------------------
   1820  PSEUDO-CODE
   1821 
   1822 
   1823 ------------------------------------------------------------------------------
   1824  RESOURCES USED [optional]
   1825 
   1826  When the code is written for a specific target processor the
   1827  the resources used should be documented below.
   1828 
   1829  HEAP MEMORY USED: x bytes
   1830 
   1831  STACK MEMORY USED: x bytes
   1832 
   1833  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1834                 used to represent cycle count for each subroutine
   1835                 called)
   1836      where: (cycle count variable) = cycle count for [subroutine
   1837                                      name]
   1838 
   1839 ------------------------------------------------------------------------------
   1840  CAUTION [optional]
   1841  [State any special notes, constraints or cautions for users of this function]
   1842 
   1843 ------------------------------------------------------------------------------
   1844 */
   1845 
   1846 void vad1_exit(vadState1 **state)
   1847 {
   1848     if (state == NULL || *state == NULL)
   1849         return;
   1850 
   1851     /* deallocate memory */
   1852     free(*state);
   1853     *state = NULL;
   1854 
   1855     return;
   1856 }
   1857 
   1858 
   1859 /*
   1860 ------------------------------------------------------------------------------
   1861  FUNCTION NAME: vad_complex_detection_update
   1862 ------------------------------------------------------------------------------
   1863  INPUT AND OUTPUT DEFINITIONS
   1864 
   1865  Inputs:
   1866     best_corr_hp -- Word16 -- best Corr
   1867     state -- pointer to type vadState1 --  State struct
   1868 
   1869  Outputs:
   1870     state -- pointer to type vadState1 --  State struct
   1871 
   1872  Returns:
   1873     None
   1874 
   1875  Global Variables Used:
   1876     None
   1877 
   1878  Local Variables Needed:
   1879     None
   1880 
   1881 ------------------------------------------------------------------------------
   1882  FUNCTION DESCRIPTION
   1883 
   1884  Purpose      : update vad->bestCorr_hp  complex signal feature state
   1885 ------------------------------------------------------------------------------
   1886  REQUIREMENTS
   1887 
   1888  None
   1889 
   1890 ------------------------------------------------------------------------------
   1891  REFERENCES
   1892 
   1893  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1894 
   1895 ------------------------------------------------------------------------------
   1896  PSEUDO-CODE
   1897 
   1898 
   1899 ------------------------------------------------------------------------------
   1900  RESOURCES USED [optional]
   1901 
   1902  When the code is written for a specific target processor the
   1903  the resources used should be documented below.
   1904 
   1905  HEAP MEMORY USED: x bytes
   1906 
   1907  STACK MEMORY USED: x bytes
   1908 
   1909  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1910                 used to represent cycle count for each subroutine
   1911                 called)
   1912      where: (cycle count variable) = cycle count for [subroutine
   1913                                      name]
   1914 
   1915 ------------------------------------------------------------------------------
   1916  CAUTION [optional]
   1917  [State any special notes, constraints or cautions for users of this function]
   1918 
   1919 ------------------------------------------------------------------------------
   1920 */
   1921 
   1922 void vad_complex_detection_update(
   1923     vadState1 *st,       /* i/o : State struct */
   1924     Word16 best_corr_hp) /* i   : best Corr    */
   1925 {
   1926     st->best_corr_hp = best_corr_hp;
   1927 }
   1928 
   1929 
   1930 
   1931 /*
   1932 ------------------------------------------------------------------------------
   1933  FUNCTION NAME: vad_tone_detection
   1934 ------------------------------------------------------------------------------
   1935  INPUT AND OUTPUT DEFINITIONS
   1936 
   1937  Inputs:
   1938     st -- pointer to type vadState1 --  State struct
   1939     t0 -- Word32 -- autocorrelation maxima
   1940     t1 -- Word32 -- energy
   1941 
   1942  Outputs:
   1943     st -- pointer to type vadState1 --  State struct
   1944     pOverflow -- pointer to type Flag -- overflow indicator
   1945 
   1946  Returns:
   1947     None
   1948 
   1949  Global Variables Used:
   1950     None
   1951 
   1952  Local Variables Needed:
   1953     None
   1954 
   1955 ------------------------------------------------------------------------------
   1956  FUNCTION DESCRIPTION
   1957 
   1958  Purpose      : Set tone flag if pitch gain is high. This is used to detect
   1959                 signaling tones and other signals with high pitch gain.
   1960  Inputs       : tone: flags indicating presence of a tone
   1961  Outputs      : tone: flags indicating presence of a tone
   1962 ------------------------------------------------------------------------------
   1963  REQUIREMENTS
   1964 
   1965  None
   1966 
   1967 ------------------------------------------------------------------------------
   1968  REFERENCES
   1969 
   1970  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   1971 
   1972 ------------------------------------------------------------------------------
   1973  PSEUDO-CODE
   1974 
   1975 
   1976 ------------------------------------------------------------------------------
   1977  RESOURCES USED [optional]
   1978 
   1979  When the code is written for a specific target processor the
   1980  the resources used should be documented below.
   1981 
   1982  HEAP MEMORY USED: x bytes
   1983 
   1984  STACK MEMORY USED: x bytes
   1985 
   1986  CLOCK CYCLES: (cycle count equation for this function) + (variable
   1987                 used to represent cycle count for each subroutine
   1988                 called)
   1989      where: (cycle count variable) = cycle count for [subroutine
   1990                                      name]
   1991 
   1992 ------------------------------------------------------------------------------
   1993  CAUTION [optional]
   1994  [State any special notes, constraints or cautions for users of this function]
   1995 
   1996 ------------------------------------------------------------------------------
   1997 */
   1998 
   1999 void vad_tone_detection(
   2000     vadState1 *st,    /* i/o : State struct                       */
   2001     Word32 t0,        /* i   : autocorrelation maxima             */
   2002     Word32 t1,        /* i   : energy                             */
   2003     Flag  *pOverflow  /* o : Flag set when overflow occurs        */
   2004 )
   2005 {
   2006     Word16 temp;
   2007     /*
   2008        if (t0 > TONE_THR * t1)
   2009        set tone flag
   2010        */
   2011     temp = pv_round(t1, pOverflow);
   2012 
   2013     if ((temp > 0) && (L_msu(t0, temp, TONE_THR, pOverflow) > 0))
   2014     {
   2015         st->tone |= 0x4000;
   2016     }
   2017 }
   2018 
   2019 
   2020 /*
   2021 ------------------------------------------------------------------------------
   2022  FUNCTION NAME: vad_tone_detection_update
   2023 ------------------------------------------------------------------------------
   2024  INPUT AND OUTPUT DEFINITIONS
   2025 
   2026  Inputs:
   2027     one_lag_per_frame -- Word16 -- 1 if one open-loop lag is calculated per
   2028                                    each frame, otherwise 0
   2029     st -- pointer to type vadState1 --  State struct
   2030 
   2031  Outputs:
   2032     st -- pointer to type vadState1 --  State struct
   2033     pOverflow -- pointer to type Flag -- overflow indicator
   2034 
   2035  Returns:
   2036     None
   2037 
   2038  Global Variables Used:
   2039     None
   2040 
   2041  Local Variables Needed:
   2042     None
   2043 
   2044 ------------------------------------------------------------------------------
   2045  FUNCTION DESCRIPTION
   2046 
   2047  Purpose      : Update the tone flag register. Tone flags are shifted right
   2048                 by one bit. This function should be called from the speech
   2049                 encoder before call to Vad_tone_detection() function.
   2050 
   2051 ------------------------------------------------------------------------------
   2052  REQUIREMENTS
   2053 
   2054  None
   2055 
   2056 ------------------------------------------------------------------------------
   2057  REFERENCES
   2058 
   2059  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   2060 
   2061 ------------------------------------------------------------------------------
   2062  PSEUDO-CODE
   2063 
   2064 
   2065 ------------------------------------------------------------------------------
   2066  RESOURCES USED [optional]
   2067 
   2068  When the code is written for a specific target processor the
   2069  the resources used should be documented below.
   2070 
   2071  HEAP MEMORY USED: x bytes
   2072 
   2073  STACK MEMORY USED: x bytes
   2074 
   2075  CLOCK CYCLES: (cycle count equation for this function) + (variable
   2076                 used to represent cycle count for each subroutine
   2077                 called)
   2078      where: (cycle count variable) = cycle count for [subroutine
   2079                                      name]
   2080 
   2081 ------------------------------------------------------------------------------
   2082  CAUTION [optional]
   2083  [State any special notes, constraints or cautions for users of this function]
   2084 
   2085 ------------------------------------------------------------------------------
   2086 */
   2087 
   2088 void vad_tone_detection_update(
   2089     vadState1 *st,              /* i/o : State struct           */
   2090     Word16 one_lag_per_frame,   /* i   : 1 if one open-loop lag */
   2091     /*       is calculated per each */
   2092     /*       frame, otherwise 0     */
   2093     Flag *pOverflow             /* o   : Flags overflow         */
   2094 )
   2095 {
   2096     /* Shift tone flags right by one bit */
   2097     st->tone = shr(st->tone, 1, pOverflow);
   2098 
   2099     /* If open-loop lag is calculated only once in each frame, do extra update
   2100        and assume that the other tone flag of the frame is one. */
   2101     if (one_lag_per_frame != 0)
   2102     {
   2103         st->tone = shr(st->tone, 1, pOverflow);
   2104         st->tone |= 0x2000;
   2105     }
   2106 }
   2107 
   2108 
   2109 /*
   2110 ------------------------------------------------------------------------------
   2111  FUNCTION NAME: vad_pitch_detection
   2112 ------------------------------------------------------------------------------
   2113  INPUT AND OUTPUT DEFINITIONS
   2114 
   2115  Inputs:
   2116     T_op -- array of type Word16 -- speech encoder open loop lags
   2117     st -- pointer to type vadState1 --  State struct
   2118 
   2119  Outputs:
   2120     st -- pointer to type vadState1 --  State struct
   2121     pOverflow -- pointer to type Flag -- overflow indicator
   2122 
   2123  Returns:
   2124     None
   2125 
   2126  Global Variables Used:
   2127     None
   2128 
   2129  Local Variables Needed:
   2130     None
   2131 
   2132 ------------------------------------------------------------------------------
   2133  FUNCTION DESCRIPTION
   2134 
   2135  Purpose      : Test whether signal contains pitch or other periodic
   2136                 component.
   2137  Return value : Boolean voiced / unvoiced decision in state variable
   2138 
   2139 ------------------------------------------------------------------------------
   2140  REQUIREMENTS
   2141 
   2142  None
   2143 
   2144 ------------------------------------------------------------------------------
   2145  REFERENCES
   2146 
   2147  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   2148 
   2149 ------------------------------------------------------------------------------
   2150  PSEUDO-CODE
   2151 
   2152 
   2153 ------------------------------------------------------------------------------
   2154  RESOURCES USED [optional]
   2155 
   2156  When the code is written for a specific target processor the
   2157  the resources used should be documented below.
   2158 
   2159  HEAP MEMORY USED: x bytes
   2160 
   2161  STACK MEMORY USED: x bytes
   2162 
   2163  CLOCK CYCLES: (cycle count equation for this function) + (variable
   2164                 used to represent cycle count for each subroutine
   2165                 called)
   2166      where: (cycle count variable) = cycle count for [subroutine
   2167                                      name]
   2168 
   2169 ------------------------------------------------------------------------------
   2170  CAUTION [optional]
   2171  [State any special notes, constraints or cautions for users of this function]
   2172 
   2173 ------------------------------------------------------------------------------
   2174 */
   2175 
   2176 void vad_pitch_detection(
   2177     vadState1 *st,    /* i/o : State struct                  */
   2178     Word16 T_op[],    /* i   : speech encoder open loop lags */
   2179     Flag  *pOverflow  /* o : Flag set when overflow occurs   */
   2180 )
   2181 {
   2182     Word16 lagcount;
   2183     Word16 i;
   2184     Word16 temp;
   2185 
   2186     lagcount = 0;
   2187 
   2188     for (i = 0; i < 2; i++)
   2189     {
   2190         temp = sub(st->oldlag, T_op[i], pOverflow);
   2191         temp = abs_s(temp);
   2192 
   2193         if (temp < LTHRESH)
   2194         {
   2195             lagcount = add(lagcount, 1, pOverflow);
   2196         }
   2197 
   2198         /* Save the current LTP lag */
   2199         st->oldlag = T_op[i];
   2200     }
   2201 
   2202     /* Make pitch decision.
   2203        Save flag of the pitch detection to the variable pitch.
   2204        */
   2205     st->pitch = shr(st->pitch, 1, pOverflow);
   2206 
   2207     temp =
   2208         add(
   2209             st->oldlag_count,
   2210             lagcount,
   2211             pOverflow);
   2212 
   2213     if (temp >= NTHRESH)
   2214     {
   2215         st->pitch |= 0x4000;
   2216     }
   2217 
   2218     /* Update oldlagcount */
   2219     st->oldlag_count = lagcount;
   2220 }
   2221 
   2222 /*
   2223 ------------------------------------------------------------------------------
   2224  FUNCTION NAME: vad1
   2225 ------------------------------------------------------------------------------
   2226  INPUT AND OUTPUT DEFINITIONS
   2227 
   2228  Inputs:
   2229     st -- pointer to type vadState1 --  State struct
   2230     in_buf -- array of type Word16 -- samples of the input frame
   2231 
   2232  Outputs:
   2233     st -- pointer to type vadState1 --  State struct
   2234     pOverflow -- pointer to type Flag -- overflow indicator
   2235 
   2236  Returns:
   2237     VAD Decision, 1 = speech, 0 = noise
   2238 
   2239  Global Variables Used:
   2240     None
   2241 
   2242  Local Variables Needed:
   2243     None
   2244 
   2245 ------------------------------------------------------------------------------
   2246  FUNCTION DESCRIPTION
   2247 
   2248  Purpose      : Main program for Voice Activity Detection (VAD) for AMR
   2249  Return value : VAD Decision, 1 = speech, 0 = noise
   2250 
   2251 ------------------------------------------------------------------------------
   2252  REQUIREMENTS
   2253 
   2254  None
   2255 
   2256 ------------------------------------------------------------------------------
   2257  REFERENCES
   2258 
   2259  vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
   2260 
   2261 ------------------------------------------------------------------------------
   2262  PSEUDO-CODE
   2263 
   2264 
   2265 ------------------------------------------------------------------------------
   2266  RESOURCES USED [optional]
   2267 
   2268  When the code is written for a specific target processor the
   2269  the resources used should be documented below.
   2270 
   2271  HEAP MEMORY USED: x bytes
   2272 
   2273  STACK MEMORY USED: x bytes
   2274 
   2275  CLOCK CYCLES: (cycle count equation for this function) + (variable
   2276                 used to represent cycle count for each subroutine
   2277                 called)
   2278      where: (cycle count variable) = cycle count for [subroutine
   2279                                      name]
   2280 
   2281 ------------------------------------------------------------------------------
   2282  CAUTION [optional]
   2283  [State any special notes, constraints or cautions for users of this function]
   2284 
   2285 ------------------------------------------------------------------------------
   2286 */
   2287 
   2288 Word16 vad1(
   2289     vadState1 *st,    /* i/o : State struct                       */
   2290     Word16 in_buf[],  /* i   : samples of the input frame         */
   2291     Flag  *pOverflow  /* o   : Flag set when overflow occurs      */
   2292 )
   2293 {
   2294     Word16 level[COMPLEN];
   2295     Word32 pow_sum;
   2296     Word16 i;
   2297 
   2298     /* Calculate power of the input frame. */
   2299     pow_sum = 0L;
   2300 
   2301     for (i = 0; i < FRAME_LEN; i++)
   2302     {
   2303         pow_sum = L_mac(pow_sum, in_buf[i-LOOKAHEAD], in_buf[i-LOOKAHEAD], pOverflow);
   2304     }
   2305 
   2306     /*
   2307       If input power is very low, clear pitch flag of the current frame
   2308       */
   2309     if (L_sub(pow_sum, POW_PITCH_THR, pOverflow) < 0)
   2310     {
   2311         st->pitch = st->pitch & 0x3fff;
   2312     }
   2313 
   2314     /*
   2315       If input power is very low, clear complex flag of the "current" frame
   2316       */
   2317     if (L_sub(pow_sum, POW_COMPLEX_THR, pOverflow) < 0)
   2318     {
   2319         st->complex_low = st->complex_low & 0x3fff;
   2320     }
   2321 
   2322     /*
   2323       Run the filter bank which calculates signal levels at each band
   2324       */
   2325     filter_bank(st, in_buf, level, pOverflow);
   2326 
   2327     return (vad_decision(st, level, pow_sum, pOverflow));
   2328 }
   2329 
   2330 
   2331