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
00033 static const int16_t tab_cos[65] =
00034 {
00035 32767, 32738, 32617, 32421, 32145, 31793, 31364, 30860,
00036 30280, 29629, 28905, 28113, 27252, 26326, 25336, 24285,
00037 23176, 22011, 20793, 19525, 18210, 16851, 15451, 14014,
00038 12543, 11043, 9515, 7965, 6395, 4810, 3214, 1609,
00039 1, -1607, -3211, -4808, -6393, -7962, -9513, -11040,
00040 -12541, -14012, -15449, -16848, -18207, -19523, -20791, -22009,
00041 -23174, -24283, -25334, -26324, -27250, -28111, -28904, -29627,
00042 -30279, -30858, -31363, -31792, -32144, -32419, -32616, -32736, -32768,
00043 };
00044
00045 static const uint16_t exp2a[]=
00046 {
00047 0, 1435, 2901, 4400, 5931, 7496, 9096, 10730,
00048 12400, 14106, 15850, 17632, 19454, 21315, 23216, 25160,
00049 27146, 29175, 31249, 33368, 35534, 37747, 40009, 42320,
00050 44682, 47095, 49562, 52082, 54657, 57289, 59979, 62727,
00051 };
00052
00053 static const uint16_t exp2b[]=
00054 {
00055 3, 712, 1424, 2134, 2845, 3557, 4270, 4982,
00056 5696, 6409, 7124, 7839, 8554, 9270, 9986, 10704,
00057 11421, 12138, 12857, 13576, 14295, 15014, 15734, 16455,
00058 17176, 17898, 18620, 19343, 20066, 20790, 21514, 22238,
00059 };
00060
00061 int16_t ff_cos(uint16_t arg)
00062 {
00063 uint8_t offset= arg;
00064 uint8_t ind = arg >> 8;
00065
00066 assert(arg <= 0x3fff);
00067
00068 return tab_cos[ind] + (offset * (tab_cos[ind+1] - tab_cos[ind]) >> 8);
00069 }
00070
00071 int ff_exp2(uint16_t power)
00072 {
00073 unsigned int result= exp2a[power>>10] + 0x10000;
00074
00075 assert(power <= 0x7fff);
00076
00077 result= (result<<3) + ((result*exp2b[(power>>5)&31])>>17);
00078 return result + ((result*(power&31)*89)>>22);
00079 }
00080
00086 static const uint16_t tab_log2[33] =
00087 {
00088 4, 1459, 2870, 4240, 5572, 6867, 8127, 9355,
00089 10552, 11719, 12858, 13971, 15057, 16120, 17158, 18175,
00090 19170, 20145, 21100, 22036, 22954, 23854, 24738, 25605,
00091 26457, 27294, 28116, 28924, 29719, 30500, 31269, 32025, 32769,
00092 };
00093
00094 int ff_log2(uint32_t value)
00095 {
00096 uint8_t power_int;
00097 uint8_t frac_x0;
00098 uint16_t frac_dx;
00099
00100
00101 power_int = av_log2(value);
00102 value <<= (31 - power_int);
00103
00104
00105 frac_x0 = (value & 0x7c000000) >> 26;
00106 frac_dx = (value & 0x03fff800) >> 11;
00107
00108 value = tab_log2[frac_x0];
00109 value += (frac_dx * (tab_log2[frac_x0+1] - tab_log2[frac_x0])) >> 15;
00110
00111 return (power_int << 15) + value;
00112 }
00113
00114 float ff_dot_productf(const float* a, const float* b, int length)
00115 {
00116 float sum = 0;
00117 int i;
00118
00119 for(i=0; i<length; i++)
00120 sum += a[i] * b[i];
00121
00122 return sum;
00123 }