mirror of
https://github.com/aicodix/dsp.git
synced 2026-04-27 14:30:36 +00:00
added exponentiation approximations
This commit is contained in:
parent
d1f2e2f9f9
commit
4e57633034
2 changed files with 57 additions and 0 deletions
|
|
@ -66,6 +66,10 @@ Normalizers for [periodic](https://en.wikipedia.org/wiki/Periodic_function) sign
|
||||||
|
|
||||||
[atan](https://en.wikipedia.org/wiki/Inverse_trigonometric_functions) and [atan2](https://en.wikipedia.org/wiki/Atan2).
|
[atan](https://en.wikipedia.org/wiki/Inverse_trigonometric_functions) and [atan2](https://en.wikipedia.org/wiki/Atan2).
|
||||||
|
|
||||||
|
### [exp.hh](exp.hh)
|
||||||
|
|
||||||
|
[Exponentiation](https://en.wikipedia.org/wiki/Exponentiation) approximations.
|
||||||
|
|
||||||
### [cordic.hh](cordic.hh)
|
### [cordic.hh](cordic.hh)
|
||||||
|
|
||||||
When working on a device where multiplication is expensive, the [CORDIC](https://en.wikipedia.org/wiki/CORDIC) comes in handy for computing [trigonometric functions](https://en.wikipedia.org/wiki/Trigonometric_functions).
|
When working on a device where multiplication is expensive, the [CORDIC](https://en.wikipedia.org/wiki/CORDIC) comes in handy for computing [trigonometric functions](https://en.wikipedia.org/wiki/Trigonometric_functions).
|
||||||
|
|
|
||||||
53
exp.hh
Normal file
53
exp.hh
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
Exponentiation approximations
|
||||||
|
|
||||||
|
Constants below lifted from the Cephes Mathematical Library:
|
||||||
|
https://www.netlib.org/cephes/cmath.tgz
|
||||||
|
|
||||||
|
Copyright 2018 Ahmet Inan <inan@aicodix.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace DSP {
|
||||||
|
|
||||||
|
template <typename TYPE>
|
||||||
|
TYPE ldexp(TYPE x, int n)
|
||||||
|
{
|
||||||
|
int a = n < 0 ? -n : n;
|
||||||
|
int a8 = a / 8;
|
||||||
|
int ar = a - a8 * 8;
|
||||||
|
TYPE t = 1 << a8;
|
||||||
|
t *= t;
|
||||||
|
t *= t;
|
||||||
|
t *= t;
|
||||||
|
t *= 1 << ar;
|
||||||
|
return n < 0 ? x / t : x * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TYPE>
|
||||||
|
TYPE exp10(TYPE x)
|
||||||
|
{
|
||||||
|
static constexpr TYPE
|
||||||
|
LOG210 = 3.32192809488736234787e0,
|
||||||
|
LG102A = 3.01025390625000000000E-1,
|
||||||
|
LG102B = 4.60503898119521373889E-6,
|
||||||
|
P0 = 4.09962519798587023075E-2,
|
||||||
|
P1 = 1.17452732554344059015E1,
|
||||||
|
P2 = 4.06717289936872725516E2,
|
||||||
|
P3 = 2.39423741207388267439E3,
|
||||||
|
Q0 = 8.50936160849306532625E1,
|
||||||
|
Q1 = 1.27209271178345121210E3,
|
||||||
|
Q2 = 2.07960819286001865907E3;
|
||||||
|
TYPE i = nearbyint(x * LOG210);
|
||||||
|
x -= i * LG102A;
|
||||||
|
x -= i * LG102B;
|
||||||
|
TYPE xx = x * x;
|
||||||
|
TYPE py = x * (xx * (xx * (xx * P0 + P1) + P2) + P3);
|
||||||
|
TYPE qy = xx * (xx * (xx + Q0) + Q1) + Q2;
|
||||||
|
TYPE pq = TYPE(1) + TYPE(2) * py / (qy - py);
|
||||||
|
return ldexp(pq, (int)i);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue