Re: [請益] 關於DCT與IDCT壓縮

看板Programming作者 (維克多的玫瑰)時間18年前 (2007/04/07 21:34), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #165vt8mJ (Programming)
討論串 (同標題文章)
文章代碼(AID): #165vt8mJ (Programming)