[請益] 關於DCT與IDCT壓縮

看板Programming作者 (夢想家)時間18年前 (2007/04/07 00:21), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
我對照課本式子寫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
文章代碼(AID): #165dEDWT (Programming)
文章代碼(AID): #165dEDWT (Programming)