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 #include "dsp.h"
00046 #include "preprocessor.h"
00047
00048 #define A 1.
00049 #define B 0.5
00050 #define C 0.16666666666666666666666666666667
00051 #define D 0.041666666666666666666666666666667
00052 #define E 0.0083333333333333333333333333333333
00053
00054
00055
00056
00057
00058
00059
00060
00061 #define DSP_EXP_0_LIMIT_VAL -0.69314718056
00062 #define DSP_EXP_1_LIMIT_VAL 0.
00063 #define DSP_EXP_2_LIMIT_VAL 0.69314718056
00064 #define DSP_EXP_3_LIMIT_VAL 1.38629436112
00065 #define DSP_EXP_4_LIMIT_VAL 2.07944154168
00066 #define DSP_EXP_5_LIMIT_VAL 2.77258872224
00067 #define DSP_EXP_6_LIMIT_VAL 3.46573590280
00068 #define DSP_EXP_7_LIMIT_VAL 4.15888308336
00069 #define DSP_EXP_8_LIMIT_VAL 4.85203026392
00070 #define DSP_EXP_9_LIMIT_VAL 5.54517744448
00071 #define DSP_EXP_10_LIMIT_VAL 6.23832462504
00072 #define DSP_EXP_11_LIMIT_VAL 6.93147180560
00073 #define DSP_EXP_12_LIMIT_VAL 7.62461898616
00074 #define DSP_EXP_13_LIMIT_VAL 8.31776616672
00075 #define DSP_EXP_14_LIMIT_VAL 9.01091334728
00076 #define DSP_EXP_15_LIMIT_VAL 9.70406052784
00077 #define DSP_EXP_16_LIMIT_VAL 10.39720770840
00078 #define DSP_EXP_17_LIMIT_VAL 11.09035488896
00079 #define DSP_EXP_18_LIMIT_VAL 11.78350206952
00080 #define DSP_EXP_19_LIMIT_VAL 12.47664925008
00081 #define DSP_EXP_20_LIMIT_VAL 13.16979643064
00082 #define DSP_EXP_21_LIMIT_VAL 13.86294361120
00083 #define DSP_EXP_22_LIMIT_VAL 14.55609079176
00084 #define DSP_EXP_23_LIMIT_VAL 15.24923797232
00085 #define DSP_EXP_24_LIMIT_VAL 15.94238515288
00086 #define DSP_EXP_25_LIMIT_VAL 16.63553233344
00087 #define DSP_EXP_26_LIMIT_VAL 17.32867951400
00088 #define DSP_EXP_27_LIMIT_VAL 18.02182669456
00089 #define DSP_EXP_28_LIMIT_VAL 18.71497387512
00090 #define DSP_EXP_29_LIMIT_VAL 19.40812105568
00091 #define DSP_EXP_30_LIMIT_VAL 20.10126823624
00092 #define DSP_EXP_31_LIMIT_VAL 20.79441541680
00093 #define DSP_EXP_32_LIMIT_VAL 21.48756259736
00094
00095
00096 #define DSP16_EXP_LIMIT_VAL DSP16_Q(ATPASTE3(DSP_EXP_, DSP16_QA, _LIMIT_VAL) - DSP_FP_RES(DSP16_QA, DSP16_QB))
00097
00098 #define DSP32_EXP_LIMIT_VAL DSP32_Q(ATPASTE3(DSP_EXP_, DSP32_QA, _LIMIT_VAL) - DSP_FP_RES(DSP32_QA, DSP32_QB))
00099
00100 #if defined(FORCE_ALL_GENERICS) || \
00101 defined(FORCE_GENERIC_OP16_EXP) || \
00102 !defined(TARGET_SPECIFIC_OP16_EXP)
00103
00104
00105 dsp16_t dsp16_op_exp(dsp16_t num)
00106 {
00107 int k;
00108 S32 x, res;
00109
00110 if (num > DSP16_EXP_LIMIT_VAL)
00111 return DSP_Q_MAX(DSP16_QA, DSP16_QB);
00112
00113
00114 x = (S32) DSP_Q(32-DSP16_QB, DSP16_QB, 2./CST_LN_2) >> 1;
00115 k = ((((S32) num)*x)) >> (2*DSP16_QB - 1);
00116
00117
00118 x = DSP16_Q(CST_LN_2*0.5);
00119 x = ((S32) num) - x*((S32) k);
00120
00121
00122 res = (x*((S32) DSP16_Q(C))) >> DSP16_QB;
00123 res = (x*(res + ((S32) DSP16_Q(B)))) >> DSP16_QB;
00124 res = (x*(res + ((S32) DSP16_Q(A)))) >> DSP16_QB;
00125 res += ((S32) DSP16_Q(1.));
00126
00127 if (k > 0)
00128 {
00129 if (k&1)
00130 res = ((res << (k >> 1))*DSP16_Q(CST_SQUARE_ROOT_2)) >> DSP16_QB;
00131 else
00132 res <<= (k >> 1);
00133 }
00134 else
00135 {
00136 if (k&1)
00137 res = ((res >> (dsp16_op_abs(k) >> 1))*DSP16_Q(CST_INV_SQUARE_ROOT_2)) >> DSP16_QB;
00138 else
00139 res >>= (dsp16_op_abs(k) >> 1);
00140 }
00141
00142 return res;
00143 }
00144
00145 #endif
00146
00147 #if defined(FORCE_ALL_GENERICS) || \
00148 defined(FORCE_GENERIC_OP32_EXP) || \
00149 !defined(TARGET_SPECIFIC_OP32_EXP)
00150
00151 dsp32_t dsp32_op_exp(dsp32_t num)
00152 {
00153 int k;
00154 S64 x, res;
00155
00156 if (num > DSP32_EXP_LIMIT_VAL)
00157 return DSP_Q_MAX(DSP32_QA, DSP32_QB);
00158
00159
00160 x = (S64) ((2LL/CST_LN_2)*(1LL << (DSP32_QB -1 )));
00161 k = ((((S64) num)*x)) >> (2*DSP32_QB - 1);
00162
00163
00164 x = DSP32_Q(CST_LN_2*0.5);
00165 x = ((S64) num) - x*((S64) k);
00166
00167
00168 res = (x*((S32) DSP32_Q(E))) >> DSP32_QB;
00169 res = (x*(res + ((S64) DSP32_Q(D)))) >> DSP32_QB;
00170 res = (x*(res + ((S64) DSP32_Q(C)))) >> DSP32_QB;
00171 res = (x*(res + ((S64) DSP32_Q(B)))) >> DSP32_QB;
00172 res = (x*(res + ((S64) DSP32_Q(A)))) >> DSP32_QB;
00173 res += ((S64) DSP32_Q(1.));
00174
00175 if (k > 0)
00176 {
00177 if (k&1)
00178 res = ((res << (k >> 1))*DSP32_Q(CST_SQUARE_ROOT_2)) >> DSP32_QB;
00179 else
00180 res <<= (k >> 1);
00181 }
00182 else
00183 {
00184 if (k&1)
00185 res = ((res >> (dsp32_op_abs(k) >> 1))*DSP32_Q(CST_INV_SQUARE_ROOT_2)) >> DSP32_QB;
00186 else
00187 res >>= (dsp32_op_abs(k) >> 1);
00188 }
00189
00190 return res;
00191 }
00192
00193 #endif