色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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θ 的時候,知道,給定一個角度,按照上述方法就可以求解。現在將其反過來,給定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。可以看到結果近似。

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








審核編輯:劉清

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

    關注

    1629

    文章

    21753

    瀏覽量

    604198
  • 存儲器
    +關注

    關注

    38

    文章

    7512

    瀏覽量

    163980
  • CORDIC算法
    +關注

    關注

    0

    文章

    17

    瀏覽量

    9750
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8277
  • 姿態解算
    +關注

    關注

    0

    文章

    49

    瀏覽量

    8275

原文標題:【經驗分享】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 ?1812次閱讀
    基于<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 ?3270次閱讀
    <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 ?2791次閱讀
    基于<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 ?3575次閱讀
    基于<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>方案
    主站蜘蛛池模板: 18禁止看的免费污网站| 亚洲一区在线观看视频| 亚洲黄色成人| 儿子日母亲B好爽| 欧美囗交xx bbb视频| 22eee在线播放成人免费视频| 九九精品视频在线播放| 亚洲涩福利高清在线| 国产在线观看www| 亚洲国产日韩制服在线观看| 国产香蕉尹人视频在线| 亚洲 欧美 制服 校园 动漫| 国产蜜臀AV在线一区视频| 我把寡妇日出水好爽| 国产精品无码麻豆放荡AV| 性欧美videofree中文字幕| 国产视频这里只有精品| 亚洲精品无码午夜福利在线观看| 好姑娘社区在线视频| 野花香在线观看免费观看大全动漫 | 97 sese| 欧美黑人巨大xxxxx| brazzers巨臀系列| 日韩一区二区三区射精| 国产精品久久精品视| 亚洲国产欧美另类| 久久理论片迅播影院一级| 91看片淫黄大片.在线天堂| 欧式午夜理伦三级在线观看| 国产 高清 无码 在线播放| 亚洲AV成人片色在线观看网站| 精品国产乱码久久久久久人妻 | 麻豆影视在线直播观看免费| 97视频久久| 日本人的xxxxxxxxx69| 国产精品无码AV天天爽色欲| 亚洲一区在线观看视频| 妞干网手机免费视频| 国产精品久久久久影院嫩草| 亚洲中文字幕乱码熟女在线| 蜜桃视频无码区在线观看|