fftw
ライブラリでFFTプランを実行する際に問題があります。私はfftIn
とfftOut
のサイズ2048のベクトルを宣言し、fftwf_plan_dft_1d
を定義しています。FFTプラン実行後、FFTWの出力ベクトルサイズが正しくない
しかし、私が計画を実行すると、突然fftOut
ベクターがすべて間違ってしまいます。私のコードでは、デバッグ中にサイズが2048から0に変わるのを見ることができます。以下の小さな実行可能な例を書いたとき、17293858104588369909などの不正なサイズになります。
もちろん、ベクトルの最初の項目、SIGSEGV
が発生します。
マイコード:もちろん
#include <complex>
#include <iostream>
#include <fftw3.h>
#include <vector>
using namespace std;
typedef std::vector<std::complex<float>> fft_vector;
int main() {
const unsigned int VECTOR_SIZE = 2048;
fft_vector* fftIn = new fft_vector(VECTOR_SIZE);
fft_vector* fftOut = new fft_vector(VECTOR_SIZE);
fftwf_plan fftPlan = fftwf_plan_dft_1d(VECTOR_SIZE, reinterpret_cast<fftwf_complex*>(fftIn), reinterpret_cast<fftwf_complex*>(fftOut), FFTW_FORWARD, FFTW_ESTIMATE);
fftwf_execute(fftPlan);
std::cout << fftOut->size() << std::endl;
std::cout << fftOut->at(0).real() << fftOut->at(0).imag() << std::endl;
return 0;
}
、私はfftIn
ベクトルは、この例では空である知っているが、それはとにかくないときに出力が壊れています。この場合、前に説明したように、SIGSEGVは2番目のcoutで発生します。
私のフルコードにはスレッドがあります(ただし、FFTはすべて同じスレッド内で発生するため、競合条件は適用しないでください)、この小さな例でコードを分離しようとした理由の1つですそれはとにかく何かが間違っているようです。
それはうまくいくはずです:http://www.fftw.org/doc/Complex-numbers.html#Complex-numbersとにかく、古典的なコードをお勧めします。 –
@RomanRdgzはいそうです。主な問題は、ベクターの内容の代わりにベクターを渡していたことです。 fftwのタイプと割り当てを使用すると、fftwから必要な動作とパフォーマンスを得ることができます。また、そのリンクに "should"という単語があることにも注意してください。少なくとも、すべてのプラットフォームのすべてのコンパイラでは、C++のcomplex <>型が動作することは保証されていないかもしれません。 – Andrew
好奇心が強い:C++の複雑な<>で可能な場合、コードをどのように書き直すべきですか?動的なベクトルとしてfftInとfftOutを保持します。なぜなら、それらのサイズを構成可能にする必要があるからです。 一方、出力ベクトルの内容にアクセスする方法は私には分かりません。 (&fftOut [0])。x? –