列優先 (Fortran スタイル) 形式で格納されたデータの 2D 配列があり、各行の FFT を取得したいと考えています。配列の転置を避けたい (正方形ではない)。たとえば、私の配列
fftw_complex* data = new fftw_complex[21*256];
エントリが含まれています[r0_val0, r1_val0,..., r20_val0, r0_val1,...,r20_val255]
。
行優先の場合fftw_plan_many_dft
、配列内の 21 個の FFT のそれぞれをインプレースで解決する計画を立てるために使用できます。data
[r0_val0, r0_val1,..., r0_val255, r1_val0,...,r20_val255]
int main() {
int N = 256;
int howmany = 21;
fftw_complex* data = new fftw_complex[N*howmany];
fftw_plan p;
// this plan is OK
p = fftw_plan_many_dft(1,&N,howmany,data,NULL,1,N,data,NULL,1,N,FFTW_FORWARD,FFTW_MEASURE);
// do stuff...
return 0;
}
ドキュメント ( FFTW マニュアルのセクション 4.4.1 ) によると、関数のシグネチャは次のとおりです。
fftw_plan fftw_plan_many_dft(int rank, const int *n, int howmany,
fftw_complex *in, const int *inembed,
int istride, int idist,
fftw_complex *out, const int *onembed,
int ostride, int odist,
int sign, unsigned flags);
stride
パラメータとdist
パラメータを使用してインデックスを設定できるはずです。ドキュメントから理解できることから、変換される配列内のエントリはin + j*istride + k*idist
wherej=0..n-1
およびとしてインデックス付けされますk=0..howmany-1
。(私の配列は1Dでhowmany
、それらの配列があります)。ただし、次のコードはセグメントになります。障害 (編集:歩幅が間違っています。以下の更新を参照してください):
int main() {
int N = 256;
int howmany = 21;
fftw_complex* data = new fftw_complex[N*howmany];
fftw_plan p;
// this call results in a seg. fault.
p = fftw_plan_many_dft(1,&N,howmany,data,NULL,N,1,data,NULL,N,1,FFTW_FORWARD,FFTW_MEASURE);
return 0;
}
アップデート:
歩幅の選択を間違えました。正しいコールは次のとおりです (正しい歩幅はhowmany
であり、 ではありませんN
)。
int main() {
int N = 256;
int howmany = 21;
fftw_complex* data = new fftw_complex[N*howmany];
fftw_plan p;
// OK
p = fftw_plan_many_dft(1,&N,howmany,data,NULL,howmany,1,data,NULL,howmany,1,FFTW_FORWARD,FFTW_MEASURE);
// do stuff
return 0;
}