僅出於樂趣,並證明它可以完成,我完成了一個AVR彙編例程,以24位(3字節)的格式計算sin(x)結果,但有1位錯誤。輸入角度以度為單位,以十進制數為單位,僅第一個像限為000到900(0〜90.0)。它使用不到210條AVR指令,平均運行時間為212微秒,從211us(角度= 001)到213us(角度= 899)不等。天(空閒時間),只考慮最佳計算算法,考慮到AVR微控制器,沒有浮點數,消除了所有可能的除法。花更多的時間來為整數設置正確的升壓值,要具有良好的精度,需要將1e-8的值升壓為2 ^ 28或更大的二進制整數。一旦找到所有精度和舍入誤差元,將其計算分辨率提高2 ^ 8或2 ^ 16,就可以達到最佳結果。我首先在Excel上模擬了所有計算,同時將所有值都設為Int(x)或Round(x,0)來表示AVR核心處理。
例如,在算法中,角度必須以弧度為單位,輸入以度為單位,以方便用戶使用。要將度數轉換為弧度,平凡的公式是rad = degrees * PI / 180,這看起來很好,很簡單,但不是,PI是一個無限數-如果使用很少的數字,它將在輸出中產生錯誤,除以180要求AVR位操作,因為它沒有除法指令,並且除此以外,由於涉及遠遠低於整數1的數字,結果將需要浮點運算。例如,1°(度)的Radian為0.017453293。由於PI和180是常數,為什麼不為了簡單的乘法而反轉呢? PI / 180 = 0.017453293,將其乘以2 ^ 32,得到的常數為74961320(0x0477D1A8),將該數字乘以您的角度(以度為單位),假設900代表90°,然後將其右移4位(÷16),以獲得4216574250(0xFB53D12A),即90°的弧度(具有2 ^ 28的擴展),適合4個字節,沒有一個除法(右移4位除外)。在某種程度上,這種技巧所包含的錯誤小於2 ^ -27。
因此,所有進一步的計算都需要記住,錯誤要高2 ^ 28並要加以注意。您需要將移動結果除以16、256或什至65536,以避免它使用不必要的增長的飢餓字節,這不利於解決。這是一項艱苦的工作,只是在每個計算結果中找到最少的位數,使結果精度保持在24位左右。在Excel流中,按嘗試/錯誤方式使用高或低位進行多次計算中的每一項,在結果中觀察錯誤位的總數,該圖顯示0-90°,其中宏運行代碼900次,十分之一度。這種“可視化” Excel方法是我創建的工具,它為代碼的每個部分找到了最佳解決方案,這大有幫助。
例如,將特定的計算結果13248737.51舍入為13248738或僅丟失小數點“ 0.51”,它將對所有900個輸入角度(00.1〜90.0)測試的最終結果精度產生多大影響?
在每次計算中,我都能將動物保持在32位(4字節)內,並最終獲得了魔法,從而在結果的23位內獲得了精度。當檢查結果的整個3個字節時,誤差為±1 LSB,非常明顯。
用戶可以根據自己的精度要求從結果中抓取一個,兩個或三個字節。當然,如果僅一個字節就足夠了,我建議使用一個256字節的sin表,並使用AVR'LPM'指令來抓取它。
一旦我使Excel序列運行流暢,整潔,從Excel到AVR程序集的最終翻譯就用了不到2個小時,像往常一樣,您應該首先考慮更多,然後再減少工作。
那時,我可以進行更多壓縮並減少寄存器使用量。實際的(不是最終的)代碼使用大約205條指令(〜410字節),平均以212us運行sin(x)計算,時鐘為16MHz。以該速度,它每秒可以計算4700+ sin(x)。並不重要,但是它可以運行高達4700Hz的精確正弦波,具有23位的精度和分辨率,而無需任何查找表。
基本算法基於針對sin(x)的泰勒級數,但是對其進行了很多修改,以適應AVR微控制器和精確度的要求。
即使使用2700字節表(900個條目* 3個字節)將具有極好的速度吸引力,在此方面的樂趣或學習經驗是什麼?當然,也考慮使用CORDIC方法,也許稍後,這裡的重點是將Taylor擠入AVR核心並從乾燥的岩石中取水。
我想知道Arduino的“ sin(78.9°)”是否可以以小於212us的精度運行23位處理(C ++),所需的代碼小於205條指令。可能是C ++使用CORDIC。 Arduino草圖可以導入彙編代碼。
沒有任何必要在此處發布代碼,稍後,我將對這篇文章進行編輯,以包括指向該文章的Web鏈接,可能會在我的博客中,此URL。
這是一項業餘愛好,很有趣,它以16MHz的速度推動了幾乎16MIPS的AVR引擎的極限,無須除法指令,僅以8x8位進行乘法運算。它允許計算sin(x),cos(x)[= sin(900-x)]和tan(x)[= sin(x)/ sin(900-x)]。
最重要的是,這有助於使我63歲的大腦保持光彩照人。當青少年說“老年人”對技術一無所知時,我回答“再想一想,您認為誰為今天享受的一切奠定了基礎?”。
乾杯