2017-09-04 261 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