// dct.v 画像のブロック分割離散コサイン変換

#define BOXSIZE 8   // 1つのブロックの大きさの設定

module DCT(in:input,out:output)
int in on box[BOXSIZE][BOXSIZE];
int out on box[BOXSIZE][BOXSIZE];
{
    parallel{
	int x,y,u,v;
	float sum[BOXSIZE];
	float c_u,c_v;
	float cos_table[BOXSIZE][BOXSIZE];
	float n_ber=1.,n2_ber=1.;

	// 除算に使う数値の逆数を先行して計算
	n_ber /= BOXSIZE;
	n2_ber /= (2.*BOXSIZE);
	
	// サイン、コサインの値をテーブル化
	for(x=0; x < BOXSIZE; x++){
	    for(y=0; y < BOXSIZE; y++){
		cos_table[x][y] = cos((float)((2.*x+1.)*y*M_PI)*n2_ber);
	    }
	}
	
	// 入力画像をブロックごとに離散コサイン変換
	for(v=0; v < BOXSIZE; v++){
	    sum[v] = 0;
	    for(x=0; x < BOXSIZE; x++){
		for(y=0; y < BOXSIZE; y++){
		    sum[v] += (float)(in[x][y])*cos_table[y][v];
		}
	    }
	}
	for(u=0; u < BOXSIZE; u++){
	    for(v=0; v < BOXSIZE; v++){
		for(x=0; x < BOXSIZE; x++){
		    sum[v] *= cos_table[x][u];
		}
		if(u == 0) c_u = 1./sqrt(2.);
		else c_u = 1.;
		if(v == 0) c_v = 1./sqrt(2.);
		else c_v = 1.;
		out[u][v] = ((2.*c_u*c_v)*n_ber) * sum[v];
	    }
	}
    }
}
DCTメインフローへ戻る

VIOS トップページ