2017-09-04 264 views
1

我有以下代码:fftwf_execute_dft_c2r写入输入缓冲器

auto in = std::array<std::complex<float>, 60>(); 
in[0] = 10000.0f; 
auto out = std::array<float, 100>(); 
auto plan = fftwf_plan_dft_c2r_2d(10, 10, reinterpret_cast<fftwf_complex*>(in.data()), out.data(), FFTW_ESTIMATE | FFTW_UNALIGNED); 
fftwf_execute_dft_c2r(plan, reinterpret_cast<fftwf_complex*>(in.data()), out.data()); 

当我运行它,我的in阵列被写入(具体地,第一列被设置为10000.0)。这是正常的吗?我可以避免编写in阵列吗?

+0

见[文档】(http://www.fftw.org/fftw3_doc/Planner-Flags.html),用于'FFTW_PRESERVE_INPUT' – Praetorian

+0

我明白了。没有'FFTW_PRESERVE_INPUT'二维C2R :( 可以不选你的答案,但因为它是一个评论,这也帮助我。 – racanu

+0

随意写你自己的答案,我懒得组成之一,这是为什么我留下了评论 – Praetorian

回答

2

documentation解释的,输入的数据将被使用c2r当变换

第二覆盖,逆变换(复数到实数)具有覆盖它的输入阵列的 副作用,默认情况下。这些 这两个不便应该对用户造成严重的问题,但它是重要的是要知道它们。

如上所述,c2r变换破坏了其输入数组,即使对于 不适当的转换。这可以预防的,如果必要的话,通过 包括标志FFTW_PRESERVE_INPUT,与不幸性能有所牺牲 。此标志目前还不支持 用于多维实数DFT(下一节)。

因此即使使用FFTW_PRESERVE_INPUT,在这种情况下也不起作用。从FFTW_PRESERVE_INPUT documentation

FFTW_PRESERVE_INPUT指定一个外的地方变换切不可 改变其输入数组。这是通常的默认值,除了c2rhc2r(即复数到实数)变换为其 FFTW_DESTROY_INPUT是默认的。在后一种情况下,通过 FFTW_PRESERVE_INPUT将尝试使用不破坏 输入,在性能恶化为代价的算法;多维 c2r变换,但是,没有输入保留算法是实现 和规划器将返回NULL如果请求之一。

因此,解决这个问题的简单方法就是在将输入数组传递给计划函数之前复制一个输入数组。

+0

是的,我得出了同样的结论。 – racanu