关于DCT转换的问题:结果不正确

时间:2014-11-29 18:34:24

标签: c dct

我正在使用以下公式实现DCT变换: enter image description here

但结果不正确。对于一些8乘8的矩阵,

 0  0  0  0  0  0  0  0 
 210  210  210  210  210  210  210  210 
 255  255  255  255  255  255  255  255 
 210  210  210  210  210  210  210  210 
 0  0  0  0  0  0  0  0 
 210  210  210  210  210  210  210  210 
 255  255  255  255  255  255  255  255 
 210  210  210  210  210  210  210  210

将数据传递给dct转换函数后得到的结果是:

1350.000000    0.000000    -0.000000    0.000000    0.000000    0.000000    -0.000000    -0.000000  
  -250.897627    -0.000000    0.000000    -0.000000    -0.000000    -0.000000    0.000000    0.000000  
  -0.000000    0.000000    0.000000    -0.000000    0.000000    -0.000000    0.000000    -0.000000  
  -461.931139    -0.000000    0.000000    -0.000000    -0.000000    -0.000000    0.000000    0.000000  
  -510.000000    0.000000    0.000000    -0.000000    -0.000000    -0.000000    0.000000    0.000000  
  156.770200    0.000000    -0.000000    0.000000    0.000000    0.000000    -0.000000    -0.000000  
  -0.000000    -0.000000    -0.000000    -0.000000    -0.000000    0.000000    0.000000    -0.000000  
  -260.946562    -0.000000    0.000000    -0.000000    -0.000000    -0.000000    0.000000    0.000000  

(只有第一列具有非零值)

问题在于我被告知正确的结果应该只是矩阵左上角的非零值。而且我不确定我的代码中哪里出错了。谁能帮我?感谢。

这是我的DCT代码:

static double C(int val){
   if(val == 0)
    return 1.0 / sqrt(2.0);
   else
    return 1.0;
}

void dctTransform(int matrix[8][8], double dctMatrix[8][8]){
    int u, v, x, y;
    double temp; 

    for(u=0; u<8; u++)
      for(v=0; v<8; v++){

         temp = 0;
         dctMatrix[u][v] = 0;

         for(x=0;x<8;x++){
           for(y=0;y<8;y++){
             temp += matrix[y][x]*cos(((2*x+1)*u*M_PI) / 16)*cos(((2*y+1)*v*M_PI) / 16);
            }
         }
         dctMatrix[u][v] = C(u) * C(v) * 0.25 * temp;
      }  
}

1 个答案:

答案 0 :(得分:1)

您是不是应该先将输入值从0..255更改为-128..127?您是否还在x中切换了ymatrix[y][x]

如果我从输入值中减去128以使它们居中于零,然后切换x和y,则代码至少会根据the example in Wikipedia给出正确的值。