op_dsp16_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_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)


Function Documentation

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 }


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