8x8(またはNXN)離散コサイン変換(DCT)/IDCT疑似コードを探しています[閉じた
質問
私はしばらくの間Googleを検索しており、適切に効率的に8x8(またはNXN)DCTアルゴリズムの擬似コードを見つけてきましたが、何も見つかりません。
私は素朴なアプローチを実装しましたが、実行するのに時間がかかりすぎました。
いくつかの擬似コードを投稿したり、良い本/文書/ウェブサイトを参照できる場合は、役立ちます。
CまたはC ++の例の方がいいでしょう!
解決
コメントで要求されているように、ソース(わずかに警告されてください、それはC#にありますが、C ++との違いは最小限であるはずです、そして、はい、私はコードが足りないことを知っています):
メインループ(a = result、b = input):
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 8; x++)
{
A[y * 8 + x] = 0;
for (int u = 0; u < 8; u++)
for (int v = 0; v < 8; v++)
A[y * 8 + x] += alpha(u) * alpha(v) * B[u, v] *
cosine[u, x] * cosine[v, y];
}
}
サポートのもの:
static double alpha(int i)
{
if (i == 0)
return SQRT2o2 * 0.5;
return 0.5;
}
const double SQRT2o2 = 1.414213562373095048801688724209 * 0.5;
cosine = new double[8, 8];
const double inv16 = 1.0 / 16.0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
cosine[j, i] = Math.Cos(Math.PI * j * (2.0 * i + 1) * inv16);
}
}
編集:私はそれをタイミングしました - 512 x 512ピクセル(シングルチャネル)の場合、0.5秒かかります。確かにそれは遅いですが、「永遠」に近いところはありません。
他のヒント
fftw オープンソース効率的な実装があります
所属していません StackOverflow