私は高速フーリエ変換(FFT)の初心者であり、C++などのプログラミング言語でどのように計算するかについてはあまり理解していません。これがFFT2Dの方法です
void FFT2D(Complex<double> *f, Complex<double> *F, int width, int height);
It takes an input image f of size width * height and output the transformed
coefficients into F.
ヒント:画像ピクセルは、3つの別々の画像カラー(R、G、B)平面として保存され、それぞれが複素数の1D配列で表されます。画像のサイズが幅W、高さがHであるとすると、画像位置(m、n)のピクセルの色成分値(R、G、B)はR [m + n * W]、G( m + n * W)およびB [m + n * W]。ここで、R、G、Bは複素数の3つの配列です。変換された係数の1D配列も、同じ方法で表されます。
1つのカラーコンポーネントのみの処理を実装する必要があり、プログラミングテンプレートは、実装された関数に基づいてR、G、Bを個別に処理します。テンプレートはまた、各入力画像のサイズが2m * 2nになるように、画像にゼロを埋め込みます。
If I called from another class, I have to pass R, G, B separately
Suppose:
Complex<double> *R = new Complex<double>[width * height];
Let, width = 4096 and height 4096
FFT2D(R, output F, width, height) for compute “R” color component;
FFT2D(G, output F, width, height) for compute “G” color component;
FFT2D(B, output F, width, height) for compute “B” color component;
We have template of calculated FFT1D function:
void FFT1D(Complex<double> *fx, Complex<double> *Fu, int twoK, int stride)
Hint: it outputs the frequency coefficients in the array Fu.
FFT1Dは、FFT2Dの関数の内部から呼び出しています。FFT2DのC、C ++、JavaおよびC#でいくつかの異なるタイプのコードを見つけました。それらのほとんどは、2D配列構造を使用して実装されています。行と列のループ内の2D配列構造に実数部と虚数部を割り当てます。しかし、私の場合は色成分の1D配列構造です。
いくつかのコードを実行してみましょう。これはFFT2D関数内にあります。
Complex<double> *outPutMap = new Complex<double>[width * height];
for (int i = 0; i < height; i++){
# for(int j = 0; j < width; j++){
# outPutMap[i + j * width] = f[i + j * width];
# I don’t understand how to implement in here for color component and how
# it assign a value for real and imaginary part
# }
}
以前は、FFTIDを呼び出す前に、本のようにtwoKの値を計算する必要がありました。M=2K
何かアイデアや参考資料があれば教えてください。
ありがとうございました
よろしくイチロー