关于DCT变换的问题:结果不正确
我使用以下公式实现DCT变换: 但结果是不正确的。对于8乘8矩阵关于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
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检查结果,看看是否得到原始值。