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


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