[請益] 關於DCT與IDCT壓縮
我對照課本式子寫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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章