// 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 トップページ