Re: [請益] 關於DCT與IDCT壓縮
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章