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