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

关于DCT变换的问题:结果不正确,c,dct,C,Dct,我使用以下公式实现DCT变换: 但结果是不正确的。对于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 2

我使用以下公式实现DCT变换:

但结果是不正确的。对于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  
(只有第1列具有非零值)

问题是我被告知正确的结果应该是矩阵左上角的非零值。我不确定我的代码中哪里有错误。有人能帮我吗?谢谢

这是我的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;
      }  
}
静态双C(int-val){
如果(val==0)
回报率1.0/sqrt(2.0);
其他的
返回1.0;
}
void-dct变换(int矩阵[8][8],双dct矩阵[8][8]){
int u,v,x,y;
双温;

对于(u=0;u您不应该首先将输入值从0..255更改为-128..127吗?您还没有在
矩阵[y][x]
中切换
x
y


如果我从输入值中减去128,使其以零为中心,然后切换x和y,您的代码至少会根据给出正确的值。

但它不会影响非零值的位置,对吗?是的。切换x和y,得到相同的结果。运行IDCT检查结果,看看是否得到原始值。