2
Short Discrete Cosine Transform
4
method :row-column, radix 4 FFT
8
void ddct8x8s(int isgn, float **a);
13
-------- 8x8 DCT (Discrete Cosine Transform) / Inverse of DCT --------
15
<case1> Normalized 8x8 IDCT
16
C[k1][k2] = (1/4) * sum_j1=0^7 sum_j2=0^7
17
a[j1][j2] * s[j1] * s[j2] *
18
cos(pi*j1*(k1+1/2)/8) *
19
cos(pi*j2*(k2+1/2)/8), 0<=k1<8, 0<=k2<8
20
(s[0] = 1/sqrt(2), s[j] = 1, j > 0)
21
<case2> Normalized 8x8 DCT
22
C[k1][k2] = (1/4) * s[k1] * s[k2] * sum_j1=0^7 sum_j2=0^7
24
cos(pi*(j1+1/2)*k1/8) *
25
cos(pi*(j2+1/2)*k2/8), 0<=k1<8, 0<=k2<8
26
(s[0] = 1/sqrt(2), s[j] = 1, j > 0)
33
a[0...7][0...7] :input/output data (double **)
35
a[k1][k2] = C[k1][k2], 0<=k1<8, 0<=k2<8
39
/* Cn_kR = sqrt(2.0/n) * cos(pi/2*k/n) */
40
/* Cn_kI = sqrt(2.0/n) * sin(pi/2*k/n) */
41
/* Wn_kR = cos(pi/2*k/n) */
42
/* Wn_kI = sin(pi/2*k/n) */
43
#define C8_1R 0.49039264020161522456
44
#define C8_1I 0.09754516100806413392
45
#define C8_2R 0.46193976625564337806
46
#define C8_2I 0.19134171618254488586
47
#define C8_3R 0.41573480615127261854
48
#define C8_3I 0.27778511650980111237
49
#define C8_4R 0.35355339059327376220
50
#define W8_4R 0.70710678118654752440
53
void ddct8x8s(int isgn, float **a)
56
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
60
for (j = 0; j <= 7; j++) {
61
x0r = a[0][j] + a[7][j];
62
x1r = a[0][j] - a[7][j];
63
x0i = a[2][j] + a[5][j];
64
x1i = a[2][j] - a[5][j];
65
x2r = a[4][j] + a[3][j];
66
x3r = a[4][j] - a[3][j];
67
x2i = a[6][j] + a[1][j];
68
x3i = a[6][j] - a[1][j];
71
a[0][j] = C8_4R * (xr + xi);
72
a[4][j] = C8_4R * (xr - xi);
75
a[2][j] = C8_2R * xr - C8_2I * xi;
76
a[6][j] = C8_2R * xi + C8_2I * xr;
77
xr = W8_4R * (x1i - x3i);
78
x1i = W8_4R * (x1i + x3i);
83
a[1][j] = C8_1R * x1r - C8_1I * x1i;
84
a[7][j] = C8_1R * x1i + C8_1I * x1r;
85
a[3][j] = C8_3R * x3r - C8_3I * x3i;
86
a[5][j] = C8_3R * x3i + C8_3I * x3r;
88
for (j = 0; j <= 7; j++) {
89
x0r = a[j][0] + a[j][7];
90
x1r = a[j][0] - a[j][7];
91
x0i = a[j][2] + a[j][5];
92
x1i = a[j][2] - a[j][5];
93
x2r = a[j][4] + a[j][3];
94
x3r = a[j][4] - a[j][3];
95
x2i = a[j][6] + a[j][1];
96
x3i = a[j][6] - a[j][1];
99
a[j][0] = C8_4R * (xr + xi);
100
a[j][4] = C8_4R * (xr - xi);
103
a[j][2] = C8_2R * xr - C8_2I * xi;
104
a[j][6] = C8_2R * xi + C8_2I * xr;
105
xr = W8_4R * (x1i - x3i);
106
x1i = W8_4R * (x1i + x3i);
111
a[j][1] = C8_1R * x1r - C8_1I * x1i;
112
a[j][7] = C8_1R * x1i + C8_1I * x1r;
113
a[j][3] = C8_3R * x3r - C8_3I * x3i;
114
a[j][5] = C8_3R * x3i + C8_3I * x3r;
117
for (j = 0; j <= 7; j++) {
118
x1r = C8_1R * a[1][j] + C8_1I * a[7][j];
119
x1i = C8_1R * a[7][j] - C8_1I * a[1][j];
120
x3r = C8_3R * a[3][j] + C8_3I * a[5][j];
121
x3i = C8_3R * a[5][j] - C8_3I * a[3][j];
126
x1i = W8_4R * (xr + xi);
127
x3r = W8_4R * (xr - xi);
128
xr = C8_2R * a[2][j] + C8_2I * a[6][j];
129
xi = C8_2R * a[6][j] - C8_2I * a[2][j];
130
x0r = C8_4R * (a[0][j] + a[4][j]);
131
x0i = C8_4R * (a[0][j] - a[4][j]);
145
for (j = 0; j <= 7; j++) {
146
x1r = C8_1R * a[j][1] + C8_1I * a[j][7];
147
x1i = C8_1R * a[j][7] - C8_1I * a[j][1];
148
x3r = C8_3R * a[j][3] + C8_3I * a[j][5];
149
x3i = C8_3R * a[j][5] - C8_3I * a[j][3];
154
x1i = W8_4R * (xr + xi);
155
x3r = W8_4R * (xr - xi);
156
xr = C8_2R * a[j][2] + C8_2I * a[j][6];
157
xi = C8_2R * a[j][6] - C8_2I * a[j][2];
158
x0r = C8_4R * (a[j][0] + a[j][4]);
159
x0i = C8_4R * (a[j][0] - a[j][4]);