回答:
これは、従来のCPU、1つのコア、1つの単純なスレッド、派手なハードウェアなしで実行されると仮定します。それ以上のことが起こっている場合は、おそらく、より単純なシステムの理由を調整することで説明できます。議論するための特定のシステム、またはさまざまな可能性をカバーするための教科書または研究論文全体がなければ、これ以上言うことはできません。
2のべき乗のサイズについては心配しません。関係ありません。バタフライユニットと2だけでなく、3のファクターまたは任意の小さな数で存在するすべてのFFTアルゴリズム。素数サイズのデータシリーズにも賢いアルゴリズムがあります。Wikipediaの非永続的な性質のため、これを引用するのは好きではありませんが、とにかく:
素数Nであっても、すべてのNにO(N log N)の複雑さを持つFFTがあります
任意のNに対するFFTの実装は、GPL化されたライブラリFFTWにあります。
真面目なエンジニアリングの観点から信頼できる唯一の方法は、構築して測定することですが、変数間の関係を確認するために、理論からアイデアを得ることができます。各メソッドに含まれる算術演算の数の推定値が必要です。
長年にわたって差が大幅に縮小したとしても、乗算はほとんどのCPUでの加算よりも遅いため、乗算をカウントしてみましょう。加算のアカウンティングも、少し考えて、ものを追跡する必要があります。
コンボリューションカーネルを使用して実際に乗算と加算を行い、出力ピクセルごとに繰り返す単純なコンボリューションには、W²・K²の乗算が必要です。畳み込みカーネルの片側に沿ったピクセルとして。カーネルと入力画像の同じサイズの部分を使用して1つの出力ピクセルを計算するには、K²の乗算が必要です。入力画像と同じ番号のすべての出力ピクセルについて繰り返します。
(N マルチ)直接 =W²・K²
フーリエ空間でジョブを実行するには、画像をフーリエ変換する必要があります。これは、FFTを各列に個別に適用してから、各行に適用することによって行われます。N個のデータポイントのFFTは、約2N・log(N)回の乗算を行います。NをW(1列または1行の長さ)にする必要があります。ここのすべての対数は底2です。
W行とW列があるので、すべてのFFTが完了した後、2W・(2W・log(W))乗算を行いました。カーネルのフーリエ変換を掛けた後、賢明な画像に戻すためにデータを逆フーリエ変換する必要があるため、それを2倍にします。それは8W²・log(W)です。もちろん、カーネルのフーリエ変換による乗算、さらにW²乗算を行う必要があります。(出力ピクセルごと、行ごとなどではなく、一度だけ実行します。)これらは複雑な乗算なので、4W²の実際の乗算です。
だから、私が馬鹿げた(そしておそらく私がやった)限り、
(N mults)フーリエ =4W²・(2・log(W)+ 1)
いつ物事を直接的な方法で行いたいのですか?KがW²・K²を4W²・(2・log(W)+ 1)よりも小さくするのに十分小さい場合。W²の一般的な要因は簡単に除外されます。理想的な推定値を扱っているため、おそらく「+1」を削除できます。+1は、追加、ループオーバーヘッドなどをカウントしないため、実際の実装に関連するエラーで失われる可能性があります。それは去ります:
K² < 8·log(W)
これは、周波数空間アプローチよりも直接的なアプローチを選択するための近似条件です。
同じサイズの2つの画像の相関は、サイズK = Wのカーネルとの畳み込みに似ていることに注意してください。フーリエ空間が常にそれを行う方法です。
これは、オーバーヘッド、オペコードのパイプライン、浮動小数点と固定小数点を考慮して洗練され、議論され、GPGPUと特殊なハードウェアでウィンドウを捨てることができます。