00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <math.h>
00031
00032 #include "config.h"
00033
00034 #ifndef PI
00035 # ifdef M_PI
00036 # define PI M_PI
00037 # else
00038 # define PI 3.14159265358979323846
00039 # endif
00040 #endif
00041
00042
00043 void init_fdct _ANSI_ARGS_((void));
00044 void fdct _ANSI_ARGS_((short *block));
00045
00046
00047 static double c[8][8];
00048
00049 void init_fdct()
00050 {
00051 int i, j;
00052 double s;
00053
00054 for (i=0; i<8; i++)
00055 {
00056 s = (i==0) ? sqrt(0.125) : 0.5;
00057
00058 for (j=0; j<8; j++)
00059 c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
00060 }
00061 }
00062
00063 void fdct(block)
00064 short *block;
00065 {
00066 register int i, j;
00067 double s;
00068 double tmp[64];
00069
00070 for(i = 0; i < 8; i++)
00071 for(j = 0; j < 8; j++)
00072 {
00073 s = 0.0;
00074
00075
00076
00077
00078
00079 s += c[j][0] * block[8 * i + 0];
00080 s += c[j][1] * block[8 * i + 1];
00081 s += c[j][2] * block[8 * i + 2];
00082 s += c[j][3] * block[8 * i + 3];
00083 s += c[j][4] * block[8 * i + 4];
00084 s += c[j][5] * block[8 * i + 5];
00085 s += c[j][6] * block[8 * i + 6];
00086 s += c[j][7] * block[8 * i + 7];
00087
00088 tmp[8 * i + j] = s;
00089 }
00090
00091 for(j = 0; j < 8; j++)
00092 for(i = 0; i < 8; i++)
00093 {
00094 s = 0.0;
00095
00096
00097
00098
00099
00100 s += c[i][0] * tmp[8 * 0 + j];
00101 s += c[i][1] * tmp[8 * 1 + j];
00102 s += c[i][2] * tmp[8 * 2 + j];
00103 s += c[i][3] * tmp[8 * 3 + j];
00104 s += c[i][4] * tmp[8 * 4 + j];
00105 s += c[i][5] * tmp[8 * 5 + j];
00106 s += c[i][6] * tmp[8 * 6 + j];
00107 s += c[i][7] * tmp[8 * 7 + j];
00108
00109 block[8 * i + j] = (int)floor(s + 0.499999);
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 }
00120 }