summaryrefslogtreecommitdiffstats
path: root/libFDK/src/FDK_trigFcts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libFDK/src/FDK_trigFcts.cpp')
-rw-r--r--libFDK/src/FDK_trigFcts.cpp435
1 files changed, 79 insertions, 356 deletions
diff --git a/libFDK/src/FDK_trigFcts.cpp b/libFDK/src/FDK_trigFcts.cpp
index a198dc6..2f8655c 100644
--- a/libFDK/src/FDK_trigFcts.cpp
+++ b/libFDK/src/FDK_trigFcts.cpp
@@ -1,29 +1,91 @@
-/*************************** Fraunhofer IIS FDK Tools **********************
- (C) Copyright Fraunhofer IIS (2005)
- All Rights Reserved
+/* -----------------------------------------------------------------------------------------------------------
+Software License for The Fraunhofer FDK AAC Codec Library for Android
+
+© Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
+ All rights reserved.
+
+ 1. INTRODUCTION
+The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
+the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
+This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
+
+AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
+audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
+independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
+of the MPEG specifications.
+
+Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
+may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
+individually for the purpose of encoding or decoding bit streams in products that are compliant with
+the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
+these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
+software may already be covered under those patent licenses when it is used for those licensed purposes only.
+
+Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
+are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
+applications information and documentation.
+
+2. COPYRIGHT LICENSE
+
+Redistribution and use in source and binary forms, with or without modification, are permitted without
+payment of copyright license fees provided that you satisfy the following conditions:
+
+You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
+your modifications thereto in source code form.
+
+You must retain the complete text of this software license in the documentation and/or other materials
+provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
+You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
+modifications thereto to recipients of copies in binary form.
+
+The name of Fraunhofer may not be used to endorse or promote products derived from this library without
+prior written permission.
+
+You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
+software or your modifications thereto.
+
+Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
+and the date of any change. For modified versions of the FDK AAC Codec, the term
+"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
+"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
+
+3. NO PATENT LICENSE
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
+ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
+respect to this software.
+
+You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
+by appropriate patent licenses.
- Please be advised that this software and/or program delivery is
- Confidential Information of Fraunhofer and subject to and covered by the
+4. DISCLAIMER
- Fraunhofer IIS Software Evaluation Agreement
- between Google Inc. and Fraunhofer
- effective and in full force since March 1, 2012.
+This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
+"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
+of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
+including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
+or business interruption, however caused and on any theory of liability, whether in contract, strict
+liability, or tort (including negligence), arising in any way out of the use of this software, even if
+advised of the possibility of such damage.
- You may use this software and/or program only under the terms and
- conditions described in the above mentioned Fraunhofer IIS Software
- Evaluation Agreement. Any other and/or further use requires a separate agreement.
+5. CONTACT INFORMATION
+Fraunhofer Institute for Integrated Circuits IIS
+Attention: Audio and Multimedia Departments - FDK AAC LL
+Am Wolfsmantel 33
+91058 Erlangen, Germany
+
+www.iis.fraunhofer.de/amm
+amm-info@iis.fraunhofer.de
+----------------------------------------------------------------------------------------------------------- */
+
+/*************************** Fraunhofer IIS FDK Tools **********************
- $Id$
Author(s): Haricharan Lakshman, Manuel Jander
Description: Trigonometric functions fixed point fractional implementation.
- This software and/or program is protected by copyright law and international
- treaties. Any reproduction or distribution of this software and/or program,
- or any portion of it, may result in severe civil and criminal penalties, and
- will be prosecuted to the maximum extent possible under law.
-
******************************************************************************/
#include "FDK_trigFcts.h"
@@ -31,7 +93,6 @@
#include "fixpoint_math.h"
-// #define CORDIC_SINCOS
#define IMPROVE_ATAN2_ACCURACY 1 // 0 --> 59 dB SNR 1 --> 65 dB SNR
@@ -109,8 +170,6 @@ FIXP_DBL fixp_atan2(FIXP_DBL y, FIXP_DBL x)
sf = 0;
}
sfo = sf;
- //write2file(fpF__h,(float)y/(float)x);
- //write2file(fpC__h,(float) q * (float)FDKpow(2,sfo)); // SNR 86 dB But range not limited to [-64..64] which is the input range of fixp_atan()
// --- atan()
@@ -145,12 +204,8 @@ FIXP_DBL fixp_atan2(FIXP_DBL y, FIXP_DBL x)
stf = sfo - ATI_SF;
if (stf > 0) q = q << (INT)fMin( stf,DFRACT_BITS-1);
else q = q >> (INT)fMin(-stf,DFRACT_BITS-1);
- //write2file(fpF__e,(float)y/(float)x);
- //write2file(fpC__e,(float)q * (float)FDKpow(2,ATI_SF)); // 88.9 dB
at = fixp_atan(q); // ATO_SF
}
- //write2file(fpF__g,(float)FDKatan( (float)y/(float)x ));
- //write2file(fpC__g,(float) at * (float)FDKpow(2,ATO_SF) ); // todo dB
// --- atan2()
@@ -177,8 +232,6 @@ FIXP_DBL fixp_atan2(FIXP_DBL y, FIXP_DBL x)
ret = FL2FXCONST_DBL(0.0f);
}
}
- //write2file(fpC__f,(float)ret * (float)FDKpow(2,AT2O_SF)); // 65 dB
- //write2file(fpF__f,(float)FDKatan2(y,x));
return ret;
}
@@ -237,7 +290,6 @@ FIXP_DBL fixp_atan(FIXP_DBL x)
}
-#ifndef CORDIC_SINCOS
#include "FDK_tools_rom.h"
@@ -272,335 +324,6 @@ void fixp_cos_sin (FIXP_DBL x, int scale, FIXP_DBL *cos, FIXP_DBL *sin)
*sin = sine + error1;
}
-#else /* #ifndef CORDIC_SINCOS */
-
-/*
- // Matlab
- function v = cordic(beta,n)
- % This function computes v = [cos(beta), sin(beta)] (beta in radians)
- % using n iterations. Increasing n will increase the precision.
-
- if beta < -pi/2 | beta > pi/2
- if beta < 0
- v = cordic(beta + pi, n);
- else
- v = cordic(beta - pi, n);
- end
- v = -v; % flip the sign for second or third quadrant
- return
- end
-
- % Initialization of tables of constants used by CORDIC
- % need a table of arctangents of negative powers of two, in radians:
- % angles = atan(2.^-(0:27));
- angles = [ ...
- 0.78539816339745 0.46364760900081 0.24497866312686 0.12435499454676 ...
- 0.06241880999596 0.03123983343027 0.01562372862048 0.00781234106010 ...
- 0.00390623013197 0.00195312251648 0.00097656218956 0.00048828121119 ...
- 0.00024414062015 0.00012207031189 0.00006103515617 0.00003051757812 ...
- 0.00001525878906 0.00000762939453 0.00000381469727 0.00000190734863 ...
- 0.00000095367432 0.00000047683716 0.00000023841858 0.00000011920929 ...
- 0.00000005960464 0.00000002980232 0.00000001490116 0.00000000745058 ];
- % and a table of products of reciprocal lengths of vectors [1, 2^-j]:
- Kvalues = [ ...
- 0.70710678118655 0.63245553203368 0.61357199107790 0.60883391251775 ...
- 0.60764825625617 0.60735177014130 0.60727764409353 0.60725911229889 ...
- 0.60725447933256 0.60725332108988 0.60725303152913 0.60725295913894 ...
- 0.60725294104140 0.60725293651701 0.60725293538591 0.60725293510314 ...
- 0.60725293503245 0.60725293501477 0.60725293501035 0.60725293500925 ...
- 0.60725293500897 0.60725293500890 0.60725293500889 0.60725293500888 ];
- Kn = Kvalues(min(n, length(Kvalues)));
-
- % Initialize loop variables:
- v = [1;0]; % start with 2-vector cosine and sine of zero
- poweroftwo = 1;
- angle = angles(1);
-
- % Iterations
- for j = 0:n-1;
- if beta < 0
- sigma = -1;
- else
- sigma = 1;
- end
- factor = sigma * poweroftwo;
- R = [1, -factor; factor, 1];
- v = R * v; % 2-by-2 matrix multiply
- beta = beta - sigma * angle; % update the remaining angle
- poweroftwo = poweroftwo / 2;
- % update the angle from table, or eventually by just dividing by two
- if j+2 > length(angles)
- angle = angle / 2;
- else
- angle = angles(j+2);
- end
- end
-
- % Adjust length of output vector to be [cos(beta), sin(beta)]:
- v = v * Kn;
- return
-
- // C++
- #define C1
- #define C2
- #define TYPE double
-
- TYPE fixp_cordic(TYPE in,
- int n,
- int type)
- {
- int i;
- TYPE c,s,a;
- TYPE x,y,v;
- TYPE b;
-
- c = 0.5;
- s = 0.0;
- b = 1.0;
-
- for (i=0; i<n; i++) {
- a = angleValues[i];
- x = b * s;
- y = b * c;
-
- if (in < 0.0) {
- c = c + x;
- s = s - y;
- in = in + a;
- }
- else {
- c = c - x;
- s = s + y;
- in = in - a;
- }
- b = b / 2;
- }
-
- if (type == 0)
- v = c * kValues[n-1]*2;
- else
- v = s * kValues[n-1]*2;
-
- return (v);
- }
-
- TYPE fixp_cos(TYPE in,
- int n,
- int scale)
- {
- TYPE v;
- INT sign = 0;
-
- while ( (in < -M_PI/2) || (in > M_PI/2) ) {
- if (in < 0)
- in = in + M_PI;
- else
- in = in - M_PI;
-
- if (sign == 0)
- sign = 1;
- else
- sign = 0;
- }
-
- v = fixp_cordic(in,n,0);
-
- if (sign)
- v = -v;
-
- return (v);
- }
-
- TYPE fixp_sin(TYPE in,
- int n,
- int scale)
- {
- TYPE v;
- INT sign = 0;
-
- while ( (in < -M_PI/2) || (in > M_PI/2) ) {
- if (in < 0)
- in = in + M_PI;
- else
- in = in - M_PI;
-
- if (sign == 0)
- sign = 1;
- else
- sign = 0;
- }
-
- v = fixp_cordic(in,n,1);
-
- if (sign)
- v = -v;
-
- return (v);
- }
-*/
-
-
-#define SF_C1 1
-#define C1(x) FL2FXCONST_DBL(x/(1<<SF_C1))
-#define C2(x) FL2FXCONST_DBL(x)
-#define M_PI_4 FL2FXCONST_DBL(M_PI/4)
-#define ITER (DFRACT_BITS-1)
-
-/*
- for (i=0; i<DFRACT_BITS; i++) {
- angleValues[i] = FDKatan(FDKpow(2.0,-i));
- }
-*/
-const FIXP_DBL angleValues[DFRACT_BITS] = {
- C1(7.853981633974483e-001), C1(4.636476090008061e-001), C1(2.449786631268641e-001), C1(1.243549945467614e-001),
- C1(6.241880999595735e-002), C1(3.123983343026828e-002), C1(1.562372862047683e-002), C1(7.812341060101111e-003),
- C1(3.906230131966972e-003), C1(1.953122516478819e-003), C1(9.765621895593195e-004), C1(4.882812111948983e-004),
- C1(2.441406201493618e-004), C1(1.220703118936702e-004), C1(6.103515617420877e-005), C1(3.051757811552610e-005),
- C1(1.525878906131576e-005), C1(7.629394531101970e-006), C1(3.814697265606496e-006), C1(1.907348632810187e-006),
- C1(9.536743164059608e-007), C1(4.768371582030888e-007), C1(2.384185791015580e-007), C1(1.192092895507807e-007),
- C1(5.960464477539055e-008), C1(2.980232238769530e-008), C1(1.490116119384766e-008), C1(7.450580596923828e-009),
- C1(3.725290298461914e-009), C1(1.862645149230957e-009), C1(9.313225746154785e-010), C1(4.656612873077393e-010)
-};
-
-/*
- for (i=0; i<DFRACT_BITS; i++) {
- kValues[i] = 1.0;
- for (j=0; j<=i; j++) {
- val = FDKcos(FDKatan(FDKpow(2.0,-j)));
- kValues[i] *= val;
- }
- }
-*/
-const FIXP_DBL kValues[DFRACT_BITS] = {
- C2(7.071067811865476e-001), C2(6.324555320336759e-001), C2(6.135719910778964e-001), C2(6.088339125177524e-001),
- C2(6.076482562561683e-001), C2(6.073517701412960e-001), C2(6.072776440935261e-001), C2(6.072591122988928e-001),
- C2(6.072544793325625e-001), C2(6.072533210898753e-001), C2(6.072530315291345e-001), C2(6.072529591389450e-001),
- C2(6.072529410413973e-001), C2(6.072529365170104e-001), C2(6.072529353859136e-001), C2(6.072529351031395e-001),
- C2(6.072529350324459e-001), C2(6.072529350147725e-001), C2(6.072529350103542e-001), C2(6.072529350092496e-001),
- C2(6.072529350089735e-001), C2(6.072529350089044e-001), C2(6.072529350088872e-001), C2(6.072529350088829e-001),
- C2(6.072529350088818e-001), C2(6.072529350088816e-001), C2(6.072529350088814e-001), C2(6.072529350088814e-001),
- C2(6.072529350088814e-001), C2(6.072529350088814e-001), C2(6.072529350088814e-001), C2(6.072529350088814e-001)
-};
-
-inline
-static FIXP_DBL fixp_cordic(FIXP_DBL in,
- INT type)
-{
- int i;
- FIXP_DBL c,s,a;
- FIXP_DBL x,y;
- int n = ITER;
-
- in = fMult(in,M_PI_4);
- c = kValues[n-1] >> 1;
- s = FL2FXCONST_DBL(0.0f);
-
- for (i=0; i<n; i++) {
- a = angleValues[i];
- x = s >> i;
- y = c >> i;
-
- if (in < FL2FXCONST_DBL(0.0)) {
- c = c + x;
- s = s - y;
- in = in + a;
- }
- else {
- c = c - x;
- s = s + y;
- in = in - a;
- }
- }
-
- /* 1 headroom bit */
- if (type == 0)
- return (c);
- else
- return (s);
-}
-
-/*
- in: argument
- scale: scalefactor of argument has to be in the range of 0, ... ,DFRACT_BITS-1
- type: calculate cosine 0
- calculate sine 1
-*/
-static FIXP_DBL fixp_sincos(FIXP_DBL in,
- INT scale,
- INT type)
-{
- FIXP_DBL v;
- INT sign = 0;
- FIXP_DBL pi,pi_2;
-
- if (scale < 2) {
- in = in >> (2-scale);
- scale = 2;
- }
-
- pi = M_PI_4 >> (scale-2);
- pi_2 = M_PI_4 >> (scale-1);
-
- /* move signal into the range of -pi/2 to +pi/2 */
- while ( (in < (-pi_2)) || (in > (pi_2)) ) {
- if (in < FL2FXCONST_DBL(0.0))
- in = in + pi;
- else
- in = in - pi;
-
- sign = ~sign;
- }
-
- /* scale signal with 2/pi => unscaled signal is in the range of [-1.0,...,+1.0[ */
- in = fMult(in,FL2FXCONST_DBL(2/M_PI)) << scale;
-
- v = fixp_cordic(in,type);
-
- if (sign)
- v = -v;
-
- /* compensate 1 headroom bit */
- if ( v <= FL2FXCONST_DBL(-0.5f) )
- v = (FIXP_DBL) (MINVAL_DBL+1);
- else
- v = SATURATE_LEFT_SHIFT(v,1,DFRACT_BITS);
-
- return (v);
-}
-
-/*
- in: argument
- scale: scalefactor of argument has to be in the range of 0, ... ,DFRACT_BITS-1
-*/
-FIXP_DBL fixp_cos(FIXP_DBL in,
- INT scale)
-
-{
- FDK_ASSERT ((scale >= 0) && (scale < DFRACT_BITS));
-
- if (in == FL2FXCONST_DBL(0.0f))
- return /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL;
-
- return (fixp_sincos(in,scale,0));
-}
-
-/*
- in: argument
- scale: scalefactor of argument has to be in the range of 0, ... ,DFRACT_BITS-1
-*/
-FIXP_DBL fixp_sin(FIXP_DBL in,
- INT scale)
-
-{
- FDK_ASSERT ((scale >= 0) && (scale < DFRACT_BITS));
-
- if (in == FL2FXCONST_DBL(0.0f))
- return FL2FXCONST_DBL(0.0f);
-
- return (fixp_sincos(in,scale,1));
-}
-
-#endif /* #ifndef CORDIC_SINCOS */