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 // Remove warnings 00063 #if DSP16_QA > 1 00064 // get ~ int(log2(num)) 00065 // num is in the range [1; 0.5] 00066 if (num > DSP16_Q(1.)) 00067 { 00068 under_bit_val = 0; 00069 num_temp = num; 00070 while (num_temp > DSP16_Q(1.)) 00071 { 00072 num_temp >>= 1; 00073 under_bit_val++; 00074 } 00075 num_temp = (num >> under_bit_val); 00076 } 00077 else 00078 #endif 00079 { 00080 under_bit_val = 0; 00081 num_temp = num; 00082 while (num_temp < DSP16_Q(0.5)) 00083 { 00084 num_temp <<= 1; 00085 under_bit_val++; 00086 } 00087 num_temp = (num << under_bit_val); 00088 } 00089 00090 // << (DSP16_QB - 1) to avoid overflows 00091 a = (((S32) num_temp) - DSP16_Q(1.)) << DSP16_QB; 00092 a = a/(((S32) num_temp) + DSP16_Q(1.)); 00093 // calculate a^2 00094 a_sqr = (a*a) >> DSP16_QB; 00095 00096 res = (a_sqr*DSP16_Q(1./9.)) >> DSP16_QB; 00097 res = (a_sqr*(res + DSP16_Q(1./7.))) >> DSP16_QB; 00098 res = (a_sqr*(res + DSP16_Q(1./5.))) >> DSP16_QB; 00099 res = (a_sqr*(res + DSP16_Q(1./3.))) >> DSP16_QB; 00100 res = (a*(res + DSP16_Q(1.))) >> (DSP16_QB - 1); 00101 00102 // Remove warnings 00103 #if DSP16_QA > 1 00104 if (num > DSP16_Q(1.)) 00105 res += ((S32) under_bit_val)*((S32) DSP16_Q(CST_LN_2)); 00106 else 00107 #endif 00108 res -= ((S32) under_bit_val)*((S32) DSP16_Q(CST_LN_2)); 00109 00110 return res; 00111 }