2016-03-22 37 views
0

我即將在我的某個任務中使用fftw3庫。fftw3庫和計劃重用

我有一個重載荷分組具有可變幀大小,這是產生這樣的流:

while(thereIsStillData){ 
    copyDataToInputArray(); 
    createFFTWPlan(); 
    performExecution(); 
    destroyPlan(); 
} 

自創建之初的計劃是相當昂貴的,我想修改我的代碼是這樣的:

while(thereIsStillData){ 
    if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan(); 
    copyDataToInputArray(); // e.g. `memcpy` or `std::copy`; 
    performExecution(); 
} 

我可以這樣做嗎?我的意思是,計劃是否包含一些基於數據的重要信息,如爲一個大小爲N的陣列創建的計劃在執行時會給出相同大小的其他陣列N的錯誤結果。

回答

1

fftw_execute()函數不會修改呈現給它的計劃,並且可以使用相同的計劃多次調用該函數。但是,請注意,該計劃包含指向輸入和輸出數組的指針,因此如果copyDataToInputArray()涉及創建不同的輸入(或輸出)數組,則不能使用fftw_execute()中的舊計劃來轉換新數據。

然而,FFTW確實有一套「New-array Execute Functions」,假設新的陣列相對於舊的滿足一些額外的相似性標準(請參閱鏈接的文檔以瞭解詳細信息)。

該文檔也建議:

如果您想使用新的陣列,因爲要變換大小相同的陣列的已知一堆執行接口,你應該去使用先進的接口而不是

但這就是說轉換多個數組,這些數組都是同時在內存中,並以規則的方式排列。

注意,那就是,如果你的可變幀大小不是變量 - 也就是說,如果它始終是一個相對較少的選擇之一 - 那麼你可以考慮保持獨立的計劃,在內存中每一幀的大小,而不是每次一幀的大小與前一次大小不同時重新計算一次計劃。