4

かなり効率的な 8x8 (または nxn) DCT アルゴリズムの疑似コードを見つけるために、しばらくの間 Google を検索してきましたが、何も見つかりません!

私は単純なアプローチを実装しましたが、実行に時間がかかりすぎました。

疑似コードを投稿したり、優れた書籍/ドキュメント/Web サイトを参照したりできる場合は、それが役に立ちます。

C または C++ の例はさらに良いでしょう!

4

2 に答える 2

4

コメントで要求されているように、ソース (少し注意してください。C# にありますが、C++ との違いは最小限である必要があります。はい、コードが不十分であることはわかっています):

メインループ (A = 結果、B = 入力):

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 秒かかります。確かにそれは遅いですが、「永遠」にはほど遠いです。

于 2011-12-02T23:39:44.237 に答える
1

FFTWにはオープンソースの効率的な実装があります

于 2011-12-02T23:03:22.583 に答える