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
highpass_400Hz_at_12k8_init(int16 mem[])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
highpass_400Hz_at_12k8(int16 signal[],int16 lg,int16 mem[])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