2011-12-18 39 views
0

我已經設法計算了一個8 * 8矩陣的dct,並且我在做反轉時遇到了困難。任何人都可以看看這段代碼,並告訴我我現在在做什麼。我應該得到與以前完全相同的值,但即時獲得不同的值。我正在讀取來自csv文件的輸入,並將其輸出到另一個csv文件。它在C編程試圖實現一個dct 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 

計算應該是一樣的原始

+3

請給一個輸入的一個例子,它失敗上,沿預期產出,以及實際產出。另外,通過在調試器中運行它你學到了什麼? – 2011-12-18 18:18:22

+2

此外,還有許多DCT的定義(http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition)。你想要哪一個? – 2011-12-18 18:22:44

+1

你應該深入一些代碼。我們不會一步一步地完成它。中間結果是否正確?輸出值是否大約等於您所期望的值? – 2011-12-18 18:30:42

回答

4

的IDCT你」重新嘗試計算IDCT就地,使用idctMatrix[][]作爲輸入和輸出,因此th e輸入正在修改過程中。這是錯誤的。您需要有一個單獨的2維數組用於輸入(或輸出)。

看來u和v依賴的縮放因子CuCv被應用在u-和v-環之外。這也是錯誤的。

編輯:下面的代碼,如果你不明白的話:

#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

道歉alex我錯過了我的代碼中的一行,它需要inMatrix [8] [8],輸出矩陣是idctMatrix [ 8] [8],無論如何感謝您的幫助 – user427641 2011-12-18 19:48:28

+0

看來您已經完全忽略了我的答案,至少我沒有看到代碼中的任何修改來修復指出的問題。幹得好,繼續保持下去。 – 2011-12-20 09:03:16

+0

我沒有忽略你的答案,它似乎不正確。我認爲這是 – user427641 2011-12-20 12:10:02