Matrix FFTW R2C二维尺寸参数

Matrix FFTW R2C二维尺寸参数,matrix,size,fftw,Matrix,Size,Fftw,我无法获取fftwf\u plan\u dft\u r2c\u 2d的尺寸参数 输入:N行乘以M列矩阵 输出:按楼层排列的N行(M/2)+1列矩阵 参数是输入还是输出大小 试图给出输入大小。这就是GDB所说的 Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 1676.0x768] 0x637eed72 in n1fv_8 () from C:\devfiles\bin\libfftw3f-3.

我无法获取fftwf\u plan\u dft\u r2c\u 2d的尺寸参数

  • 输入:N行乘以M列矩阵
  • 输出:按楼层排列的N行(M/2)+1列矩阵
参数是输入还是输出大小

试图给出输入大小。这就是GDB所说的

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);
原因西格塞夫

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
    );
}
plan=FFT::PlanFloat_2dR2C::PlanFloat_2dR2C(草药::矩阵存储和缓冲区)
,草药::基质储存和缓冲液(输出)
{
平面图=fftwf\U平面图\U dft\U r2c\U 2d
(
缓冲区_in.nRowsGet()
,缓冲区_in.nColsGet()
,缓冲区_in.rowGet(0)
,(fftwf_complex*)缓冲区_out.rowGet(0)
,FFTW_度量
);
}
编辑:

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

删除了一个在gcc-4.7/i386中失败的古老堆栈对齐黑客。添加了Windows/i386上gcc所需的堆栈对齐技术。我们将在十年内对此表示遗憾(见之前的更改)

编辑2:


由于为配置脚本提供了错误的选项,dll已损坏。文档现已更新。

您是正确的。对于NxM浮点或双输入,应分配Nx(M/2+1)fftwf_复数或fftw_复数输出

参数是输入大小。比如说,

#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);
}

请参阅FFTW用户手册第4.3章基本界面,您是正确的。对于NxM浮点或双输入,应分配Nx(M/2+1)fftwf_复数或fftw_复数输出

参数是输入大小。比如说,

#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);
}

请参阅FFTW用户手册第4.3章“基本界面”

您能否澄清您不了解的内容-看起来您已经具备了就地2D R2C FFT的正确尺寸?输出和输入阵列中的元素数量不同。那么哪个应该传递给函数呢?它目前假设它是输出尺寸,好的-我理解你现在的要求-所需的尺寸参数是输入尺寸(nx M),例如,FFT的逻辑尺寸。您能否澄清您不了解的是什么?看起来您已经具备了就地2D R2C FFT的正确尺寸?输出和输入阵列中的元素数量不同。那么哪个应该传递给函数呢?目前,假设它是输出sizeOh,好的-我理解您现在的要求-所需的大小参数是输入维度(nx M),即FFT的逻辑维度。