那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FPGA實現Cordic算法求解arctanθ

FPGA研究院 ? 來源:FPGA之旅 ? 2023-09-27 09:30 ? 次閱讀

一. 簡介

由于在項目中需要使用的MPU6050,進行姿態解算,計算中設計到arctan 和 sqr(x*2 + y * 2),這兩部分的計算,在了解了一番之后,發現Cordic算法可以很方便的一次性求出這兩個這兩部分的計算。另外也可以一次性求出sin和cos的值。另外該算法還可以計算其他的一些公式(沒做過多的了解)。

二.Cordic算法

該算法的核心實現就是旋轉逼近,每次旋轉一定的角度,無限的逼近所給定的角度值。

1. 理論基礎

首先有向量P0,現在要將其旋轉θ角度,到Pm。那么Pm的坐標值如下

xm = x0cosθ - y0sinθ = cosθ(x0 – y0tanθ)

ym = x0sinθ + y0cosθ = cosθ(y0 + x0tanθ)

P0和Pm均在單位圓上,另外假設現在P0在X軸上,即 X0 = 1,y0 = 0。上式就可以變為如下顯示

xm = x0cosθ - y0sinθ = cosθ

ym = x0sinθ + y0cosθ = sinθ

可以看到Pm的坐標值,就是sinθ 和 cosθ的值。這就是理論基礎。

52cb0070-5cc5-11ee-939d-92fbcf53809c.png

2. sinθ 和 cosθ 算法實現

有了理論支持后,我們只需要求解Pm的坐標即可。直接旋轉θ不太可能,但是我們可以每次旋轉特定的角度θi (tanθi = 1/2^i),讓我們的角度值逼近θ即可。于是就有了如下迭代公式。

x(i+1) = cosθi* (xi – yi * tanθi)

y(i+1) = cosθi * (yi + xi * tanθi)

θ(i+1) = θi (+-) dθi

如果當前角度小于設定角度,那么就加dθ ,大于設定角度 , 那么就減dθ。由于每次旋轉的dθ,會越來越小,所以旋轉的當前角度會越來越來接近設定角度。

計算過程中 ,cosθi,只充當縮放因子,對旋轉方向沒有影響。可以先在軟件中提取技術出來。每次旋轉角度值 和 對應的 cos值如下。

52d742ea-5cc5-11ee-939d-92fbcf53809c.png

3. arctan (x,y)和 sqr(x*2 + y * 2)算法實現

在求解sinθ 和 cosθ 的時候,知道,給定一個角度,按照上述方法就可以求解?,F在將其反過來,給定sinθ 和 cosθ的值,也就是Pm的坐標(可能不在單位圓上,只是模值縮放了),現在只需要將其旋轉到X軸的正半軸上,即Y = 0 ,X > 0的時候,所旋轉過的角度值即arctan (x,y)。

然后P0的X坐標值即sqr(x*2 + y * 2)。旋轉過程中,向量的模值是不會改變的,而Pm的模值就是sqr(x*2 + y * 2)。

三.Cordic算法實現

首先將上述角度值,存儲到verilog中,需要進行擴大處理。由于tanθi = 1/2^i),所以對應的tanθ也是知道的。在相乘的時候,只需要將對應的數右移對應的位數即可

`define rot0 32'd2949120    //45度*2^16
`define rot1 32'd1740992    //26.5651度*2^16
`define rot2 32'd919872    //14.0362度*2^16
`define rot3 32'd466944    //7.1250度*2^16
`define rot4 32'd234368    //3.5763度*2^16
`define rot5 32'd117312    //1.7899度*2^16
`define rot6 32'd58688     //0.8952度*2^16
`define rot7 32'd29312     //0.4476度*2^16
`define rot8 32'd14656     //0.2238度*2^16
`define rot9 32'd7360     //0.1119度*2^16
`define rot10 32'd3648     //0.0560度*2^16
`define rot11 32'd1856     //0.0280度*2^16
`define rot12 32'd896      //0.0140度*2^16
`define rot13 32'd448      //0.0070度*2^16
`define rot14 32'd256      //0.0035度*2^16
`define rot15 32'd128      //0.0018度*2^16

然后就是迭代過程了,迭代16次足夠了。最后的Zn和Xn就是想要結果。

