快速pow算法c语言_嵌入式必知基础算法(二)
七、二分法
在一個數組中,知道一個數值,想確定他在數組中的位置下標,如數組:A[5] = {1,2,6,7,9};我知道其中的值為6,那么他的下標位置就是3。
八、限幅濾波法
對于隨機干擾 , 限幅濾波是一種有效的方法;
基本方法:比較相鄰n 和 n - 1時刻的兩個采樣值y(n)和 y(n – 1),根據經驗確定兩次采樣允許的最大偏差。如果兩次采樣值的差值超過最大偏差范圍 ,認為發生隨機干擾 ,并認為后一次采樣值y(n)為非法值 ,應予刪除 ,刪除y(n)后 ,可用y(n – 1) 代替y(n);若未超過所允許的最大偏差范圍 ,則認為本次采樣值有效。
下面是限幅濾波程序:
(A值可根據實際情況調整,value 為有效值 ,new_value 為當前采樣值濾波程序返回有效的實際值 )
九、中位值濾波法
中位值濾波法能有效克服偶然因素引起的波動或采樣不穩定引起的誤碼等脈沖干擾;
對溫度 液位等緩慢變化的被測參數用此法能收到良好的濾波效果 ,但是對于流量壓力等快速變化的參數一般不宜采用中位值濾波法;
基本方法:對某一被測參數連續采樣 n次(一般 n 取奇數) ,然后再把采樣值按大小排列 ,取中間值為本次采樣值。
下面是中位值濾波程序:
十.算術平均濾波法
算術平均濾波法適用于對一般的具有隨機干擾的信號進行濾波。這種信號的特點是信號本身在某一數值范圍附近上下波動 ,如測量流量、 液位;
基本方法:按輸入的N 個采樣數據 ,尋找這樣一個 Y ,使得 Y 與各個采樣值之間的偏差的平方和最小。
編寫算術平均濾波法程序時嚴格注意:
一.為了加快數據測量的速度 ,可采用先將測量數據存放在存儲器中 ,測完 N 點后 ,再對 N 個數據進行平均值計算;
二.選取適當的數據格式 ,也就是說采用定點數還是采用浮點數。其程序如下所示:
十一、遞推平均濾波法
基本方法:采用隊列作為測量數據存儲器 , 設隊列的長度為 N ,每進行一次測量 ,把測量結果放于隊尾 ,而扔掉原來隊首的一個數據 ,這樣在隊列中始終就有 N 個 “最新” 的數據。當計算平均值時 ,只要把隊列中的 N 個數據進行算數平均 ,就可得到新的算數平均值。這樣每進行一次測量 ,就可得到一個新的算術平均值。
十二、一階滯后濾波法
優點:對周期性干擾具有良好的抑制作用,適用于波動頻率較高的場合;
缺點:相位滯后,靈敏度低.滯后程度取決于a值大小.不能消除濾波頻率高于采樣頻率的1/2的干擾信號。程序如下:
十三、PID控制算法
在過程控制中,按偏差的比例(P)、積分(I)和微分(D)進行控制的PID控制器(亦稱PID調節器)是應用最為廣泛的一種自動控制器;
對于過程控制的典型對象──“一階滯后+純滯后”與“二階滯后+純滯后”的控制對象,PID控制器是一種最優控制;
PID調節規律是連續系統動態品質校正的一種有效方法,它的參數整定方式簡便,結構改變靈活(PI、PD、…)。
一、 模擬PID調節器
PID調節器各校正環節的作用:
比例環節:即時成比例地反應控制系統的偏差信號e(t),偏差一旦產生,調節器立即產生控制作用以減小偏差;
積分環節:主要用于消除靜差,提高系統的無差度。積分時間常數TI越大,積分作用越弱,反之則越強;
微分環節:能反應偏差信號的變化趨勢(變化速率),并能在偏差信號的值變得太大之前,在系統中引入一個有效的早期修正信號,從而加快系統的動作速度,減小調節時間。
PID調節器是一種線性調節器,它將給定值r(t)與實際輸出值c(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合構成控制量,對控制對象進行控制。
程序片段如下:
十四、開根號算法
單片機開平方的快速算法
因為工作的需要,要在單片機上實現開根號的操作。目前開平方的方法大部分是用牛頓迭代法。我在查了一些資料以后找到了一個比牛頓迭代法更加快速的方法。不敢獨享,介紹給大家,希望會有些幫助。
1.原理
因為排版的原因,用pow(X,Y)表示X的Y次冪,用B[0],B[1],...,B[m-1]表示一個序列,其中[x]為下標。
假設:
B[x],b[x]都是二進制序列,取值0或1。
(1) N的最高位b[n-1]可以根據M的最高位B[m-1]直接求得。
設 m 已知,因為 pow(2, m-1) <= M <= pow(2, m),所以 pow(2, (m-1)/2) <= N <= pow(2, m/2)
如果 m 是奇數,設m=2*k+1,
那么
pow(2,k) <= N < pow(2, 1/2+k) < pow(2, k+1),
n-1=k, n=k+1=(m+1)/2
如果 m 是偶數,設m=2k,
那么 pow(2,k) > N >= pow(2, k-1/2) > pow(2, k-1),
n-1=k-1,n=k=m/2
所以b[n-1]完全由B[m-1]決定。
余數 M[1] = M - b[n-1]pow(2, 2n-2)
(2) N的次高位b[n-2]可以采用試探法來確定。
因為b[n-1]=1,假設b[n-2]=1,則
pow(b[n-1]pow(2,n-1) + b[n-1]pow(2,n-2), 2) = b[n-1]pow(2,2n-2) + (b[n-1]pow(2,2n-2) + b[n-2]pow(2,2n-4)),
然后比較余數M[1]是否大于等于 (pow(2,2)b[n-1] + b[n-2]) * pow(2,2n-4)。這種比較只須根據B[m-1]、B[m-2]、...、B[2*n-4]便可做出判斷,其余低位不做比較。
若 M[1] >= (pow(2,2)b[n-1] + b[n-2]) * pow(2,2n-4), 則假設有效,b[n-2] = 1;
余數 M[2] = M[1] - pow(pow(2,n-1)b[n-1] + pow(2,n-2)b[n-2], 2) = M[1] - (pow(2,2)+1)pow(2,2n-4);
若 M[1] < (pow(2,2)b[n-1] + b[n-2]) * pow(2,2n-4), 則假設無效,b[n-2] = 0;余數 M[2] = M[1]。
(3) 同理,可以從高位到低位逐位求出M的平方根N的各位。
使用這種算法計算32位數的平方根時最多只須比較16次,而且每次比較時不必把M的各位逐一比較,尤其是開始時比較的位數很少,所以消耗的時間遠低于牛頓迭代法。
2. 實現代碼
這里給出實現32位無符號整數開方得到16位無符號整數的C語言代碼。
今天的分享到這里就結束了,今天的內容是否對您有幫助呢,如果覺得我們的文章對您有幫助,勞煩您動動您的手指分享轉發下我們的文章吧~
關注睿感電子科技訂閱號~
帶您玩轉硬件,不迷路~
“ 寫文章不易,給作者打個賞買個六味地黃丸補補 ”
總結
以上是生活随笔為你收集整理的快速pow算法c语言_嵌入式必知基础算法(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GTA5开车新手指南,快速驾驶技巧大揭秘
- 下一篇: 思科bfd静态路由切换_思科路由器与华为