2011-12-18 6 views
0

私は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は、元

+3

に沿って、それが失敗したことを入力の例を教えてください期待される出力と実際の出力とを比較する。また、デバッガでこれを実行することで何を学んだのですか? –

+2

また、DCTの多くの定義があります(http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition)。あなたはどれが欲しいですか? –

+1

コードの内容をさらに深く理解する必要があります。我々は段階的にそれを通過しません。中間結果は正しいですか?出力値はあなたが期待している値とほぼ同じですか? –

答えて

4

あなた」と同じでなければなりません入力と出力の両方としてidctMatrix[][]を使用して、インプレースでIDCTを計算しようとします。 e入力がプロセスで変更されています。それは間違っている。入力(または出力)用に別の2次元配列が必要です。

また、uおよびv依存のスケーリング係数CuおよびCvは、uループおよびvループの外側に適用されているようです。それも間違っているでしょう。

EDIT:あなたは言葉を理解できない場合はここでコードは次のとおりです。

#include <stdio.h> 
#include <math.h> 

#ifndef M_PI 
#define M_PI 3.14159265358979324 
#endif 

void Compute8x8Dct(const double in[8][8], double out[8][8]) 
{ 
    int i, j, u, v; 
    double s; 

    for (i = 0; i < 8; i++) 
    for (j = 0; j < 8; j++) 
    { 
     s = 0; 

     for (u = 0; u < 8; u++) 
     for (v = 0; v < 8; v++) 
      s += in[u][v] * cos((2 * u + 1) * i * M_PI/16) * 
          cos((2 * v + 1) * j * M_PI/16) * 
       ((i == 0) ? 1/sqrt(2) : 1) * 
       ((j == 0) ? 1/sqrt(2) : 1); 

     out[i][j] = s/4; 
    } 
} 

void Compute8x8Idct(const double in[8][8], double out[8][8]) 
{ 
    int i, j, u, v; 
    double s; 

    for (i = 0; i < 8; i++) 
    for (j = 0; j < 8; j++) 
    { 
     s = 0; 

     for (u = 0; u < 8; u++) 
     for (v = 0; v < 8; v++) 
      s += in[u][v] * cos((2 * i + 1) * u * M_PI/16) * 
          cos((2 * j + 1) * v * M_PI/16) * 
       ((u == 0) ? 1/sqrt(2) : 1.) * 
       ((v == 0) ? 1/sqrt(2) : 1.); 

     out[i][j] = s/4; 
    } 
} 

void Print8x8(const char* title, const double in[8][8]) 
{ 
    int i, j; 

    printf("%s\n", title); 

    for (i = 0; i < 8; i++) 
    { 
    for (j = 0; j < 8; j++) 
     printf("%8.3f ", in[i][j]); 
    printf("\n"); 
    } 
} 

int main(void) 
{ 
    double pic1[8][8], dct[8][8], pic2[8][8]; 
    int i, j; 

    for (i = 0; i < 8; i++) 
    for (j = 0; j < 8; j++) 
#if 01 
     pic1[i][j] = 255; 
#else 
     pic1[i][j] = (i^j) & 1; 
#endif 
    Print8x8("pic1:", pic1); 
    Compute8x8Dct(pic1, dct); 
    Print8x8("dct:", dct); 
    Compute8x8Idct(dct, pic2); 
    Print8x8("pic2:", pic2); 

    return 0; 
} 

は、ここでその出力です:

pic1: 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
dct: 
2040.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
    0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
pic2: 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000 
+0

お詫び申し訳ありません私のコードでは1行が欠落しています。これはinMatrix [8] [8]を取り、出力行列はidctMatrix [とにかく助けてくれてありがとうございます。 – user427641

+0

あなたは私の答えを完全に無視してしまったようですが、少なくとも私が指摘された問題を修正するためのコードの変更は見られません。良い仕事、それを維持する。 –

+0

私はあなたの答えを無視していない、それは正しいと思わない。私はそれがだと思った – user427641

関連する問題