00001
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "dsp.h"
00047
00048 #if defined(FORCE_ALL_GENERICS) || \
00049 defined(FORCE_GENERIC_OP16_LOG10) || \
00050 !defined(TARGET_SPECIFIC_OP16_LOG10)
00051
00052 dsp16_t dsp16_op_log10(dsp16_t number)
00053 {
00054 S32 res;
00055 const S32 cst_ln2 = (S32) DSP_Q(32-DSP16_QB, DSP16_QB, 1./CST_LN_10);
00056 extern S32 dsp16_op_ln_raw(dsp16_t num);
00057
00058 res = dsp16_op_ln_raw(number);
00059
00060 if (res == DSP_Q_MIN(DSP16_QA, DSP16_QB) || res < ((S32) 0x80000000)/cst_ln2)
00061 return DSP_Q_MIN(DSP16_QA, DSP16_QB);
00062
00063 res = (res*cst_ln2) >> DSP16_QB;
00064
00065 if (res < ((S32) DSP_Q_MIN(DSP16_QA, DSP16_QB)))
00066 return (dsp16_t) DSP_Q_MIN(DSP16_QA, DSP16_QB);
00067
00068 return (dsp16_t) res;
00069 }
00070
00071 #endif
00072
00073 #if defined(FORCE_ALL_GENERICS) || \
00074 defined(FORCE_GENERIC_OP32_LOG10) || \
00075 !defined(TARGET_SPECIFIC_OP32_LOG10)
00076
00077 dsp32_t dsp32_op_log10(dsp32_t number)
00078 {
00079 S64 res;
00080 const S64 cst_ln2 = (S64) ((1./CST_LN_10)*(1LL << DSP32_QB));
00081 extern S64 dsp32_op_ln_raw(dsp32_t num);
00082
00083 res = dsp32_op_ln_raw(number);
00084
00085 if (res == DSP_Q_MIN(DSP32_QA, DSP32_QB) || res < ((S64) -0x8000000000000000LL)/cst_ln2)
00086 return DSP_Q_MIN(DSP32_QA, DSP32_QB);
00087
00088 res = (res*cst_ln2) >> DSP32_QB;
00089
00090 if (res < ((S64) DSP_Q_MIN(DSP32_QA, DSP32_QB)))
00091 return (dsp32_t) DSP_Q_MIN(DSP32_QA, DSP32_QB);
00092
00093 return (dsp32_t) res;
00094 }
00095
00096 #endif