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