op_dsp32_kfix_ln.c File Reference


Detailed Description

Natural logarithm operator for the AVR32 UC3.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

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)


Function Documentation

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 }


Generated on Fri Feb 19 02:23:20 2010 for AVR32 UC3 - EVK1104 DSPLib Demo Documentation by  doxygen 1.5.5