2011-12-18 4 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

는 입력의 예를 줘 함께, 당신은 단어를 이해 할 수없는 경우 여기에 코드입니다 예상 출력과 실제 출력을 비교합니다. 또한, 디버거에서 이것을 실행하여 무엇을 배웠습니까? –

+2

또한 DCT에 대한 많은 정의가 있습니다 (http://en.wikipedia.org/wiki/Discrete_cosine_transform#Formal_definition). 어느 쪽이 원하는거야? –

+1

코드에 좀 더 깊이 들어가야합니다. 단계별로 진행하지 않을 것입니다. 중간 결과가 정확합니까? 출력 값이 예상 한 값과 대략 동일합니까? –

답변

4

와 동일해야합니다 계산 된 IDCT 당신 ​​' 그 자리에서 IDCT를 계산하려고 시도하고, idctMatrix[][]을 입력과 출력으로 사용하므로 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

+0

당신이 내 대답을 완전히 무시한 것 같습니다. 적어도 표시된 문제를 수정하기위한 코드의 변경 사항을 보지 못했습니다. 잘 했어, 잘 지켜라. –

+0

나는 당신의 대답을 소홀히하지 않았다, 그것은 정확한 것 같지 않다. 나는 그것이 – user427641