//程式名稱:DCT.java
//程式功能:DCT 類別,含ForwardDCT與InverseDCT兩種方法class DCT
//執行範例:java embed
class DCT
{
static int N = 8;
public double C[][] = new double[N][N];
public double Ct[][] = new double[N][N];
DCT()
{
int i;
int j;
double pi = Math.atan( 1.0 ) * 4.0;
for ( j = 0 ; j < N ; j++ ) {
C[ 0 ][ j ] = 1.0 / Math.sqrt( (double) N );
Ct[ j ][ 0 ] = C[ 0 ][ j ];
}
for ( i = 1 ; i < N ; i++ ) {
for ( j = 0 ; j < N ; j++ ) {
C[ i ][ j ] = Math.sqrt( 2.0 / N ) *
Math.cos( pi * ( 2 * j + 1 ) * i / ( 2.0 * N ) );
Ct[ j ][ i ] = C[ i ][ j ];
}
}
}
void ForwardDCT(int input[][], int output[][] )
{
double temp[][] = new double[N][N];
double temp1;
int i, j, k;
for ( i = 0 ; i < N ; i++ ) {
for ( j = 0 ; j < N ; j++ ) {
temp[ i ][ j ] = 0.0;
for ( k = 0 ; k < N ; k++ )
temp[ i ][ j ] += ( (int) input[ i ][ k ] - 128 ) *
Ct[ k ][ j ];
}
}
for ( i = 0 ; i < N ; i++ ) {
for ( j = 0 ; j < N ; j++ ) {
temp1 = 0.0;
for ( k = 0 ; k < N ; k++ )
temp1 += C[ i ][ k ] * temp[ k ][ j ];
output[ i ][ j ] = (int) Math.round( temp1 );
}
}
}
void InverseDCT(int input[][],int output[][] )
{
double temp[][] = new double[N][N];
double temp1;
int i, j,k;
for ( i = 0 ; i < N ; i++ ) {
for ( j = 0 ; j < N ; j++ ) {
temp[ i ][ j ] = 0.0;
for ( k = 0 ; k < N ; k++ )
temp[ i ][ j ] += input[ i ][ k ] * C[ k ][ j ];
}
}
for ( i = 0 ; i < N ; i++ ) {
for ( j = 0 ; j < N ; j++ ) {
temp1 = 0.0;
for ( k = 0 ; k < N ; k++ )
temp1 += Ct[ i ][ k ] * temp[ k ][ j ];
temp1 += 128.0;
if ( temp1 < 0 )
output[ i ][ j ] = 0;
else if ( temp1 > 255 )
output[ i ][ j ] = 255;
else
output[ i ][ j ] = (int) Math.round( temp1 );
}
}
}
}