//旋轉
genvar i;
generate
  for( i = 1 ;i < 17 ;i = i+1)
 ? begin: loop2
 ? ? ? always@(posedge clk or negedge rst_n)
 ? ? ? begin
 ? ? ? ? ? if( rst_n == 1'b0)
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? Xn[i] <= 'd0;
 ? ? ? ? ? ? ? Yn[i] <= 'd0;
 ? ? ? ? ? ? ? Zn[i] <= 'd0;
 ? ? ? ? ? end
 ? ? ? ? ? else if( cal_delay[i -1] == 1'b1)
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? if( Yn[i-1][31] == 1'b0)
 ? ? ? ? ? ? ? begin
 ? ? ? ? ? ? ? ? ? Xn[i] <= Xn[i-1] + (Yn[i-1] >>> (i-1));
          Yn[i] <= Yn[i-1] - (Xn[i-1] >>> (i-1));
          Zn[i] <= Zn[i-1] + rot[i-1];
 ? ? ? ? ? ? ? end
 ? ? ? ? ? ? ? else
 ? ? ? ? ? ? ? begin
 ? ? ? ? ? ? ? ? ? Xn[i] <= Xn[i-1] - (Yn[i-1] >>> (i-1));
          Yn[i] <= Yn[i-1] + (Xn[i-1] >>> (i-1));
          Zn[i] <= Zn[i-1] - rot[i-1];
 ? ? ? ? ? ? ? end
 ? ? ? ? ? end
 ? ? ? ? ? else
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? Xn[i] <= Xn[i];
 ? ? ? ? ? ? ? Yn[i] <= Yn[i];
 ? ? ? ? ? ? ? Zn[i] <= Zn[i];
 ? ? ? ? ? end
 ? ? ? end
 ? end
endgenerate

這里沒有乘cosθ,最后的Xn會比真實值大1.64倍左右,所以還需要對其進行一個縮小操作,通過右移來近似實現。

assign cordic_ack = cal_delay[16];
assign theta   = Zn[16];
assign amplitude = (Xn[16] >>> 1) + (Xn[16] >>> 3); ////幅度,偏大1.64倍,這里做了近似處理

然后就是仿真了,給了X=Y=15,也就是角度為45度,幅值21.213,擴大65536倍為1,376,256??梢钥吹浇Y果近似。

52e5fc36-5cc5-11ee-939d-92fbcf53809c.png








審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21798

    瀏覽量

    606032
  • 存儲器
    +關注

    關注

    38

    文章

    7528

    瀏覽量

    164347
  • CORDIC算法
    +關注

    關注

    0

    文章

    17

    瀏覽量

    9759
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8309
  • 姿態解算
    +關注

    關注

    0

    文章

    49

    瀏覽量

    8304

原文標題:【經驗分享】FPGA實現Cordic算法求解arctanθ

文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于改進的CORDIC算法的FFT復乘及其FPGA實現

    ,所以CORDIC算法的移位、加減法運算和流水線結構更容易在FPGA實現。本文在Altera公司的QuartusⅡ7.2軟件環境下使用VHDL,利用上述各種
    發表于 07-11 21:32

    CORDIC 算法

    我現在寫著一個CORDIC 的 verilog 代碼,但在邏輯上遇到問題。https://www.edaplayground.com/x/3tHk , 為何 y[2] == 0 ? -->
    發表于 05-14 00:32

    請問能不能用CORDIC算法代替ROM表,用FPGA實現CORDIC算法來控制AD9910?

    正在做一個課題,用FPGA控制AD9910,但是本人想把基于ROM表的改成基于CORDIC算法的,這樣還能不能用FPGA實現控制AD9910
    發表于 12-01 08:47

    LabVIEW FPGA CORDIC IP核的arctan使用方法

    使用LabVIEW FPGA模塊中的CORDIC IP核,配置arctan(X/Y)算法,配置完成之后,IP核只有一個輸入。我參考網上VHDL CO
    發表于 09-10 20:07

    FPGA設計中必須掌握的Cordic算法

    大多數工程師在碰到需要在 FPGA實現諸如正弦、余弦或開平方這樣的數學函數時,首先會想到的是用查找表,可能再結合線性內插或者冪級數(如果有乘法器可用)。不過對這種工作來說,CORDIC
    發表于 09-19 09:07

    怎么利用CORDIC算法FPGA實現高速自然對數變換器?

    本文利用CORDIC算法FPGA實現了高速自然對數變換器。
    發表于 04-30 06:05

    高性能HPOR CORDIC算法實現

    CORDIC 算法在通信和圖像處理等各個領域有著廣泛的應用,但是浮點CORDIC 由于迭代延時大且實現復雜沒有得到很好的應用,本文提出了一種修正浮點
    發表于 12-15 14:27 ?15次下載

    利用CORDIC算法FPGA實現可參數化的FFT

    針對在工業中越來越多的使用到的FFT,本文設計出了一種利用CORDIC算法FPGA實現快速FFT的方法。CORDIC
    發表于 08-09 15:39 ?55次下載

    基于CORDIC算法2FSK調制器的FPGA設計

    本文提出了應用CORDIC(Coordinate Rotation Digital Computer)算法實時計算正弦值的方案,并基于CORDIC算法
    發表于 05-31 10:22 ?1837次閱讀
    基于<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>2FSK調制器的<b class='flag-5'>FPGA</b>設計

    雙模式CORDIC算法FPGA實現

    CORDIC算法將復雜的算術運算轉化為簡單的加法和移位操作,然后逐次逼近結果。這種方法很好的兼顧了精度、速度和硬件復雜度,它與VLSI技術的結合對DSP算法的硬件實現具有極大的意義
    發表于 06-27 17:27 ?66次下載
    雙模式<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>的<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>

    cordic算法verilog實現(簡單版)

    cordic算法verilog實現(簡單版)(轉載)module cordic(clk, phi, cos, sin); parameter W = 13, W_Z = 14; in
    發表于 02-11 03:06 ?3291次閱讀
    <b class='flag-5'>cordic</b><b class='flag-5'>算法</b>verilog<b class='flag-5'>實現</b>(簡單版)

    基于FPGACordic算法實現的設計與驗證

    本文是基于FPGA實現Cordic算法的設計與驗證,使用Verilog HDL設計,初步可實現正弦、余弦、反正切函數的
    發表于 07-03 10:18 ?2828次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b><b class='flag-5'>實現</b>的設計與驗證

    基于CORDIC的高速Sobel算法實現

    為提高圖像邊緣檢測的處理速度,提出一種基于CORDIC的高速Sobel算法實現。
    的頭像 發表于 10-05 09:54 ?3602次閱讀
    基于<b class='flag-5'>CORDIC</b>的高速Sobel<b class='flag-5'>算法</b><b class='flag-5'>實現</b>

    如何使用FPGA實現CORDIC算法在跟蹤環中的應用

    主要介紹了坐標旋轉數字計算(CORDIC算法在US,g,鑒別器中的應用,包括碼跟蹤環、鎖頻環和鎖相環鑒別器,并進行了FPGA實現。在設計中,采用統一
    發表于 01-22 16:12 ?8次下載
    如何使用<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b><b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>在跟蹤環中的應用

    基于流水線CORDIC算法通用數字調制器的FPGA實現方案

    電子發燒友網站提供《基于流水線CORDIC算法通用數字調制器的FPGA實現方案.pdf》資料免費下載
    發表于 10-27 09:46 ?1次下載
    基于流水線<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>通用數字調制器的<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>方案
    皇冠百家乐的玩法技巧和规则 | 网上百家乐骗人的吗| 大发棋牌游戏| 百家乐官网平注常赢规则| 利高| 澳门百家乐玩法| 浑源县| 网上百家乐的玩法技巧和规则| 百家乐官网投注网中国体育| 星期8百家乐娱乐城| 百家乐官网必赢法冯耘| 百家乐怎么赢9| 陇西县| 现场百家乐玩法| 百家乐官网21点德州扑克| 百家乐赌场导航| 大佬百家乐官网娱乐城| 网页百家乐官网官网| 好运来百家乐官网的玩法技巧和规则| 百家乐官网平游戏| 澳门百家乐博客| 威尼斯人娱乐城线上赌场| 百家乐的嬴钱法| 百家乐官网最低压多少| 大发888是什么| 百家乐赌牌技巧| 遵义市| 女神百家乐的玩法技巧和规则| 澳门百家乐赢钱| 百家乐几点开奖| 玩百家乐请高手指点| 大西洋城娱乐| 澳门百家乐官网一把决战输赢 | 2024年九宫八卦吉位| 百家乐国际娱乐场| 棋牌网站| 大亨百家乐官网娱乐城| 百家乐官网乐百家娱乐场| 闲和庄百家乐娱乐网| 金冠娱乐城注册| 百家乐官网真人视屏游戏|