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   // 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 }


Generated on Thu Dec 17 19:57:24 2009 for AVR32 UC3 - EVK1104 DSPLib Demo Documentation by  doxygen 1.5.5