fftwf_execute_dft_c2r写入输入缓冲区

时间:2017-09-04 15:43:21

标签: c++ fftw

我有以下代码:

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数组吗?

1 个答案:

答案 0 :(得分:2)

正如documentation中所述,使用c2r转换时输入数据将被覆盖

  

其次,逆变换(复数到实数)具有副作用   默认情况下,覆盖其输入数组。这些都不是   不便之处应该给用户带来严重的问题,但确实如此   重要的是要了解它们。

     

如上所述,FFTW_PRESERVE_INPUT变换甚至会破坏其输入数组   不合适的变换。如有必要,可以通过以下方式防止这种情况   不幸的是,在旗帜中包括FFTW_PRESERVE_INPUT   牺牲表现。目前还不支持此标志   用于多维真实DFT(下一节)。

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

  

c2r指定不能进行异地转换   更改其输入数组。这通常是默认值,hc2r除外   和FFTW_DESTROY_INPUT(即复数到实数)变换   FFTW_PRESERVE_INPUT是默认值。在后一种情况下,通过   c2r将尝试使用不会破坏的算法   输入,代价是性能较差;用于多维   但是,NULL转换没有输入保留算法   如果有人请求,计划员将返回function SearchByColor { param ([string]$color) $result = for ($i = 0; $i -lt $resultbox.TextLength; $i++) { $resultbox.Select($i, 1) if ($resultbox.SelectionColor.Name -eq $color) { $resultbox.SelectedText } } $result -join '' }

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