稍微正確的結果,之前的錯誤並不是高頻波,而是虛數的部分,因為Apple 的OpenCL FFT沒有complex to real這種轉換,所以inverse FFT出來的結果其實是複數,忽略掉虛數部分是上圖結果。
CUFFT有提供complex to real FFT這種轉換,只要在frequency domain符合一些對稱的條件,可以保證output會是實數,input size可以從N減為(N/2) + 1,在Cuda的ocean wave demo中,他們用這個方法來進一步加速,可惜的是Apple的FFT沒有這個功能。
不過照Tessendorf paper上的公式,我看不出一定會符合對稱的條件(?),那這時候轉換出來虛數的部分代表甚麼呢?感覺上已經到達我數學能力的極限了,數學只要不用,實在是退化的非常快阿...還好工作上都用現成的library,幾乎所有東西都是黑盒子啦,難的東西都交給別人寫就好...
一些相關reference
- ocean wave的經典論文是Tessendorf的"Simulating Ocean Water".
- real input DFT http://en.wikipedia.org/wiki/Discrete_Fourier_transform#The_real-input_DFT
- Insomniac Game在Resistance 2中用了32*32的FFT來模擬水面http://www.insomniacgames.com/research_dev/articles/2009/1500769,只是他們的技術更複雜,水面有LOD,除了風力還可以模擬其他外力造成的水波。他們非常大方的釋出了所有source code,只是很大部分都是用spu assembly寫的,嗯...
- kiss FFT http://sourceforge.net/projects/kissfft/一個CPU FFT library,我用來驗證GPU結果正確性。非常方便,整合大概花了五分鐘,其中有三分鐘是在下載檔案。好的library就應該是這個樣子,可以直接把程式碼貼進專案然後就可以work,沒有其他雜七雜八的external dependency。
No comments:
Post a Comment