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.173
     22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2007, 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  Filename: highpass_400Hz_at_12k8.cpp
     35 
     36      Date: 05/08/2004
     37 
     38 ------------------------------------------------------------------------------
     39  REVISION HISTORY
     40 
     41 
     42  Description:
     43 
     44 ------------------------------------------------------------------------------
     45  INPUT AND OUTPUT DEFINITIONS
     46 
     47      int16 signal[],             input signal / output is divided by 16
     48      int16 lg,                   lenght of signal
     49      int16 mem[]                 filter memory [6]
     50 
     51 
     52 ------------------------------------------------------------------------------
     53  FUNCTION DESCRIPTION
     54 
     55    2nd order high pass filter with cut off frequency at 400 Hz.
     56    Designed with cheby2 function in MATLAB.
     57    Optimized for fixed-point to get the following frequency response:
     58 
     59     frequency:     0Hz   100Hz  200Hz  300Hz  400Hz  630Hz  1.5kHz  3kHz
     60     dB loss:     -infdB  -30dB  -20dB  -10dB  -3dB   +6dB    +1dB    0dB
     61 
     62    Algorithm:
     63 
     64     y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
     65                      + a[1]*y[i-1] + a[2]*y[i-2];
     66 
     67     int16 b[3] = {3660, -7320,  3660};       in Q12
     68     int16 a[3] = {4096,  7320, -3540};       in Q12
     69 
     70     float -->   b[3] = {0.893554687, -1.787109375,  0.893554687};
     71                 a[3] = {1.000000000,  1.787109375, -0.864257812};
     72 
     73 
     74 ------------------------------------------------------------------------------
     75  REQUIREMENTS
     76 
     77 
     78 ------------------------------------------------------------------------------
     79  REFERENCES
     80 
     81 ------------------------------------------------------------------------------
     82  PSEUDO-CODE
     83 
     84 ------------------------------------------------------------------------------
     85 */
     86 
     87 
     88 /*----------------------------------------------------------------------------
     89 ; INCLUDES
     90 ----------------------------------------------------------------------------*/
     91 
     92 #include "pv_amr_wb_type_defs.h"
     93 #include "pvamrwbdecoder_basic_op.h"
     94 #include "pvamrwb_math_op.h"
     95 #include "pvamrwbdecoder_acelp.h"
     96 
     97 /*----------------------------------------------------------------------------
     98 ; MACROS
     99 ; Define module specific macros here
    100 ----------------------------------------------------------------------------*/
    101 
    102 
    103 /*----------------------------------------------------------------------------
    104 ; DEFINES
    105 ; Include all pre-processor statements here. Include conditional
    106 ; compile variables also.
    107 ----------------------------------------------------------------------------*/
    108 
    109 /*----------------------------------------------------------------------------
    110 ; LOCAL FUNCTION DEFINITIONS
    111 ; Function Prototype declaration
    112 ----------------------------------------------------------------------------*/
    113 
    114 /*----------------------------------------------------------------------------
    115 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    116 ; Variable declaration - defined here and used outside this module
    117 ----------------------------------------------------------------------------*/
    118 
    119 /*----------------------------------------------------------------------------
    120 ; EXTERNAL FUNCTION REFERENCES
    121 ; Declare functions defined elsewhere and referenced in this module
    122 ----------------------------------------------------------------------------*/
    123 
    124 /*----------------------------------------------------------------------------
    125 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    126 ; Declare variables used in this module but defined elsewhere
    127 ----------------------------------------------------------------------------*/
    128 
    129 /*----------------------------------------------------------------------------
    130 ; FUNCTION CODE
    131 ----------------------------------------------------------------------------*/
    132 /* Initialization of static values */
    133 
    134 void highpass_400Hz_at_12k8_init(int16 mem[])
    135 {
    136     pv_memset((void *)mem, 0, 6*sizeof(*mem));
    137 }
    138 
    139 /*----------------------------------------------------------------------------
    140 ; FUNCTION CODE
    141 ----------------------------------------------------------------------------*/
    142 
    143 void highpass_400Hz_at_12k8(
    144     int16 signal[],                      /* input signal / output is divided by 16 */
    145     int16 lg,                            /* lenght of signal    */
    146     int16 mem[]                          /* filter memory [6]   */
    147 )
    148 {
    149     int16 i, x2;
    150     int16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
    151     int32 L_tmp1;
    152     int32 L_tmp2;
    153 
    154     y2_hi = mem[0];
    155     y2_lo = mem[1];
    156     y1_hi = mem[2];
    157     y1_lo = mem[3];
    158     x0    = mem[4];
    159     x1    = mem[5];
    160 
    161     for (i = 0; i < lg; i++)
    162     {
    163 
    164         /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[0]*x[i-2]  */
    165         /* + a[0]*y[i-1] + a[1] * y[i-2];  */
    166 
    167         L_tmp1 = fxp_mac_16by16(y1_lo, 29280, 8192L);
    168         L_tmp2 = fxp_mul_16by16(y1_hi, 29280);
    169         L_tmp1 = fxp_mac_16by16(y2_lo, -14160, L_tmp1);
    170         L_tmp2 = fxp_mac_16by16(y2_hi, -14160, L_tmp2);
    171         x2 = x1;
    172         x1 = x0;
    173         x0 = signal[i];
    174         L_tmp2 = fxp_mac_16by16(x2, 915, L_tmp2);
    175         L_tmp2 = fxp_mac_16by16(x1, -1830, L_tmp2);
    176         L_tmp2 = fxp_mac_16by16(x0, 915, L_tmp2);
    177 
    178         L_tmp1 = (L_tmp1 >> 13) + (L_tmp2 << 2);  /* coeff Q12 --> Q13 */
    179 
    180         y2_hi = y1_hi;
    181         y2_lo = y1_lo;
    182         /* signal is divided by 16 to avoid overflow in energy computation */
    183         signal[i] = (int16)((L_tmp1 + 0x00008000) >> 16);
    184 
    185         y1_hi = (int16)(L_tmp1 >> 16);
    186         y1_lo = (int16)((L_tmp1 - (y1_hi << 16)) >> 1);
    187 
    188 
    189     }
    190 
    191 
    192     mem[0] = y2_hi;
    193     mem[1] = y2_lo;
    194     mem[2] = y1_hi;
    195     mem[3] = y1_lo;
    196     mem[4] = x0;
    197     mem[5] = x1;
    198 
    199 }
    200 
    201 
    202