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