【发布时间】:2016-11-29 14:32:16
【问题描述】:
我在使用 fftw 库执行 FFT 计划时遇到问题。我声明fftIn 和fftOut 大小为2048 的向量,并用它们定义fftwf_plan_dft_1d。
但是当我执行计划时,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 发生在第二个 cout 中,如前所述。
我的完整代码有线程(但 FFT 都发生在同一个线程中,因此不应该应用竞争条件),这就是在这个小示例中尝试隔离代码的原因之一,以防万一,但它反正好像有什么问题。
有什么想法吗?
【问题讨论】: