00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <inttypes.h>
00024 #include <limits.h>
00025 #include <assert.h>
00026
00027 #include "avcodec.h"
00028 #include "mathops.h"
00029 #include "celp_math.h"
00030
00031 #ifdef G729_BITEXACT
00032
00035 static const int16_t base_cos[64] =
00036 {
00037 32767, 32729, 32610, 32413, 32138, 31786, 31357, 30853,
00038 30274, 29622, 28899, 28106, 27246, 26320, 25330, 24279,
00039 23170, 22006, 20788, 19520, 18205, 16846, 15447, 14010,
00040 12540, 11039, 9512, 7962, 6393, 4808, 3212, 1608,
00041 0, -1608, -3212, -4808, -6393, -7962, -9512, -11039,
00042 -12540, -14010, -15447, -16846, -18205, -19520, -20788, -22006,
00043 -23170, -24279, -25330, -26320, -27246, -28106, -28899, -29622,
00044 -30274, -30853, -31357, -31786, -32138, -32413, -32610, -32729
00045 };
00046
00053 static const int16_t slope_cos[64] =
00054 {
00055 -632, -1893, -3150, -4399, -5638, -6863, -8072, -9261,
00056 -10428, -11570, -12684, -13767, -14817, -15832, -16808, -17744,
00057 -18637, -19486, -20287, -21039, -21741, -22390, -22986, -23526,
00058 -24009, -24435, -24801, -25108, -25354, -25540, -25664, -25726,
00059 -25726, -25664, -25540, -25354, -25108, -24801, -24435, -24009,
00060 -23526, -22986, -22390, -21741, -21039, -20287, -19486, -18637,
00061 -17744, -16808, -15832, -14817, -13767, -12684, -11570, -10428,
00062 -9261, -8072, -6863, -5638, -4399, -3150, -1893, -632
00063 };
00064
00070 static const uint16_t tab_exp2[33] =
00071 {
00072 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
00073 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
00074 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
00075 31379, 32066, 32767
00076 };
00077
00078 int16_t ff_cos(uint16_t arg)
00079 {
00080 uint8_t offset= arg;
00081 uint8_t ind = arg >> 8;
00082
00083 assert(arg < 0x4000);
00084
00085 return FFMAX(base_cos[ind] + ((slope_cos[ind] * offset) >> 12), -0x8000);
00086 }
00087
00088 int ff_exp2(uint16_t power)
00089 {
00090 uint16_t frac_x0;
00091 uint16_t frac_dx;
00092 int result;
00093
00094 assert(power <= 0x7fff);
00095
00096 frac_x0 = power >> 10;
00097 frac_dx = (power & 0x03ff) << 5;
00098
00099 result = tab_exp2[frac_x0] << 15;
00100 result += frac_dx * (tab_exp2[frac_x0+1] - tab_exp2[frac_x0]);
00101
00102 return result >> 10;
00103 }
00104
00105 #else // G729_BITEXACT
00106
00110 static const int16_t tab_cos[65] =
00111 {
00112 32767, 32738, 32617, 32421, 32145, 31793, 31364, 30860,
00113 30280, 29629, 28905, 28113, 27252, 26326, 25336, 24285,
00114 23176, 22011, 20793, 19525, 18210, 16851, 15451, 14014,
00115 12543, 11043, 9515, 7965, 6395, 4810, 3214, 1609,
00116 1, -1607, -3211, -4808, -6393, -7962, -9513, -11040,
00117 -12541, -14012, -15449, -16848, -18207, -19523, -20791, -22009,
00118 -23174, -24283, -25334, -26324, -27250, -28111, -28904, -29627,
00119 -30279, -30858, -31363, -31792, -32144, -32419, -32616, -32736, -32768,
00120 };
00121
00122 static const uint16_t exp2a[]=
00123 {
00124 0, 1435, 2901, 4400, 5931, 7496, 9096, 10730,
00125 12400, 14106, 15850, 17632, 19454, 21315, 23216, 25160,
00126 27146, 29175, 31249, 33368, 35534, 37747, 40009, 42320,
00127 44682, 47095, 49562, 52082, 54657, 57289, 59979, 62727,
00128 };
00129
00130 static const uint16_t exp2b[]=
00131 {
00132 3, 712, 1424, 2134, 2845, 3557, 4270, 4982,
00133 5696, 6409, 7124, 7839, 8554, 9270, 9986, 10704,
00134 11421, 12138, 12857, 13576, 14295, 15014, 15734, 16455,
00135 17176, 17898, 18620, 19343, 20066, 20790, 21514, 22238,
00136 };
00137
00138 int16_t ff_cos(uint16_t arg)
00139 {
00140 uint8_t offset= arg;
00141 uint8_t ind = arg >> 8;
00142
00143 assert(arg <= 0x3fff);
00144
00145 return tab_cos[ind] + (offset * (tab_cos[ind+1] - tab_cos[ind]) >> 8);
00146 }
00147
00148 int ff_exp2(uint16_t power)
00149 {
00150 unsigned int result= exp2a[power>>10] + 0x10000;
00151
00152 assert(power <= 0x7fff);
00153
00154 result= (result<<3) + ((result*exp2b[(power>>5)&31])>>17);
00155 return result + ((result*(power&31)*89)>>22);
00156 }
00157
00158 #endif // else G729_BITEXACT
00159
00165 static const uint16_t tab_log2[33] =
00166 {
00167 #ifdef G729_BITEXACT
00168 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352,
00169 10549, 11716, 12855, 13967, 15054, 16117, 17156, 18172,
00170 19167, 20142, 21097, 22033, 22951, 23852, 24735, 25603,
00171 26455, 27291, 28113, 28922, 29716, 30497, 31266, 32023, 32767,
00172 #else
00173 4, 1459, 2870, 4240, 5572, 6867, 8127, 9355,
00174 10552, 11719, 12858, 13971, 15057, 16120, 17158, 18175,
00175 19170, 20145, 21100, 22036, 22954, 23854, 24738, 25605,
00176 26457, 27294, 28116, 28924, 29719, 30500, 31269, 32025, 32769,
00177 #endif
00178 };
00179
00180 int ff_log2(uint32_t value)
00181 {
00182 uint8_t power_int;
00183 uint8_t frac_x0;
00184 uint16_t frac_dx;
00185
00186
00187 power_int = av_log2(value);
00188 value <<= (31 - power_int);
00189
00190
00191 frac_x0 = (value & 0x7c000000) >> 26;
00192 frac_dx = (value & 0x03fff800) >> 11;
00193
00194 value = tab_log2[frac_x0];
00195 value += (frac_dx * (tab_log2[frac_x0+1] - tab_log2[frac_x0])) >> 15;
00196
00197 return (power_int << 15) + value;
00198 }
00199
00200 int64_t ff_dot_product(const int16_t *a, const int16_t *b, int length)
00201 {
00202 int i;
00203 int64_t sum = 0;
00204
00205 for (i = 0; i < length; i++)
00206 sum += MUL16(a[i], b[i]);
00207
00208 return sum;
00209 }
00210
00211 float ff_dot_productf(const float* a, const float* b, int length)
00212 {
00213 float sum = 0;
00214 int i;
00215
00216 for(i=0; i<length; i++)
00217 sum += a[i] * b[i];
00218
00219 return sum;
00220 }