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