Definition in file op_dsp16_kfix_ln.c.
#include "dsp.h"
#include "preprocessor.h"
Go to the source code of this file.
Functions | |
S32 | dsp16_op_ln_raw (dsp16_t num) |
S32 dsp16_op_ln_raw | ( | dsp16_t | num | ) |
Definition at line 52 of file op_dsp16_kfix_ln.c.
References CST_LN_2, DSP16_Q, DSP16_QA, DSP16_QB, and DSP_Q_MIN.
Referenced by dsp16_op_ln(), dsp16_op_log10(), dsp16_op_log2(), and dsp16_op_pow().
00053 { 00054 dsp16_t num_temp; 00055 S32 a, a_sqr, res; 00056 int under_bit_val; 00057 00058 // Limit 00059 if (num <= DSP16_Q(0.)) 00060 return DSP_Q_MIN(DSP16_QA, DSP16_QB); 00061 00062 // get ~ int(log2(num)) 00063 // num is in the range [1; 0.5] 00064 if (num > DSP16_Q(1.)) 00065 { 00066 under_bit_val = 0; 00067 num_temp = num; 00068 while (num_temp > DSP16_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 < DSP16_Q(0.5)) 00080 { 00081 num_temp <<= 1; 00082 under_bit_val++; 00083 } 00084 num_temp = (num << under_bit_val); 00085 } 00086 00087 // << (DSP16_QB - 1) to avoid overflows 00088 a = (((S32) num_temp) - DSP16_Q(1.)) << DSP16_QB; 00089 a = a/(((S32) num_temp) + DSP16_Q(1.)); 00090 // calculate a^2 00091 a_sqr = (a*a) >> DSP16_QB; 00092 00093 res = (a_sqr*DSP16_Q(1./9.)) >> DSP16_QB; 00094 res = (a_sqr*(res + DSP16_Q(1./7.))) >> DSP16_QB; 00095 res = (a_sqr*(res + DSP16_Q(1./5.))) >> DSP16_QB; 00096 res = (a_sqr*(res + DSP16_Q(1./3.))) >> DSP16_QB; 00097 res = (a*(res + DSP16_Q(1.))) >> (DSP16_QB - 1); 00098 00099 if (num > DSP16_Q(1.)) 00100 res += ((S32) under_bit_val)*((S32) DSP16_Q(CST_LN_2)); 00101 else 00102 res -= ((S32) under_bit_val)*((S32) DSP16_Q(CST_LN_2)); 00103 00104 return res; 00105 }