• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

libavcodec/celp_math.c

Go to the documentation of this file.
00001 /*
00002  * Various fixed-point math operations
00003  *
00004  * Copyright (c) 2008 Vladimir Voroshilov
00005  *
00006  * This file is part of Libav.
00007  *
00008  * Libav is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * Libav is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with Libav; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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     // Stripping zeros from beginning
00101     power_int = av_log2(value);
00102     value <<= (31 - power_int);
00103 
00104     // b31 is always non-zero now
00105     frac_x0 = (value & 0x7c000000) >> 26; // b26-b31 and [32..63] -> [0..31]
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 }
Generated on Thu Jan 24 2013 17:08:50 for Libav by doxygen 1.7.1