各次元のサンプルのインデックスは、-n / 2 ... 0 ... n / 2 -1である必要があるため、次元が奇数の場合は、中央を中心にします。次元が偶数の場合は、新しい0の前に新しい0の後よりも1つのサンプルが多くなるように中央に配置します。
例:幅/高さが8の場合は-4、-3、-2、-1、0、1、2、3、幅/高さがの場合は-3、-2、-1、0、1、2、3 7。
FFTは中央を基準にしており、そのスケールには負の点があります。
メモリ内のポイントは0...n-1ですが、FFTはそれらを-ceil(n / 2)... floor(n / 2)として扱います。ここで、0は-ceil(n / 2)およびn-です。 1はフロア(n / 2)
単位行列は、0,0の位置に1があるゼロの行列です(中央-上記の番号付けによる)。(空間領域で。)
周波数領域では、単位行列は定数である必要があります(すべての実数値1または1 /(N * M)およびすべての虚数値0)。
この結果が得られない場合は、識別マトリックスのパディングが異なる場合があります(すべての辺ではなく、左と下)。これはFFTの実装によって異なる場合があります。
各ディメンションを個別に中央揃えします(これはインデックスの中央揃えであり、実際のメモリに変更はありません)。
おそらく、画像を(中央揃え後に)各次元で2の累乗にパディングする必要があります(2 ^ n * 2 ^ m、nはmと等しくなくてもかまいません)。
ソース画像と宛先画像の両方で中心ベースのインデックスを使用して、既存のピクセルを新しい大きな画像にコピーすることにより、FFTの0,0の位置(角ではなく中心)を基準にしてパディングします(例:(0,0)から(0,0)) 、(0,1)から(0,1)、(1、-2)から(1、-2))
FFTが複雑なセルではなく通常の浮動小数点セルを使用すると仮定すると、2の累乗が必要ない場合でも、複雑な画像のサイズは2 * ceil(2 / n)* 2 * ceil(2 / m)である必要があります。 (サンプルが半分あるためですが、サンプルは複雑です)。
画像に複数のカラーチャネルがある場合は、最初に画像の形状を変更して、チャネルがサブピクセルの順序で最も重要ではなく、最も重要になるようにする必要があります。時間とスペースを節約するために、一度に形を変えてパッドを入れることができます。
IFFTの後のFFTSHIFTを忘れないでください。(象限を交換します。)
IFFTの結果は0...n-1です。ピクセルfloor(n / 2)+1..n-1を取得し、0 ... floor(n / 2)の前に移動する必要があります。
これは、ピクセルを新しいイメージにコピーし、floor(n / 2)+1をメモリ位置0にコピーし、floor(n / 2)+2をメモリ位置1にコピーし、...、n-1をメモリ位置にコピーすることによって行われます。 location floor(n / 2)、次に0からmemory-location ceil(n / 2)、1からmemory-location ceil(n / 2)+1、...、floor(n / 2)からmemory-location n -1。
周波数領域で乗算する場合、サンプルは複雑であるため(1セルは実数、次に1セルは虚数)、複雑な乗算を使用する必要があることに注意してください。
結果は、N ^ 2 * M ^ 2で除算する必要がある場合があります。ここで、Nはパディング後のnのサイズです(Mとmの場合も同様です)。-これは、(a。単位行列の周波数領域の値を確認するb。結果を入力と比較する)ことでわかります。