FFTW R2C二维尺寸参数

时间:2013-12-11 15:53:06

标签: matrix size fftw

我无法获得fftwf_plan_dft_r2c_2d的大小参数

  • 输入:M行矩阵
  • 的N行
  • 输出:N行逐层(M / 2)+ 1 cols矩阵?

参数输入或输出大小?

试图给出输入大小。这就是GDB sais

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1676.0x768]
0x637eed72 in n1fv_8 () from C:\devfiles\bin\libfftw3f-3.dll
(gdb) backtrace
#0  0x637eed72 in n1fv_8 () from C:\devfiles\bin\libfftw3f-3.dll
#1  0x7c91a000 in ntdll!RtlpUnWaitCriticalSection ()
   from C:\WINDOWS\system32\ntdll.dll

当时没有其他线程使用fftw。

背景信息:

Herbs::MatrixStorage<float> spectrum_in(frame_a.nRowsGet(),frame_a.nColsGet());
Herbs::MatrixStorage<std::complex<float>> 
    spectrum_out(frame_a.nRowsGet(),frame_a.nColsGet()/2+1);

检查MatrixStorage类中可能的alllocation错误导致的堆损坏。矩阵中的行是一个大块。 rowGet返回指向给定行的指针。

memset(spectrum_in.rowGet(0),0
    ,sizeof(float)*spectrum_in.nRowsGet()*spectrum_in.nColsGet());
memset(spectrum_out.rowGet(0),0
    ,sizeof(float)*spectrum_out.nRowsGet()*spectrum_out.nColsGet());
heapdump(); //Heap seams to be fine after these

导致sigsevg

FFT::PlanFloat_2dR2C plan(spectrum_in,spectrum_out);

计划构造函数执行以下操作

plan=FFT::PlanFloat_2dR2C::PlanFloat_2dR2C(Herbs::MatrixStorage<InputType>& buffer_in
,Herbs::MatrixStorage<OutputType>& buffer_out)
{
plan=fftwf_plan_dft_r2c_2d
    (
     buffer_in.nRowsGet()
    ,buffer_in.nColsGet()
    ,buffer_in.rowGet(0)
    ,(fftwf_complex*)buffer_out.rowGet(0)
    ,FFTW_MEASURE
    );
}

编辑:

我使用了预编译的DLL。 GCC可能会在32位Windows上生成错误代码(来自发行说明):

  

删除了使用gcc-4.7 / i386失败的古老堆栈对齐黑客。在Windows / i386上添加了gcc所需的堆栈对齐黑客。我们将在十年内对此感到遗憾(见上一次的变化)。

编辑2:

由于给配置脚本提供了错误的选项,dll变得很糟糕。文档现已更新。

1 个答案:

答案 0 :(得分:1)

你是对的。对于NxM浮点或双输入,您应该分配Nx(M / 2 + 1)fftwf_complex或fftw_complex输出。

参数是输入大小。例如,

#include "fftw3.h"

#define Width 1024
#define Height 768

int main(){
        float input[Width*Height];
        fftwf_complex *fft = new fftwf_complex[((Width/2)+1)*Height];
        fftwf_plan fplan = fftwf_plan_dft_r2c_2d(Height, Width,
                                 (float*)input, fft, FFTW_ESTIMATE);
        fftwf_execute(fplan);
        fftwf_destroy_plan(fplan);
}

参见章节4.3 FFTW用户手册的基本界面