私は8 * 8行列のdctを計算することができました。誰でもこのコードを見て、私が今何をしているか教えてください。私は以前とまったく同じ値を得ているはずですが、異なる値を取っています。私はcsvファイルから入力を読み込み、それを別のcsvファイルに書き出しています。そのCdct 8 * 8行列の逆行列を実装しようとしています
void idct_func(float inMatrix[8][8]){
double idct,
Cu,
sum,
Cv;
int i,
j,
u,
v;
float idctMatrix[8][8],
greyLevel;
FILE * fp = fopen("mydata.csv", "r");
FILE * wp = fopen("idct.csv", "w");
fprintf(fp, "\n Inverse DCT");
for (i = 0; i < 8; ++i) {
for (j = 0; j < 8; ++j) {
sum = 0.0;
for (u = 0; u < 8; u++) {
for (v = 0; v < 8; v++) {
if (u == 0)
Cu = 1.0/sqrt(2.0);
else
Cu = 1.0;
if (v == 0)
Cv = 1.0/sqrt(2.0);
else
Cv = (1.0);
// Level around 0
greyLevel = idctMatrix[u][v];
idct = (greyLevel * cos((2 * i + 1) * u * M_PI/16.0) *
cos((2 * j + 1) * v * M_PI/16.0));
sum += idct;
}
}
idctMatrix[i][j] = 0.25 * Cu * Cv * sum;
fprintf(wp, "\n %f", idctMatrix[i][j]);
}
fprintf(wp, "\n");
}
にプログラムされ、元の行列は次のとおりです。
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255}};
DCTは次のとおりです。
2040 0 -0 0 0 0 -0 -0
0 0 0 0 -0 0 -0 0
-0 0 -0 0 0 0 0 0
0 -0 -0 -0 0 -0 -0 0
0 0 -0 0 -0 -0 -0 0
0 -0 -0 -0 -0 0 -0 -0
-0 -0 -0 0 0 0 0 -0
-0 0 0 0 -0 0 -0 0
計算IDCTは、元
に沿って、それが失敗したことを入力の例を教えてください期待される出力と実際の出力とを比較する。また、デバッガでこれを実行することで何を学んだのですか? –
また、DCTの多くの定義があります(http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition)。あなたはどれが欲しいですか? –
コードの内容をさらに深く理解する必要があります。我々は段階的にそれを通過しません。中間結果は正しいですか?出力値はあなたが期待している値とほぼ同じですか? –