我无法获得fftwf_plan_dft_r2c_2d的大小参数
参数输入或输出大小?
试图给出输入大小。这就是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变得很糟糕。文档现已更新。
答案 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用户手册的基本界面