作者dreamerStar (梦想家)
看板Programming
标题[请益] 关於DCT与IDCT压缩
时间Sat Apr 7 00:21:32 2007
我对照课本式子写DCT(Discrete Cosine Transform)编码
与IDCT(inverse Discrete Cosine Transform)解码
没有用任何快速演算法
trace过几个例子, DCT编码都没错
可是IDCT解码出来都差的很夸张 不知道到底是哪里搞错
以下是我的DCT与IDCT
拜托有经验的大哥可以指点一下~ 我卡在这两天了......
// Perform the DCT on the A block
public double[,] calculateDCT(sbyte[,] A)
{
int k1, k2, i, j;
double Cu, Cv;
double[,] B = new double[8, 8];
for (k1 = 0; k1 < 8; k1++)
for (k2 = 0; k2 < 8; k2++)
{
B[k1, k2] = 0.0;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
B[k1, k2] += A[i, j] * Math.Cos((i*2+1)*k1/16) *
Math.Cos((j*2+1)*k2/16);
if (k1 == 0)
Cu = Math.Sqrt(2.0) / 2.0 ;
else
Cu = 1.0;
if (k2 == 0)
Cv = Math.Sqrt(2.0) / 2.0 ;
else
Cv = 1.0;
B[k1, k2] *= (0.25 * Cu * Cv);
}
return B; // Return Frequency Component matrix
}
//======================================================
// Perform the inverse DCT on the A block
public double[,] calculateIDCT(sbyte[,] A)
{
int k1, k2, i, j;
double Cu, Cv;
double[,] B = new double[8, 8];
for (k1 = 0; k1 < 8; k1++)
{
for (k2 = 0; k2 < 8; k2++)
{
if (k1 == 0)
Cu = Math.Sqrt(2.0) / 2.0;
else
Cu = 1.0;
if (k2 == 0)
Cv = Math.Sqrt(2.0) / 2.0;
else
Cv = 1.0;
B[k1, k2] = 0.0;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
B[k1, k2] += (Cu * Cv * A[i, j] *
Math.Cos(((2*i+1)*k1*Math.PI)/16) *
Math.Cos(((2*j+1)*k2*Math.PI)/16) );
B[k1, k2] *= 0.25;
}
}
return B; // Return Frequency Component matrix
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.25.100