1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /**************************** SBR encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s):
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description:
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker /*!
104*e5436536SAndroid Build Coastguard Worker \file
105*e5436536SAndroid Build Coastguard Worker \brief FDK resampler tool box:$Revision: 91655 $
106*e5436536SAndroid Build Coastguard Worker \author M. Werner
107*e5436536SAndroid Build Coastguard Worker */
108*e5436536SAndroid Build Coastguard Worker
109*e5436536SAndroid Build Coastguard Worker #include "resampler.h"
110*e5436536SAndroid Build Coastguard Worker
111*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
112*e5436536SAndroid Build Coastguard Worker
113*e5436536SAndroid Build Coastguard Worker /**************************************************************************/
114*e5436536SAndroid Build Coastguard Worker /* BIQUAD Filter Specifications */
115*e5436536SAndroid Build Coastguard Worker /**************************************************************************/
116*e5436536SAndroid Build Coastguard Worker
117*e5436536SAndroid Build Coastguard Worker #define B1 0
118*e5436536SAndroid Build Coastguard Worker #define B2 1
119*e5436536SAndroid Build Coastguard Worker #define A1 2
120*e5436536SAndroid Build Coastguard Worker #define A2 3
121*e5436536SAndroid Build Coastguard Worker
122*e5436536SAndroid Build Coastguard Worker #define BQC(x) FL2FXCONST_SGL(x / 2)
123*e5436536SAndroid Build Coastguard Worker
124*e5436536SAndroid Build Coastguard Worker struct FILTER_PARAM {
125*e5436536SAndroid Build Coastguard Worker const FIXP_SGL *coeffa; /*! SOS matrix One row/section. Scaled using BQC().
126*e5436536SAndroid Build Coastguard Worker Order of coefficients: B1,B2,A1,A2. B0=A0=1.0 */
127*e5436536SAndroid Build Coastguard Worker FIXP_DBL g; /*! overall gain */
128*e5436536SAndroid Build Coastguard Worker int Wc; /*! normalized passband bandwidth at input samplerate * 1000 */
129*e5436536SAndroid Build Coastguard Worker int noCoeffs; /*! number of filter coeffs */
130*e5436536SAndroid Build Coastguard Worker int delay; /*! delay in samples at input samplerate */
131*e5436536SAndroid Build Coastguard Worker };
132*e5436536SAndroid Build Coastguard Worker
133*e5436536SAndroid Build Coastguard Worker #define BIQUAD_COEFSTEP 4
134*e5436536SAndroid Build Coastguard Worker
135*e5436536SAndroid Build Coastguard Worker /**
136*e5436536SAndroid Build Coastguard Worker *\brief Low Pass
137*e5436536SAndroid Build Coastguard Worker Wc = 0,5, order 30, Stop Band -96dB. Wc criteria is "almost 0dB passband", not
138*e5436536SAndroid Build Coastguard Worker the usual -3db gain point. [b,a]=cheby2(30,96,0.505) [sos,g]=tf2sos(b,a)
139*e5436536SAndroid Build Coastguard Worker bandwidth 0.48
140*e5436536SAndroid Build Coastguard Worker */
141*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sos48[] = {
142*e5436536SAndroid Build Coastguard Worker BQC(1.98941075681938), BQC(0.999999996890811),
143*e5436536SAndroid Build Coastguard Worker BQC(0.863264527201963), BQC(0.189553799960663),
144*e5436536SAndroid Build Coastguard Worker BQC(1.90733804822445), BQC(1.00000001736189),
145*e5436536SAndroid Build Coastguard Worker BQC(0.836321575841691), BQC(0.203505809266564),
146*e5436536SAndroid Build Coastguard Worker BQC(1.75616665495325), BQC(0.999999946079721),
147*e5436536SAndroid Build Coastguard Worker BQC(0.784699225121588), BQC(0.230471265506986),
148*e5436536SAndroid Build Coastguard Worker BQC(1.55727745512726), BQC(1.00000011737815),
149*e5436536SAndroid Build Coastguard Worker BQC(0.712515423588351), BQC(0.268752723900498),
150*e5436536SAndroid Build Coastguard Worker BQC(1.33407591943643), BQC(0.999999795953228),
151*e5436536SAndroid Build Coastguard Worker BQC(0.625059117330989), BQC(0.316194685288965),
152*e5436536SAndroid Build Coastguard Worker BQC(1.10689898412458), BQC(1.00000035057114),
153*e5436536SAndroid Build Coastguard Worker BQC(0.52803514366398), BQC(0.370517843224669),
154*e5436536SAndroid Build Coastguard Worker BQC(0.89060371078454), BQC(0.999999343962822),
155*e5436536SAndroid Build Coastguard Worker BQC(0.426920462165257), BQC(0.429608200207746),
156*e5436536SAndroid Build Coastguard Worker BQC(0.694438261209433), BQC(1.0000008629792),
157*e5436536SAndroid Build Coastguard Worker BQC(0.326530699561716), BQC(0.491714450654174),
158*e5436536SAndroid Build Coastguard Worker BQC(0.523237800935322), BQC(1.00000101349782),
159*e5436536SAndroid Build Coastguard Worker BQC(0.230829556274851), BQC(0.555559034843281),
160*e5436536SAndroid Build Coastguard Worker BQC(0.378631165929563), BQC(0.99998986482665),
161*e5436536SAndroid Build Coastguard Worker BQC(0.142906422036095), BQC(0.620338874442411),
162*e5436536SAndroid Build Coastguard Worker BQC(0.260786911308437), BQC(1.00003261460178),
163*e5436536SAndroid Build Coastguard Worker BQC(0.0651008576256505), BQC(0.685759923926262),
164*e5436536SAndroid Build Coastguard Worker BQC(0.168409429188098), BQC(0.999933049695828),
165*e5436536SAndroid Build Coastguard Worker BQC(-0.000790067789975562), BQC(0.751905896602325),
166*e5436536SAndroid Build Coastguard Worker BQC(0.100724533818628), BQC(1.00009472669872),
167*e5436536SAndroid Build Coastguard Worker BQC(-0.0533772830257041), BQC(0.81930744384525),
168*e5436536SAndroid Build Coastguard Worker BQC(0.0561434357867363), BQC(0.999911636304276),
169*e5436536SAndroid Build Coastguard Worker BQC(-0.0913550299236405), BQC(0.88883625875915),
170*e5436536SAndroid Build Coastguard Worker BQC(0.0341680678662057), BQC(1.00003667508676),
171*e5436536SAndroid Build Coastguard Worker BQC(-0.113405185536697), BQC(0.961756638268446)};
172*e5436536SAndroid Build Coastguard Worker
173*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL g48 =
174*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(0.002712866530047) - (FIXP_DBL)0x8000;
175*e5436536SAndroid Build Coastguard Worker
176*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM param_set48 = {
177*e5436536SAndroid Build Coastguard Worker sos48, g48, 480, 15, 4 /* LF 2 */
178*e5436536SAndroid Build Coastguard Worker };
179*e5436536SAndroid Build Coastguard Worker
180*e5436536SAndroid Build Coastguard Worker /**
181*e5436536SAndroid Build Coastguard Worker *\brief Low Pass
182*e5436536SAndroid Build Coastguard Worker Wc = 0,5, order 24, Stop Band -96dB. Wc criteria is "almost 0dB passband", not
183*e5436536SAndroid Build Coastguard Worker the usual -3db gain point. [b,a]=cheby2(24,96,0.5) [sos,g]=tf2sos(b,a)
184*e5436536SAndroid Build Coastguard Worker bandwidth 0.45
185*e5436536SAndroid Build Coastguard Worker */
186*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sos45[] = {
187*e5436536SAndroid Build Coastguard Worker BQC(1.982962601444), BQC(1.00000000007504), BQC(0.646113303737836),
188*e5436536SAndroid Build Coastguard Worker BQC(0.10851149979981), BQC(1.85334094281111), BQC(0.999999999677192),
189*e5436536SAndroid Build Coastguard Worker BQC(0.612073220102006), BQC(0.130022141698044), BQC(1.62541051415425),
190*e5436536SAndroid Build Coastguard Worker BQC(1.00000000080398), BQC(0.547879702855959), BQC(0.171165825133192),
191*e5436536SAndroid Build Coastguard Worker BQC(1.34554656923247), BQC(0.9999999980169), BQC(0.460373914508491),
192*e5436536SAndroid Build Coastguard Worker BQC(0.228677463376354), BQC(1.05656568503116), BQC(1.00000000569363),
193*e5436536SAndroid Build Coastguard Worker BQC(0.357891894038287), BQC(0.298676843912185), BQC(0.787967587877312),
194*e5436536SAndroid Build Coastguard Worker BQC(0.999999984415017), BQC(0.248826893211877), BQC(0.377441803512978),
195*e5436536SAndroid Build Coastguard Worker BQC(0.555480971120497), BQC(1.00000003583307), BQC(0.140614263345315),
196*e5436536SAndroid Build Coastguard Worker BQC(0.461979302213679), BQC(0.364986207070964), BQC(0.999999932084303),
197*e5436536SAndroid Build Coastguard Worker BQC(0.0392669446074516), BQC(0.55033451180825), BQC(0.216827267631558),
198*e5436536SAndroid Build Coastguard Worker BQC(1.00000010534682), BQC(-0.0506232228865103), BQC(0.641691581560946),
199*e5436536SAndroid Build Coastguard Worker BQC(0.108951672277119), BQC(0.999999871167516), BQC(-0.125584840183225),
200*e5436536SAndroid Build Coastguard Worker BQC(0.736367748771803), BQC(0.0387988607229035), BQC(1.00000011205574),
201*e5436536SAndroid Build Coastguard Worker BQC(-0.182814849097974), BQC(0.835802108714964), BQC(0.0042866175809225),
202*e5436536SAndroid Build Coastguard Worker BQC(0.999999954830813), BQC(-0.21965740617151), BQC(0.942623047782363)};
203*e5436536SAndroid Build Coastguard Worker
204*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL g45 =
205*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(0.00242743980909524) - (FIXP_DBL)0x8000;
206*e5436536SAndroid Build Coastguard Worker
207*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM param_set45 = {
208*e5436536SAndroid Build Coastguard Worker sos45, g45, 450, 12, 4 /* LF 2 */
209*e5436536SAndroid Build Coastguard Worker };
210*e5436536SAndroid Build Coastguard Worker
211*e5436536SAndroid Build Coastguard Worker /*
212*e5436536SAndroid Build Coastguard Worker Created by Octave 2.1.73, Mon Oct 13 17:31:32 2008 CEST
213*e5436536SAndroid Build Coastguard Worker Wc = 0,5, order 16, Stop Band -96dB damping.
214*e5436536SAndroid Build Coastguard Worker [b,a]=cheby2(16,96,0.5)
215*e5436536SAndroid Build Coastguard Worker [sos,g]=tf2sos(b,a)
216*e5436536SAndroid Build Coastguard Worker bandwidth = 0.41
217*e5436536SAndroid Build Coastguard Worker */
218*e5436536SAndroid Build Coastguard Worker
219*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sos41[] = {
220*e5436536SAndroid Build Coastguard Worker BQC(1.96193625292), BQC(0.999999999999964), BQC(0.169266178786789),
221*e5436536SAndroid Build Coastguard Worker BQC(0.0128823300475907), BQC(1.68913437662092), BQC(1.00000000000053),
222*e5436536SAndroid Build Coastguard Worker BQC(0.124751503206552), BQC(0.0537472273950989), BQC(1.27274692366017),
223*e5436536SAndroid Build Coastguard Worker BQC(0.999999999995674), BQC(0.0433108625178357), BQC(0.131015753236317),
224*e5436536SAndroid Build Coastguard Worker BQC(0.85214175088395), BQC(1.00000000001813), BQC(-0.0625658152550408),
225*e5436536SAndroid Build Coastguard Worker BQC(0.237763778993806), BQC(0.503841579939009), BQC(0.999999999953223),
226*e5436536SAndroid Build Coastguard Worker BQC(-0.179176128722865), BQC(0.367475236424474), BQC(0.249990711986162),
227*e5436536SAndroid Build Coastguard Worker BQC(1.00000000007952), BQC(-0.294425165824676), BQC(0.516594857170212),
228*e5436536SAndroid Build Coastguard Worker BQC(0.087971668680286), BQC(0.999999999915528), BQC(-0.398956566777928),
229*e5436536SAndroid Build Coastguard Worker BQC(0.686417767801123), BQC(0.00965373325350294), BQC(1.00000000003744),
230*e5436536SAndroid Build Coastguard Worker BQC(-0.48579173764817), BQC(0.884931534239068)};
231*e5436536SAndroid Build Coastguard Worker
232*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL g41 = FL2FXCONST_DBL(0.00155956951169248);
233*e5436536SAndroid Build Coastguard Worker
234*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM param_set41 = {
235*e5436536SAndroid Build Coastguard Worker sos41, g41, 410, 8, 5 /* LF 3 */
236*e5436536SAndroid Build Coastguard Worker };
237*e5436536SAndroid Build Coastguard Worker
238*e5436536SAndroid Build Coastguard Worker /*
239*e5436536SAndroid Build Coastguard Worker # Created by Octave 2.1.73, Mon Oct 13 17:55:33 2008 CEST
240*e5436536SAndroid Build Coastguard Worker Wc = 0,5, order 12, Stop Band -96dB damping.
241*e5436536SAndroid Build Coastguard Worker [b,a]=cheby2(12,96,0.5);
242*e5436536SAndroid Build Coastguard Worker [sos,g]=tf2sos(b,a)
243*e5436536SAndroid Build Coastguard Worker */
244*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sos35[] = {
245*e5436536SAndroid Build Coastguard Worker BQC(1.93299325235762), BQC(0.999999999999985), BQC(-0.140733187246596),
246*e5436536SAndroid Build Coastguard Worker BQC(0.0124139497836062), BQC(1.4890416764109), BQC(1.00000000000011),
247*e5436536SAndroid Build Coastguard Worker BQC(-0.198215402588504), BQC(0.0746730616584138), BQC(0.918450161309795),
248*e5436536SAndroid Build Coastguard Worker BQC(0.999999999999619), BQC(-0.30133912791941), BQC(0.192276468839529),
249*e5436536SAndroid Build Coastguard Worker BQC(0.454877024246818), BQC(1.00000000000086), BQC(-0.432337328809815),
250*e5436536SAndroid Build Coastguard Worker BQC(0.356852933642815), BQC(0.158017147118507), BQC(0.999999999998876),
251*e5436536SAndroid Build Coastguard Worker BQC(-0.574817494249777), BQC(0.566380436970833), BQC(0.0171834649478749),
252*e5436536SAndroid Build Coastguard Worker BQC(1.00000000000055), BQC(-0.718581178041165), BQC(0.83367484487889)};
253*e5436536SAndroid Build Coastguard Worker
254*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL g35 = FL2FXCONST_DBL(0.00162580994125131);
255*e5436536SAndroid Build Coastguard Worker
256*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM param_set35 = {sos35, g35, 350, 6, 4};
257*e5436536SAndroid Build Coastguard Worker
258*e5436536SAndroid Build Coastguard Worker /*
259*e5436536SAndroid Build Coastguard Worker # Created by Octave 2.1.73, Mon Oct 13 18:15:38 2008 CEST
260*e5436536SAndroid Build Coastguard Worker Wc = 0,5, order 8, Stop Band -96dB damping.
261*e5436536SAndroid Build Coastguard Worker [b,a]=cheby2(8,96,0.5);
262*e5436536SAndroid Build Coastguard Worker [sos,g]=tf2sos(b,a)
263*e5436536SAndroid Build Coastguard Worker */
264*e5436536SAndroid Build Coastguard Worker static const FIXP_SGL sos25[] = {
265*e5436536SAndroid Build Coastguard Worker BQC(1.85334094301225), BQC(1.0),
266*e5436536SAndroid Build Coastguard Worker BQC(-0.702127214212663), BQC(0.132452403998767),
267*e5436536SAndroid Build Coastguard Worker BQC(1.056565682167), BQC(0.999999999999997),
268*e5436536SAndroid Build Coastguard Worker BQC(-0.789503667880785), BQC(0.236328693569128),
269*e5436536SAndroid Build Coastguard Worker BQC(0.364986307455489), BQC(0.999999999999996),
270*e5436536SAndroid Build Coastguard Worker BQC(-0.955191189843375), BQC(0.442966457936379),
271*e5436536SAndroid Build Coastguard Worker BQC(0.0387985751642125), BQC(1.0),
272*e5436536SAndroid Build Coastguard Worker BQC(-1.19817786088084), BQC(0.770493895456328)};
273*e5436536SAndroid Build Coastguard Worker
274*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL g25 = FL2FXCONST_DBL(0.000945182835294559);
275*e5436536SAndroid Build Coastguard Worker
276*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM param_set25 = {sos25, g25, 250, 4, 5};
277*e5436536SAndroid Build Coastguard Worker
278*e5436536SAndroid Build Coastguard Worker /* Must be sorted in descending order */
279*e5436536SAndroid Build Coastguard Worker static const struct FILTER_PARAM *const filter_paramSet[] = {
280*e5436536SAndroid Build Coastguard Worker ¶m_set48, ¶m_set45, ¶m_set41, ¶m_set35, ¶m_set25};
281*e5436536SAndroid Build Coastguard Worker
282*e5436536SAndroid Build Coastguard Worker /**************************************************************************/
283*e5436536SAndroid Build Coastguard Worker /* Resampler Functions */
284*e5436536SAndroid Build Coastguard Worker /**************************************************************************/
285*e5436536SAndroid Build Coastguard Worker
286*e5436536SAndroid Build Coastguard Worker /*!
287*e5436536SAndroid Build Coastguard Worker \brief Reset downsampler instance and clear delay lines
288*e5436536SAndroid Build Coastguard Worker
289*e5436536SAndroid Build Coastguard Worker \return success of operation
290*e5436536SAndroid Build Coastguard Worker */
291*e5436536SAndroid Build Coastguard Worker
FDKaacEnc_InitDownsampler(DOWNSAMPLER * DownSampler,int Wc,int ratio)292*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_InitDownsampler(
293*e5436536SAndroid Build Coastguard Worker DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */
294*e5436536SAndroid Build Coastguard Worker int Wc, /*!< normalized cutoff freq * 1000* */
295*e5436536SAndroid Build Coastguard Worker int ratio) /*!< downsampler ratio */
296*e5436536SAndroid Build Coastguard Worker
297*e5436536SAndroid Build Coastguard Worker {
298*e5436536SAndroid Build Coastguard Worker UINT i;
299*e5436536SAndroid Build Coastguard Worker const struct FILTER_PARAM *currentSet = NULL;
300*e5436536SAndroid Build Coastguard Worker
301*e5436536SAndroid Build Coastguard Worker FDKmemclear(DownSampler->downFilter.states,
302*e5436536SAndroid Build Coastguard Worker sizeof(DownSampler->downFilter.states));
303*e5436536SAndroid Build Coastguard Worker DownSampler->downFilter.ptr = 0;
304*e5436536SAndroid Build Coastguard Worker
305*e5436536SAndroid Build Coastguard Worker /*
306*e5436536SAndroid Build Coastguard Worker find applicable parameter set
307*e5436536SAndroid Build Coastguard Worker */
308*e5436536SAndroid Build Coastguard Worker currentSet = filter_paramSet[0];
309*e5436536SAndroid Build Coastguard Worker for (i = 1; i < sizeof(filter_paramSet) / sizeof(struct FILTER_PARAM *);
310*e5436536SAndroid Build Coastguard Worker i++) {
311*e5436536SAndroid Build Coastguard Worker if (filter_paramSet[i]->Wc <= Wc) {
312*e5436536SAndroid Build Coastguard Worker break;
313*e5436536SAndroid Build Coastguard Worker }
314*e5436536SAndroid Build Coastguard Worker currentSet = filter_paramSet[i];
315*e5436536SAndroid Build Coastguard Worker }
316*e5436536SAndroid Build Coastguard Worker
317*e5436536SAndroid Build Coastguard Worker DownSampler->downFilter.coeffa = currentSet->coeffa;
318*e5436536SAndroid Build Coastguard Worker
319*e5436536SAndroid Build Coastguard Worker DownSampler->downFilter.gain = currentSet->g;
320*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(currentSet->noCoeffs <= MAXNR_SECTIONS * 2);
321*e5436536SAndroid Build Coastguard Worker
322*e5436536SAndroid Build Coastguard Worker DownSampler->downFilter.noCoeffs = currentSet->noCoeffs;
323*e5436536SAndroid Build Coastguard Worker DownSampler->delay = currentSet->delay;
324*e5436536SAndroid Build Coastguard Worker DownSampler->downFilter.Wc = currentSet->Wc;
325*e5436536SAndroid Build Coastguard Worker
326*e5436536SAndroid Build Coastguard Worker DownSampler->ratio = ratio;
327*e5436536SAndroid Build Coastguard Worker DownSampler->pending = ratio - 1;
328*e5436536SAndroid Build Coastguard Worker return (1);
329*e5436536SAndroid Build Coastguard Worker }
330*e5436536SAndroid Build Coastguard Worker
331*e5436536SAndroid Build Coastguard Worker /*!
332*e5436536SAndroid Build Coastguard Worker \brief faster simple folding operation
333*e5436536SAndroid Build Coastguard Worker Filter:
334*e5436536SAndroid Build Coastguard Worker H(z) = A(z)/B(z)
335*e5436536SAndroid Build Coastguard Worker with
336*e5436536SAndroid Build Coastguard Worker A(z) = a[0]*z^0 + a[1]*z^1 + a[2]*z^2 ... a[n]*z^n
337*e5436536SAndroid Build Coastguard Worker
338*e5436536SAndroid Build Coastguard Worker \return filtered value
339*e5436536SAndroid Build Coastguard Worker */
340*e5436536SAndroid Build Coastguard Worker
AdvanceFilter(LP_FILTER * downFilter,INT_PCM * pInput,int downRatio)341*e5436536SAndroid Build Coastguard Worker static inline INT_PCM AdvanceFilter(
342*e5436536SAndroid Build Coastguard Worker LP_FILTER *downFilter, /*!< pointer to iir filter instance */
343*e5436536SAndroid Build Coastguard Worker INT_PCM *pInput, /*!< input of filter */
344*e5436536SAndroid Build Coastguard Worker int downRatio) {
345*e5436536SAndroid Build Coastguard Worker INT_PCM output;
346*e5436536SAndroid Build Coastguard Worker int i, n;
347*e5436536SAndroid Build Coastguard Worker
348*e5436536SAndroid Build Coastguard Worker #define BIQUAD_SCALE 12
349*e5436536SAndroid Build Coastguard Worker
350*e5436536SAndroid Build Coastguard Worker FIXP_DBL y = FL2FXCONST_DBL(0.0f);
351*e5436536SAndroid Build Coastguard Worker FIXP_DBL input;
352*e5436536SAndroid Build Coastguard Worker
353*e5436536SAndroid Build Coastguard Worker for (n = 0; n < downRatio; n++) {
354*e5436536SAndroid Build Coastguard Worker FIXP_BQS(*states)[2] = downFilter->states;
355*e5436536SAndroid Build Coastguard Worker const FIXP_SGL *coeff = downFilter->coeffa;
356*e5436536SAndroid Build Coastguard Worker int s1, s2;
357*e5436536SAndroid Build Coastguard Worker
358*e5436536SAndroid Build Coastguard Worker s1 = downFilter->ptr;
359*e5436536SAndroid Build Coastguard Worker s2 = s1 ^ 1;
360*e5436536SAndroid Build Coastguard Worker
361*e5436536SAndroid Build Coastguard Worker #if (SAMPLE_BITS == 16)
362*e5436536SAndroid Build Coastguard Worker input = ((FIXP_DBL)pInput[n]) << (DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE);
363*e5436536SAndroid Build Coastguard Worker #elif (SAMPLE_BITS == 32)
364*e5436536SAndroid Build Coastguard Worker input = pInput[n] >> BIQUAD_SCALE;
365*e5436536SAndroid Build Coastguard Worker #else
366*e5436536SAndroid Build Coastguard Worker #error NOT IMPLEMENTED
367*e5436536SAndroid Build Coastguard Worker #endif
368*e5436536SAndroid Build Coastguard Worker
369*e5436536SAndroid Build Coastguard Worker FIXP_BQS state1, state2, state1b, state2b;
370*e5436536SAndroid Build Coastguard Worker
371*e5436536SAndroid Build Coastguard Worker state1 = states[0][s1];
372*e5436536SAndroid Build Coastguard Worker state2 = states[0][s2];
373*e5436536SAndroid Build Coastguard Worker
374*e5436536SAndroid Build Coastguard Worker /* Loop over sections */
375*e5436536SAndroid Build Coastguard Worker for (i = 0; i < downFilter->noCoeffs; i++) {
376*e5436536SAndroid Build Coastguard Worker FIXP_DBL state0;
377*e5436536SAndroid Build Coastguard Worker
378*e5436536SAndroid Build Coastguard Worker /* Load merged states (from next section) */
379*e5436536SAndroid Build Coastguard Worker state1b = states[i + 1][s1];
380*e5436536SAndroid Build Coastguard Worker state2b = states[i + 1][s2];
381*e5436536SAndroid Build Coastguard Worker
382*e5436536SAndroid Build Coastguard Worker state0 = input + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]);
383*e5436536SAndroid Build Coastguard Worker y = state0 - fMult(state1b, coeff[A1]) - fMult(state2b, coeff[A2]);
384*e5436536SAndroid Build Coastguard Worker
385*e5436536SAndroid Build Coastguard Worker /* Store new feed forward merge state */
386*e5436536SAndroid Build Coastguard Worker states[i + 1][s2] = y << 1;
387*e5436536SAndroid Build Coastguard Worker /* Store new feed backward state */
388*e5436536SAndroid Build Coastguard Worker states[i][s2] = input << 1;
389*e5436536SAndroid Build Coastguard Worker
390*e5436536SAndroid Build Coastguard Worker /* Feedback output to next section. */
391*e5436536SAndroid Build Coastguard Worker input = y;
392*e5436536SAndroid Build Coastguard Worker
393*e5436536SAndroid Build Coastguard Worker /* Transfer merged states */
394*e5436536SAndroid Build Coastguard Worker state1 = state1b;
395*e5436536SAndroid Build Coastguard Worker state2 = state2b;
396*e5436536SAndroid Build Coastguard Worker
397*e5436536SAndroid Build Coastguard Worker /* Step to next coef set */
398*e5436536SAndroid Build Coastguard Worker coeff += BIQUAD_COEFSTEP;
399*e5436536SAndroid Build Coastguard Worker }
400*e5436536SAndroid Build Coastguard Worker downFilter->ptr ^= 1;
401*e5436536SAndroid Build Coastguard Worker }
402*e5436536SAndroid Build Coastguard Worker /* Apply global gain */
403*e5436536SAndroid Build Coastguard Worker y = fMult(y, downFilter->gain);
404*e5436536SAndroid Build Coastguard Worker
405*e5436536SAndroid Build Coastguard Worker /* Apply final gain/scaling to output */
406*e5436536SAndroid Build Coastguard Worker #if (SAMPLE_BITS == 16)
407*e5436536SAndroid Build Coastguard Worker output = (INT_PCM)SATURATE_RIGHT_SHIFT(
408*e5436536SAndroid Build Coastguard Worker y + (FIXP_DBL)(1 << (DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE - 1)),
409*e5436536SAndroid Build Coastguard Worker DFRACT_BITS - SAMPLE_BITS - BIQUAD_SCALE, SAMPLE_BITS);
410*e5436536SAndroid Build Coastguard Worker // output = (INT_PCM) SATURATE_RIGHT_SHIFT(y,
411*e5436536SAndroid Build Coastguard Worker // DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS);
412*e5436536SAndroid Build Coastguard Worker #else
413*e5436536SAndroid Build Coastguard Worker output = SATURATE_LEFT_SHIFT(y, BIQUAD_SCALE, SAMPLE_BITS);
414*e5436536SAndroid Build Coastguard Worker #endif
415*e5436536SAndroid Build Coastguard Worker
416*e5436536SAndroid Build Coastguard Worker return output;
417*e5436536SAndroid Build Coastguard Worker }
418*e5436536SAndroid Build Coastguard Worker
419*e5436536SAndroid Build Coastguard Worker /*!
420*e5436536SAndroid Build Coastguard Worker \brief FDKaacEnc_Downsample numInSamples of type INT_PCM
421*e5436536SAndroid Build Coastguard Worker Returns number of output samples in numOutSamples
422*e5436536SAndroid Build Coastguard Worker
423*e5436536SAndroid Build Coastguard Worker \return success of operation
424*e5436536SAndroid Build Coastguard Worker */
425*e5436536SAndroid Build Coastguard Worker
FDKaacEnc_Downsample(DOWNSAMPLER * DownSampler,INT_PCM * inSamples,INT numInSamples,INT_PCM * outSamples,INT * numOutSamples)426*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_Downsample(
427*e5436536SAndroid Build Coastguard Worker DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */
428*e5436536SAndroid Build Coastguard Worker INT_PCM *inSamples, /*!< pointer to input samples */
429*e5436536SAndroid Build Coastguard Worker INT numInSamples, /*!< number of input samples */
430*e5436536SAndroid Build Coastguard Worker INT_PCM *outSamples, /*!< pointer to output samples */
431*e5436536SAndroid Build Coastguard Worker INT *numOutSamples /*!< pointer tp number of output samples */
432*e5436536SAndroid Build Coastguard Worker ) {
433*e5436536SAndroid Build Coastguard Worker INT i;
434*e5436536SAndroid Build Coastguard Worker *numOutSamples = 0;
435*e5436536SAndroid Build Coastguard Worker
436*e5436536SAndroid Build Coastguard Worker for (i = 0; i < numInSamples; i += DownSampler->ratio) {
437*e5436536SAndroid Build Coastguard Worker *outSamples = AdvanceFilter(&(DownSampler->downFilter), &inSamples[i],
438*e5436536SAndroid Build Coastguard Worker DownSampler->ratio);
439*e5436536SAndroid Build Coastguard Worker outSamples++;
440*e5436536SAndroid Build Coastguard Worker }
441*e5436536SAndroid Build Coastguard Worker *numOutSamples = numInSamples / DownSampler->ratio;
442*e5436536SAndroid Build Coastguard Worker
443*e5436536SAndroid Build Coastguard Worker return 0;
444*e5436536SAndroid Build Coastguard Worker }
445