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/****************************************************************************************
19Portions 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)
26Permission to distribute, modify and use this file under the standard license
27terms 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
134void 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
143void 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