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_50Hz_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 31 Hz.
     56    Designed with cheby2 function in MATLAB.
     57    Optimized for fixed-point to get the following frequency response:
     58 
     59     frequency:     0Hz    14Hz  24Hz   31Hz   37Hz   41Hz   47Hz
     60     dB loss:     -infdB  -15dB  -6dB   -3dB  -1.5dB  -1dB  -0.5dB
     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] = {4053, -8106, 4053};         in Q12
     68     int16 a[3] = {8192, 16211, -8021};        in Q12
     69 
     70     float -->   b[3] = {0.989501953, -1.979003906,  0.989501953};
     71                 a[3] = {1.000000000,  1.978881836, -0.979125977};
     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 
     93 #include "pv_amr_wb_type_defs.h"
     94 #include "pvamrwbdecoder_basic_op.h"
     95 #include "pvamrwb_math_op.h"
     96 #include "pvamrwbdecoder_cnst.h"
     97 #include "pvamrwbdecoder_acelp.h"
     98 
     99 
    100 /*----------------------------------------------------------------------------
    101 ; MACROS
    102 ; Define module specific macros here
    103 ----------------------------------------------------------------------------*/
    104 
    105 
    106 /*----------------------------------------------------------------------------
    107 ; DEFINES
    108 ; Include all pre-processor statements here. Include conditional
    109 ; compile variables also.
    110 ----------------------------------------------------------------------------*/
    111 
    112 /*----------------------------------------------------------------------------
    113 ; LOCAL FUNCTION DEFINITIONS
    114 ; Function Prototype declaration
    115 ----------------------------------------------------------------------------*/
    116 
    117 /*----------------------------------------------------------------------------
    118 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    119 ; Variable declaration - defined here and used outside this module
    120 ----------------------------------------------------------------------------*/
    121 
    122 /*----------------------------------------------------------------------------
    123 ; EXTERNAL FUNCTION REFERENCES
    124 ; Declare functions defined elsewhere and referenced in this module
    125 ----------------------------------------------------------------------------*/
    126 
    127 /*----------------------------------------------------------------------------
    128 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    129 ; Declare variables used in this module but defined elsewhere
    130 ----------------------------------------------------------------------------*/
    131 
    132 /*----------------------------------------------------------------------------
    133 ; FUNCTION CODE
    134 ----------------------------------------------------------------------------*/
    135 
    136 void highpass_50Hz_at_12k8_init(int16 mem[])
    137 {
    138     pv_memset((void *)mem, 0, 6*sizeof(*mem));
    139 }
    140 
    141 /*----------------------------------------------------------------------------
    142 ; FUNCTION CODE
    143 ----------------------------------------------------------------------------*/
    144 
    145 void highpass_50Hz_at_12k8(
    146     int16 signal[],                      /* input/output signal */
    147     int16 lg,                            /* lenght of signal    */
    148     int16 mem[]                          /* filter memory [6]   */
    149 )
    150 {
    151     int16 i, x2;
    152     int16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
    153     int32 L_tmp1;
    154     int32 L_tmp2;
    155     int16 *pt_sign = signal;
    156 
    157     y2_hi = mem[0];
    158     y2_lo = mem[1];
    159     y1_hi = mem[2];
    160     y1_lo = mem[3];
    161     x0    = mem[4];
    162     x1    = mem[5];
    163 
    164 
    165     for (i = lg; i != 0; i--)
    166     {
    167 
    168         /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[0]*x[i-2]  */
    169         /* + a[0]*y[i-1] + a[1] * y[i-2];  */
    170 
    171         L_tmp1 = fxp_mac_16by16(y1_lo, 16211, 8192L);
    172         L_tmp1 = fxp_mac_16by16(y2_lo, -8021, L_tmp1);
    173         L_tmp2 = fxp_mul_16by16(y1_hi, 32422);
    174         L_tmp2 = fxp_mac_16by16(y2_hi, -16042, L_tmp2);
    175 
    176         x2 = x1;
    177         x1 = x0;
    178         x0 = *pt_sign;
    179         L_tmp2 = fxp_mac_16by16(x2,  8106, L_tmp2);
    180         L_tmp2 = fxp_mac_16by16(x1, -16212, L_tmp2);
    181         L_tmp2 = fxp_mac_16by16(x0,  8106, L_tmp2);
    182 
    183 
    184         L_tmp1 = ((L_tmp1 >> 14) + L_tmp2) << 2;
    185 
    186         y2_hi = y1_hi;
    187         y2_lo = y1_lo;
    188         y1_hi = (int16)(L_tmp1 >> 16);
    189         y1_lo = (int16)((L_tmp1 - (y1_hi << 16)) >> 1);
    190 
    191         /* coeff Q14 --> Q15 with saturation */
    192         *(pt_sign++) = amr_wb_shl1_round(L_tmp1);
    193 
    194     }
    195 
    196 
    197     mem[0] = y2_hi;
    198     mem[1] = y2_lo;
    199     mem[2] = y1_hi;
    200     mem[3] = y1_lo;
    201     mem[4] = x0;
    202     mem[5] = x1;
    203 
    204 }
    205 
    206