2011-11-18 31 views
13

我已經在一個項目中達到了這樣的地步,它開始爲矢量和混雜三角函數創建一些支持類比繼續使用臨時函數更有意義。我期望有很多C++庫,但我不想犧牲我習慣的速度和功能。用於整數三角函數的C++庫,使用可選的近似值進行速度優化?

具體來說,我希望能夠用整數的角度,我想保持由近似這樣帶來的超高速度:

static inline int32_t sin_approx(int32_t angle) 
//Angle is -32768 to 32767: Return -32768 to 32767 
{ 
    return (angle<<1) - ((angle*abs(angle))>>14); 
} 

所以,在我毫無必要推出自己的,有沒有真的用於C++的快速定點庫,帶有模板類,如向量,我可以指定所用整數的寬度,並且具有快速逼近,比如上面我應該看的那個?

+0

這是一個近似的罪? – TonyK

+0

我真的不知道。我在一年前根據浮點數sin近似來編寫它,我猜測它是一些拋物線函數。在將它轉換爲整數之後,結果如上。忘了原來的功能,我不知道它是如何工作的。儘管它畫了一個近乎完美的圓圈。 – porgarmingduod

+2

哦,我現在看到它。它將範圍的每一半近似爲0和2處的零點,最大值/最小值+/- 1。太好了! – TonyK

回答

4

幾年前,當我不得不將一些音頻指紋代碼從浮點轉換爲定點時,我走下了這條路。硬件部分是DCT(使用大餘弦表)和高精度對數。我發現現有圖書館的方式令人驚訝的不多。從那以後,我聽說最初的索尼PlayStation(PS1)沒有浮點支持,所以如果它仍然存在,那麼開發論壇(fori?)可能會有你想要的。

我曾與之合作過的一些人對NewMat庫有好運,雖然它是面向線性代數而不是三角函數的,似乎專注於浮點數。儘管如此,它的網站導致this list,這看起來值得檢查。我還發現了一個信號處理庫spuc,它可能適用於定點支持。幾年前,我看到了來自Fraunhofer的信號處理模板庫(sptl)。我認爲它是專有的,但可能以某種方式提供。

所有的說法,我認爲你已經很接近你已經。既然你有一個正弦函數,你基本上也有一個餘弦函數,只要你適當地轉換輸入(cos(x) == sin(x + pi/2))。由於切線是正弦和餘弦的商(tan(x) = sin(x)/cos(x)),因此基本上存在三角函數。

關於向量,不要將STL向量和valarray類與STL算法結合起來嗎?如果沒有,總是有Boost的math libraries

對不起,我不能指出你正在尋找的銀彈,但你現在試圖做的事情很少見。想要精確的人通常會直接進入浮點運算,這在現代處理器上有不俗的表現,並且有很多庫支持。那些想在資源受限的硬件上加快速度的人通常不需要精確度,也不會執行向量的觸發操作,也可能不會執行C++。我認爲你最好的選擇是推出自己的。嘗試將其視爲在新環境中應用輪子設計模式,而不是重新創造它。 :)

+0

真的很多很好的信息。我很驚訝地發現我錯過了boost的幾何庫(儘管在任何情況下它可能都是矯枉過正) – porgarmingduod