作者lkcheng (维克多的玫瑰)
看板Programming
标题Re: [请益] 关於DCT与IDCT压缩
时间Sat Apr 7 21:33:59 2007
※ 引述《dreamerStar (梦想家)》之铭言:
: 我对照课本式子写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);
换成
B[k1, k2] += A[i, j] * Math.Cos((double)(j*2+1)*k1/16) *
Math.Cos((double)(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: 221.169.248.200