Definition in file op_dsp32_kfix_ln.c.
#include "dsp.h"
#include "preprocessor.h"
Go to the source code of this file.
Functions | |
S64 | dsp32_op_ln_raw (dsp32_t num) |
S64 dsp32_op_ln_raw | ( | dsp32_t | num | ) |
Definition at line 52 of file op_dsp32_kfix_ln.c.
References CST_LN_2, DSP32_Q, DSP32_QA, DSP32_QB, and DSP_Q_MIN.
Referenced by dsp32_op_ln(), dsp32_op_log10(), dsp32_op_log2(), and dsp32_op_pow().
00053 { 00054 dsp32_t num_temp; 00055 S64 a, a_sqr, res; 00056 int under_bit_val; 00057 00058 // Limit 00059 if (num <= DSP32_Q(0.)) 00060 return DSP_Q_MIN(DSP32_QA, DSP32_QB); 00061 00062 // get ~ int(log2(num)) 00063 // num is in the range [1; 0.5] 00064 if (num > DSP32_Q(1.)) 00065 { 00066 under_bit_val = 0; 00067 num_temp = num; 00068 while (num_temp > DSP32_Q(1.)) 00069 { 00070 num_temp >>= 1; 00071 under_bit_val++; 00072 } 00073 num_temp = (num >> under_bit_val); 00074 } 00075 else 00076 { 00077 under_bit_val = 0; 00078 num_temp = num; 00079 while (num_temp < DSP32_Q(0.5)) 00080 { 00081 num_temp <<= 1; 00082 under_bit_val++; 00083 } 00084 num_temp = (num << under_bit_val); 00085 } 00086 00087 // << (DSP32_QB - 1) to avoid overflows 00088 a = (((S64) num_temp) - DSP32_Q(1.)) << DSP32_QB; 00089 a = a/(((S64) num_temp) + DSP32_Q(1.)); 00090 // calculate a^2 00091 a_sqr = (a*a) >> DSP32_QB; 00092 00093 res = (a_sqr*DSP32_Q(1./13.)) >> DSP32_QB; 00094 res = (a_sqr*(res + DSP32_Q(1./11.))) >> DSP32_QB; 00095 res = (a_sqr*(res + DSP32_Q(1./9.))) >> DSP32_QB; 00096 res = (a_sqr*(res + DSP32_Q(1./7.))) >> DSP32_QB; 00097 res = (a_sqr*(res + DSP32_Q(1./5.))) >> DSP32_QB; 00098 res = (a_sqr*(res + DSP32_Q(1./3.))) >> DSP32_QB; 00099 res = (a*(res + DSP32_Q(1.))) >> (DSP32_QB - 1); 00100 00101 if (num > DSP32_Q(1.)) 00102 res += ((S64) under_bit_val)*((S64) DSP32_Q(CST_LN_2)); 00103 else 00104 res -= ((S64) under_bit_val)*((S64) DSP32_Q(CST_LN_2)); 00105 00106 return res; 00107 }