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 // Remove warnings 00063 #if DSP32_QA > 1 00064 // get ~ int(log2(num)) 00065 // num is in the range [1; 0.5] 00066 if (num > DSP32_Q(1.)) 00067 { 00068 under_bit_val = 0; 00069 num_temp = num; 00070 while (num_temp > DSP32_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 < DSP32_Q(0.5)) 00083 { 00084 num_temp <<= 1; 00085 under_bit_val++; 00086 } 00087 num_temp = (num << under_bit_val); 00088 } 00089 00090 // << (DSP32_QB - 1) to avoid overflows 00091 a = (((S64) num_temp) - DSP32_Q(1.)) << DSP32_QB; 00092 a = a/(((S64) num_temp) + DSP32_Q(1.)); 00093 // calculate a^2 00094 a_sqr = (a*a) >> DSP32_QB; 00095 00096 res = (a_sqr*DSP32_Q(1./13.)) >> DSP32_QB; 00097 res = (a_sqr*(res + DSP32_Q(1./11.))) >> DSP32_QB; 00098 res = (a_sqr*(res + DSP32_Q(1./9.))) >> DSP32_QB; 00099 res = (a_sqr*(res + DSP32_Q(1./7.))) >> DSP32_QB; 00100 res = (a_sqr*(res + DSP32_Q(1./5.))) >> DSP32_QB; 00101 res = (a_sqr*(res + DSP32_Q(1./3.))) >> DSP32_QB; 00102 res = (a*(res + DSP32_Q(1.))) >> (DSP32_QB - 1); 00103 00104 // Remove warnings 00105 #if DSP32_QA > 1 00106 if (num > DSP32_Q(1.)) 00107 res += ((S64) under_bit_val)*((S64) DSP32_Q(CST_LN_2)); 00108 else 00109 #endif 00110 res -= ((S64) under_bit_val)*((S64) DSP32_Q(CST_LN_2)); 00111 00112 return res; 00113 }