2017-09-04 3 views
1

を書き込みます:fftwf_execute_dft_c2rは、私は次のコードを持っている入力バッファ

auto in = std::array<std::complex<float>, 60>(); 
in[0] = 10000.0f; 
auto out = std::array<float, 100>(); 
auto plan = fftwf_plan_dft_c2r_2d(10, 10, reinterpret_cast<fftwf_complex*>(in.data()), out.data(), FFTW_ESTIMATE | FFTW_UNALIGNED); 
fftwf_execute_dft_c2r(plan, reinterpret_cast<fftwf_complex*>(in.data()), out.data()); 

私はそれを実行すると、私のin配列が書き込まれます(具体的には、第1の列は10000.0に設定されています)。これは正常ですか? inアレイが書き込まれるのを避けることはできますか?

+0

「FFTW_PRESERVE_INPUT」の[documentation](http://www.fftw.org/fftw3_doc/Planner-Flags.html)を参照してください。 – Praetorian

+0

です。 – racanu

+0

あなた自身の答えを書くのは気軽に、私は1つを構成するのが面倒です。それは理由です。私はコメントを残した。 – Praetorian

答えて

2

としてはdocumentationで説明c2rを使用すると、デフォルトで、第二に、逆変換(実の複合体は)その入力アレイを上書き の副作用を有する

を変換したときに、入力データが上書きされます。これらのいずれも、ユーザに重大な問題を引き起こす虞れがありますが、そのことを知っておくことが重要です( )。

上記のように、c2rトランスフォームは、 アウトオブプレイス変換でも入力配列を破壊します。これは、必要に応じて、フラグにFFTW_PRESERVE_INPUTを含む を防ぐことができますが、残念なことに一部は のパフォーマンスを犠牲にしています。このフラグは現在、多次元実DFTのための もサポートされていません(次のセクション)。

FFTW_PRESERVE_INPUTを使用しても、この場合は機能しません。 FFTW_PRESERVE_INPUT documentation

FFTW_PRESERVE_INPUTからのアウトオブプレース変換が その入力配列を変更してはならないことを指定します。 c2rhc2r(つまり、複素数から実数への)変換の場合を除き、これは通常デフォルトです。 FFTW_DESTROY_INPUTがデフォルトです。後者の場合、 FFTW_PRESERVE_INPUTを渡すと、パフォーマンスが悪くても入力を破棄しないアルゴリズムを使用しようとします。多次元 c2rの変換では、入力保存アルゴリズムは であり、プランナは要求されていればNULLを返します。

したがって、これを解決する簡単な方法は、プラン関数に渡す前に入力配列のコピーを作成することです。

+0

うん、私は同じ結論に来た。 – racanu

関連する問題