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