parent
9b2cd65be9
commit
27b2e96664
@ -1,50 +0,0 @@ |
||||
/* ----------------------------------------------------------------------
|
||||
* https://community.arm.com/tools/f/discussions/4292/cmsis-dsp-new-functionality-proposal/22621#22621
|
||||
* Fast approximation to the log2() function. It uses a two step |
||||
* process. First, it decomposes the floating-point number into |
||||
* a fractional component F and an exponent E. The fraction component |
||||
* is used in a polynomial approximation and then the exponent added |
||||
* to the result. A 3rd order polynomial is used and the result |
||||
* when computing db20() is accurate to 7.984884e-003 dB. |
||||
** ------------------------------------------------------------------- */ |
||||
|
||||
float log2f_approx_coeff[4] = {1.23149591368684f, -4.11852516267426f, 6.02197014179219f, -3.13396450166353f}; |
||||
|
||||
float log2f_approx(float X) |
||||
{ |
||||
float *C = &log2f_approx_coeff[0]; |
||||
float Y; |
||||
float F; |
||||
int E; |
||||
|
||||
// This is the approximation to log2()
|
||||
F = frexpf(fabsf(X), &E); |
||||
|
||||
// Y = C[0]*F*F*F + C[1]*F*F + C[2]*F + C[3] + E;
|
||||
Y = *C++; |
||||
Y *= F; |
||||
Y += (*C++); |
||||
Y *= F; |
||||
Y += (*C++); |
||||
Y *= F; |
||||
Y += (*C++); |
||||
Y += E; |
||||
return(Y); |
||||
} |
||||
|
||||
// https://codingforspeed.com/using-faster-exponential-approximation/
|
||||
inline float expf_approx(float x) { |
||||
x = 1.0f + x / 1024; |
||||
x *= x; x *= x; x *= x; x *= x; |
||||
x *= x; x *= x; x *= x; x *= x; |
||||
x *= x; x *= x; |
||||
return x; |
||||
} |
||||
|
||||
inline float unitToDb(float unit) { |
||||
return 6.02f * log2f_approx(unit); |
||||
} |
||||
|
||||
inline float dbToUnit(float db) { |
||||
return expf_approx(db * 2.302585092994046f * 0.05f); |
||||
} |
Loading…
Reference in new issue