2011-12-02 7 views
2

これまでかなり効率的な8x8(またはnxn)DCTアルゴリズムの疑似コードを見つけるためにGoogleを検索していました。何も見つかりません!8x8(またはnxn)離散コサイン変換(DCT)/ IDCT疑似コードを探しています

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

擬似コードを投稿したり、良い本/ドキュメント/ウェブサイトを参照できる場合は、参考になります。

CまたはC++の例はまだ良いでしょう。コメントで要求されたよう

+0

これは奇妙なことですが、非常に素朴なアプローチがここではかなり速く実行されます。 – harold

+0

私は3チャンネルの512x512画像を処理していましたが、これをオフにするまで数分かかることがありました。おそらく私はそれを間違って実装したか、何とかして無限ループに陥ってしまいました。もう一度試してみましょう。 – user904963

+0

もちろん私はコサインテーブルをあらかじめ計算していましたが、それ以外は定義が示唆しているのとまったく同じようにするという単純なアプローチでした。しかし、それらのコサインでさえ、それは長くかかるべきではありません。 – harold

答えて

1

があります。

メインループ(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×512ピクセル(シングルチャンネル)の場合、半分かかります。確かにそれは遅いですが、どこにも "永遠に"はありません。

+0

はい、ありがとうございます。私は超パフォーマンスを探しているわけではありません。 – user904963

+0

@ user904963あなたはそれをiDCTに変えるために必要な変更を知っていますか?私もそれを投稿することができます。 – harold

+0

ええ、それは働いているようです。 – user904963

1

FFTWは(わずか警告され、それはC#でだが、C++との違いは最小限であるべきであり、そう私はコードがラメ知っている)、ソースをオープンソース効率的な実装

関連する問題