【发布时间】:2017-03-23 04:54:38
【问题描述】:
我正在尝试使用 FFTW 进行实值二维傅里叶变换。我的数据存储在一个动态大小的特征矩阵中。这是我写的包装类:
FFT2D.h:
#include <Eigen>
class FFT2D {
public:
enum FFT_TYPE {FORWARD=0, REVERSE=1};
FFT2D(EMatrix &input, EMatrix &output, FFT_TYPE type_ = FORWARD);
~FFT2D();
void execute();
private:
EMatrix& input;
EMatrix& output;
fftw_plan plan;
FFT_TYPE type;
};
FFT2D.cpp:
#include "FFT2D.h"
#include <fftw3.h>
#include "Defs.h"
FFT2D::FFT2D(EMatrix &input_, EMatrix &output_, FFT_TYPE type_)
: type(type_), input(input_), output(output_) {
if (type == FORWARD)
plan = fftw_plan_dft_2d((int) input.rows(), (int) input.cols(),
(fftw_complex *) &input(0), (fftw_complex *) &output(0),
FFTW_FORWARD, FFTW_ESTIMATE);
else
// placeholder for ifft-2d code, unwritten
}
FFT2D::~FFT2D() {
fftw_destroy_plan(plan);
}
void FFT2D::execute() {
fftw_execute(plan); // seg-fault here
}
还有EMatrix的定义:
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> EMatrix;
问题是,我在FFT2D::execute() 中遇到了段错误。我知道我在构造函数中设置了错误,并且我尝试了许多不同的方法,但我似乎无法在这方面取得任何进展。
我尝试过的事情包括:将 EMatrix typedef 更改为 Eigen::ColMajor,将 (fftw_complex *) input.data() 传递给 fftw_plan_dft_2d,使用不同的 fftw 计划 (fftw_plan_dft_r2c_2d)。
我的 C++ (显然)生锈了,但归根结底,我需要在一个实值 2D 双精度特征矩阵上做一个 2D FT。提前致谢。
【问题讨论】: