cordic算法matlab实例

合集下载

Cordic算法说明与实现设计(word文档良心出品)

Cordic算法说明与实现设计(word文档良心出品)

Cordic 算法说明———— 王聪颖假设调制信号为()m t ,则其经FM 调制后的表达式为:0()cos(())tc f S t t K md ωττ=+⎰ 式(1)其中c ω为载波信号,f K 为常量。

因此,()m t 构成了()S t 信号的部分相位分量,而FM 解调过程就是将()m t 从()S t 的相位中提取出来,这里就可以通过Cordic 算法计算出()S t 信号的相位。

一、算法介绍在本次设计中,为了实现FM 的解调,主要对比了三种算法的实现方法:查表法和Cordic 算法的两种不同实现方法。

下面一一进行介绍:1)查表法:此方法其依据是当[0,/4]θπ∈时,tan [0,1]θ∈且单调递增,这样就可以在[0,/4]θπ∈内建立一个tan θ与θ相对应的表,根据tan θ计算出当前的相位值,同时,利用三角函数关系,将[0,2]π分成大小为/4π的8个部分,并将它们映射至[0,/4]π内从而准确求解。

2)Cordic 算法:其核心是笛卡尔坐标平面旋转,即在xy 坐标平面上将点11(,)x y 旋转θ角度到点22(,)x y 的标准方法如下所示:211211cos sin sin cos x x y y x y θθθθ=-⎫⎬=+⎭式(2)图1 平面坐标旋转示意图将式(2)中的cos θ提取出来,在增加一角度累加方程,即可得到Cordic 算法方程组。

(1)()()(1)()()(1)()()tan tan i i i j i i i j i i i j x x d y y y d y z z d θθθ+++⎫=-⎪=+⎬⎪=-⎭式(3) 在式(3)中,j d 的值为1或-1。

在这里出现两种方法实现Cordic 算法以求的相位:1)取02*45i θ-=,2)取t a n 2iθ-=。

第一种方式暂且称为Cordic 角度法,第二种方式我们暂且称之为Cordic 正切法。

二、算法的比较及实现三种通过计算相位来进行FM解调的算法有其不同的特点:查表法:其思路简单,只需要利用输入的正弦和余弦值求得其映射在0~45度间的正切值,然后进行查表最终获得相位值。

基于改进CORDIC算法的光电编码器正交性误差测量

基于改进CORDIC算法的光电编码器正交性误差测量

基于改进CORDIC算法的光电编码器正交性误差测量鲍克勤; 张雪健; 倪蓉【期刊名称】《《上海电力学院学报》》【年(卷),期】2019(035)005【总页数】4页(P455-458)【关键词】正交性误差; 坐标旋转数字计算机算法; 光电编码器; 精度细分误差; 莫尔条纹【作者】鲍克勤; 张雪健; 倪蓉【作者单位】上海电力学院自动化工程学院上海200090【正文语种】中文【中图分类】TP27随着工业控制技术的不断进步与快速发展,该行业对光电编码器精度的要求也不断提高。

对光电编码器进行深入研究不难发现,其最主要的测量误差来源是细分精度误差,而光电编码器输出信号的质量也对其细分精度产生较大的影响[1-2]。

在理想状态下,光电编码器的输出信号是两个相位差为π/2的标准正弦波形信号,然而实际采集到的光电编码器莫尔条纹光电信号受到码盘刻画工艺、系统噪声、器件安装工艺等各种因素的影响,会导致实际信号中含有多项误差,严重影响了编码器的细分精度。

实际的两路莫尔条纹信号由于一些因素的影响而存在直流电平漂移、高次谐波等信号误差[3-4]。

在各项指标中,光栅莫尔条纹信号的正交性误差是衡量其测量精度的一项重要指标。

因此,开展对光电编码器输出信号的正交性误差测量研究是提高其精度测量的一个重要环节。

目前,美国天文台提出了基于Heidenhain模型的补偿方法,但是该方法计算量大;罗刚等人[5]采用了一种基于锁相环的检测方法,但该方法存在“高频失锁”现象。

本文在前人研究的基础上引入了一种基于改进型的坐标旋转数字计算机(Coordinate Rotation Digital Computer,CORDIC)算法来实时检测光电编码器的正交性误差。

该方法很少被运用到编码器正交性偏差的实时检测领域。

1 CORDIC算法CORDIC算法是VOLDER J D在1959年发表的一篇关于设计航空控制系统的文章中首次提出的,通过简单的移位运算和加减法运算的循环迭代完成对一些常用复杂函数的算术运算。

基于CORDIC算法的PLL在FPGA中的实现

基于CORDIC算法的PLL在FPGA中的实现

基于CORDIC算法的PLL在FPGA中的实现王玉良【摘要】根据硅微陀螺仪驱动模态的特点,利用数字锁相环基本原理,对数字锁相环的压控振荡器和环路滤波器进行了研究与设计.针对环路滤波参数对数字环路锁相速度和稳频精度的影响存在矛盾的特点,提出了一种改变参数的解决方法,并在Simulink和DSPbuilder中对基于CORDIC算法的环路及改变参数的方法进行了详细的仿真验证.最后完成了以EP3C16型号FPGA为核心器件的数字信号处理电路设计与调试,并对设计的环路进行了性能测试,结果表明设计的数字环路可以满足硅微陀螺仪驱动模态的稳频需求.%According to the principle of digital phase locked loop (DPLL) based on CORDIC algorithm, the numerically controlled oscillator and loop filter of DPLL are thoroughly researched and designed for the Silicon Micro-machined Gyroscope (SMG) drive mode. On account of the feature that the loop filter parameters of the DPLL have a contradictory impact on the speed and frequency accuracy of the DPLL,a solution is proposed to resolve that conflict,which can change loop filter parameters in the different work period of the DPLL. Detailed simulations of the solution and DPLL based on CORDIC algorithm are done in Simulink and DSPbuilder. Then the hardware of the digital signal processing circuit with the core of FPCA (EP3C16) is designed and debugged.Finally,performance tests of the loop designed are carried out, the results prove that the loop designed could have satisfied the frequency stability need of the SMG drive mode.【期刊名称】《计量学报》【年(卷),期】2012(033)003【总页数】7页(P259-265)【关键词】计量学;数字锁相环;CORDIC算法;现场可编程门阵列【作者】王玉良【作者单位】中国科学院声学研究所,北京100190【正文语种】中文【中图分类】TB9731 前言锁相环(phase locked loop,PLL)作为一种窄带跟踪滤波器,具有较强的噪声抑制能力,可以提取淹没在噪声中的信号[1],被广泛地应用于测控信号相干解调、时间同步、频率合成、软件无线电、电力系统自动化等领域[2]。

cordic算法及其FPGA硬件实现 毕业论文

cordic算法及其FPGA硬件实现 毕业论文
Key words:cordic algorithm; FPGA; Coordinate rotation algorithm; Binary search method; pipeline architecture
第一
1.1 CORDIC
1.1.1 CORDIC
CORDIC(Coordinate Rotational Digital Computer-坐标旋转数字计算机)算法最早由J.Volder等人于1959年在美国航空控制系统的设计中提出,他的基本思想是:通过坐标轴旋转得出一个二维的函数关系式,对初始角度进行数值线性逼近,把初始角度的旋转转化成一系列基本角度逐次旋转完成,然后运用递推原理,得出一组递推公式,把每次递推得到的角度加进去,转换成一组三维的函数关系式,进一步推导,最终用圆周模型、线性模型、双曲线模型实现了加减乘除、三角函数、双曲线三角函数、平方根,指数、对数等函数的运算。20年后,随着VLSI的产生和迅速发展,CORDIC算法开始被重视,并得到了广泛的应用。原始算法描述的是二维的旋转,它被应用于数字信号处理(如:傅里叶变换、数字滤波器)、计算机图像处理和机器人技术等领域。
由于CORDIC算法本身具有众多的优点,目前,已经应用于很多领域,例如:8087数学协处理器、HP-35计算器、天气预报、雷达信号处理、三维图像处理、嵌入式系统以及移动通信、数控振荡器、数字下变频器及数字鉴别器等;此外,它还应用于许多数字信号处理问题,如:快速傅里叶变换、离散余弦变换、小波变换、数字滤波器、离散Hartley以及求解线性系统。Altera公司和Xilinx公司13还推出了CORDIC算法实现的IP核,可以按照实际需求直接调用。
在数字信号处理中,高速高精度的三角函数发生器有着广泛的应用,在通常情况下,计算三角函数、反三角函数、双曲线函数和其它超越函数有效的方法有:ROM查找表法、多项式近似法(主要是利用泰勒级数近似)、CORDIC法。

cordic案例

cordic案例

cordic案例
CORDIC算法是一种迭代算法,用于计算三角函数、对数函数和平方根等数学函数。

它的优点是快速、精度高、硬件实现简单等。

CORDIC算法最初是由Jack E. Volder在1959年发明的。

CORDIC算法的基本思想是将一个向量旋转到目标向量,然后通过一系列的旋转和缩放操作得到所需的结果。

该算法可以在极小的存储器和处理器资源下实现,并且能够适应各种不同的数值类型,因此,在许多数字信号处理应用中得到了广泛的应用。

以计算正弦函数为例,CORDIC算法可以通过对向量进行旋转来逼近正弦函数的值。

具体的实现过程可以分为以下几步:
1. 将目标角度转化为弧度表示;
2. 初始化旋转向量和旋转角度;
3. 迭代旋转向量,使其逼近目标向量;
4. 根据旋转角度计算正弦函数的值。

通过以上的步骤,可以得到一个非常精确的正弦函数值。

CORDIC算法也可以用来计算其他的数学函数,如余弦函数、反正切函数等。

总之,CORDIC算法是一种非常实用的算法,可以用于许多数字信号处理应用中。

由于其简单、快速和高精度等优点,它在数字信号处理领域中受到了广泛的应用。

- 1 -。

改进型高速高精度CORDIC算法及其在DDFS中的应用

改进型高速高精度CORDIC算法及其在DDFS中的应用

改进型高速高精度CORDIC算法及其在DDFS中的应用史方显;曾立;陈昱;王淼;占丰【摘要】提出了一种新的选择迭代式高速高精度CORDIC(COrdinate Rotation Digital Computer)算法.基于表驱动法缩小目标旋转角度,通过改进的基本角度选择方法旁路不必要的迭代;并以移位和减法实现幅度校正,减小硬件资源消耗.设定角度误差小于10-5rad时,迭代次数减小至7次以下.在DDFS(Direct Digital Frequency Synthesizer)的应用中,利用区间压缩技术在Xilinx的FPGA中实现20位定点小数电路设计.仿真及实测结果表明,该算法幅度误差小于2×10-5,输出延时不大于43.5ns,同时硬件资源消耗不增加.%A novel optional-iteration high speed and high precision CORDIC algorithm is proposed in this paper.First the rotation is conducted with a corresponding angle based on table-driven method.Then the algorithm bypasses unnecessary iterations using a new basic angle choosing technique.And the correction is achieved by shift and subtraction to reduce hardware consumption.Calculation and simulation indicate that the new algorithm can reduce the iteration number to less than 7 when the phase error is smaller than 10-5 rad.In the application of DDFS,20 fractional binary bits design is implemented in Xilinx FPGA with range reduction method.This design can reduce amplitude error to smaller than 2 x 10-5 for sine and cosine,cut the output delay down to 43.5ns in circuit test,and no hardware consumption increase.【期刊名称】《电子学报》【年(卷),期】2017(045)002【总页数】6页(P446-451)【关键词】坐标旋转数字计算机;直接数字频率合成器;表驱动;现场可编程门阵列【作者】史方显;曾立;陈昱;王淼;占丰【作者单位】北京航空航天大学宇航学院,北京100191;北京航空航天大学宇航学院,北京100191;北京航空航天大学宇航学院,北京100191;北京航空航天大学宇航学院,北京100191;山东航天电子技术研究所,山东烟台264000【正文语种】中文【中图分类】TN431.2直接数字频率合成技术(DDFS)属于第三代频率合成技术,由Tierney J在1971年首先提出[1].传统的DDFS基于查找表(LUT)技术,其主要结构包括相位累加器、查找表、DAC和低通滤波器.累加器在时钟的上升沿对频率控制字进行累加,将结果作为地址在查找表中读出正余弦值,通过DAC后进行低通滤波.在满足Nyquist采样定律的情况下,增大频率控制字可增大合成的频率.这种方法具有快速转换、高频率分辨率、低相位噪声和相位连续等优点[2].但由于有限字长的截断误差,基于查找表的DDFS必须在精度和面积、速度之间折衷.坐标旋转数字计算机(CORDIC)可通过移位和加减计算平方根、正余弦、模长与相位以及坐标变换,易于在FPGA等VLSI 器件中实现,广泛应用于FFT、矩阵分解和DDFS[3].CORDIC算法最早由Volder J E在1959年提出[4],圆周坐标下的CORDIC算法的核心思想是通过一系列的基本角度{θi=arctan2-i}的加减逐渐逼近输入角度,并对结果进行校正,i依次递增.其基本公式为其中x、y为旋转向量端点的横坐标值和纵坐标值.由式(1)可知旋转的过程中剩余未旋转角度zi的绝对值不断趋近于0,δi∈{-1,1}用以指示zi的正负,当δi=-1时逆时针旋转,δi=1时顺时针旋转.设旋转前后的向量长度分别为Ri和Ri+1,则有[4]即每次旋转后向量长度增加,为确保其端点仍在单位圆上,应对式(1)计算结果进行校正,且第i次旋转的校正系数为提高运算速度的主要方法有减小迭代次数、降低关键路径延时等,如文献[5]提出了改进型的并行CORDIC,但其精度只能达到10-4量级.文献[6]在资源利用率上有一定优势,但迭代过程依赖于时钟信号,导致延时较长.传统的CORDIC算法中的i是单调递增的,在|zi|较小的情况下仍可能进行较大角度旋转,致使迭代次数较大.文献[7]等提出了可调整基本角度系数的基4混合CORDIC,但判断系数所用的选择方程比较复杂,硬件资源消耗较大.针对传统算法的这些缺点,本文提出一种新的选择迭代式CORDIC算法,以相对简单的方式跳过不必要的旋转,在减小迭代次数的同时确保硬件资源消耗不增加.3.1 算法说明将[0,π/4]等分为长度为I的区间,第m个区间起点为αm,正余弦值{sinαm}和{cosαm}以及基本角度{θi}均存储在查找表中,其中0≤m≤⎣π/4I」且m为正整数,tanθi=2-i.输入角度φ首先通过由{αm}组成的比较阵列,根据比较结果返回m 的值,查表得x0=cosαm、y0=sinαm做为旋转的起点,此时已经旋转至φ的附近,故实际旋转的目标角度为φ-αm,且满足φ-αm≤φ.后续迭代均采用与zi绝对值最相近的基本角度θi,此时|θi-|zi||取最小值.i在增大的过程中跳过某些值,以此加速|zi|→0的过程,将迭代次数减小至最低.当i→∞时zi→0,此时的xi和yi为cosφ和sinφ的精确值,但实际的迭代次数是有限的,假设迭代次数为N.浮点数格式下忽略舍入误差,CORDIC的精度是由角度误差Δφ确定的.取相同的角度误差Δφ引起的正弦逼近误差为正弦的2阶导数为-sinx,∀x∈(0,π/4]其2阶导数小于0,Φyerr(φ)单调递减,由此可得最大误差出现在Φyerr(0)=sin(Δφ),同理可得∀x∈(0,π/4]余弦函数的最大逼近误差为Φxerr(π/4)= cos(π/4)-cos(π/4+Δφ).设精度要求为误差上限不大于f,且sin(Δφ)> cos(π/4)-cos(π/4+Δφ),由此可确定迭代终止的条件为max(θi)取不大于φ-αm的最大基本角度即可,同时取min(θi)≤Δφ以满足精度要求.3.2 求迭代次数上限由文献[8]可知,对于b位二进制小数下的CORDIC,当i ≥(b-log23)/3时,令θi=arctan2-i≈2-i不影响计算精度.由于实际旋转的目标角度较小,本文选取的i范围满足上述要求.若e满足则迭代次数的首次加1必定发生在[X+2-e,X+2-e+1]区间内,X为基本角度的线性组合.[0,2-e]范围内迭代次数为由0增大到1,[2-e,2-e+1]范围内迭代次数由1增加到2,[2-e+2+2-e,2-e+2+2-e+1]范围内迭代次数由2增大到3.根据规律提出以下假设:当N≥3时,迭代次数由N-1增大到N发生在以下区间上.以归纳法证明.当N=3时已证明成立,假设当N=s(s≥3)时仍成立,且区间A上的最大迭代次数为s.图1中则迭代次数由s-1增大到s发生在区间[L,M]中.由于4H、2H和H均为基本角度{θi≈2-i}中的元素,故角度2H、4H和角度H一样,可由一次旋转得到;且区间B、D长度与A相同,故除第一次旋转外,区间B、D上的剩余旋转与A相同,即区间B、D上的最大迭代次数为s.区间C、D上的迭代关于4H对称,所选基本角度相同,只是δi不同,因此区间C上的最大迭代次数仍为s. 最大迭代次数由s增大到s+1发生在区间[P,Q]上,此时相对于区间[L,M]多了一次旋转4H,且P、Q满足即N=s+1时假设仍成立,故对于N≥3假设均成立.在选定{θi}的情况下,最大迭代次数和区间长度正相关,当满足如下不等式时最大迭代次数为N-1.若将[0,π/4]等分为15个区间,此时αm+1-αm=π/60rad,精度要求在10-6数量级可得Δφ≈10-5rad,据此取5≤i≤18,根据式(6)得出e=15.由式(10)可得此时最大迭代次数为7,当φ-αm单调递增时,最早出现在区间内.3.3 MATLAB仿真验证在MATLAB中对本文提出改进型CORDIC算法和传统的CORDIC算法进行迭代,每隔10-6rad取一个点,可遍历{θi}在[0,π/4]内所有组合结果,并在角度误差不大于Δφ的情况下完成对[0,π/4]内任一角度的迭代.由图2可得本文提出的CORDIC算法迭代次数不超过7次,大部分集中在6次及以下,和式(10)得出的结果相同;传统的CORDIC算法最大迭代次数为16,且N大多集中在10次及以上.图2的下半部分给出了根据计算结果画出的余弦曲线和正弦误差,其幅值误差最大值为9.955×10-6.文献[7]提出的高基混合CORDIC算法达到n位精度需要的迭代次数为「3n/8+1⎣,误差为10-6量级时需要迭代大于9次,误差小于2×10-5时需要迭代大于8次;文献[6]的迭代分三级共24次.故本文提出的CORDIC算法在迭代次数上明显优于文献[6]和[7].MATLAB的计算是基于单精度浮点数,而在FPGA中进行浮点数的运算需要消耗大量的硬件资源;使用定点数会带来额外的舍入误差及其累积和传递,且定点数的乘法消耗的资源也较多.因此需要进行误差计算并重新考虑校正的方法.以下的分析均基于小数位宽为b的定点数.4.1 移位/减法进行校正校正因子{ki}是i的离散单调增函数,当i ≥5时满足0.999512076087079≤ki<1.设其二进制值为其中aj∈{0,1},传统的校正可表示为其中(xi)j表示xi右移j位的结果.由于满足条件的ki非常接近1,故aj=1的个数远大于aj=0的个数,进行乘法校正时部分积数目较大,耗费较多资源的同时也带来很大的延时[9];同理,若以移位/加法进行校正需要加法器的个数接近b.本文采用移位/减法的方式进行校正,取2-l≈1-ki,当满足1≤l<b时将待校正的xi右移l位得(xi)l,xi= xi- (xi)l为校正后的结果;yi同理.若l ≥b则(xi)l视为0,即ki≈1,可不进行校正,此时只需要1个减法器.由表1可知这种近似带来的误差很小.4.2 误差的计算式(12)表示校正后的第n+1次迭代,0≤n≤N-1.设本次迭代所选基本角度为θi,tanθi=2-i,此时校正因子为ki.算法最终计算结果的误差由3部分组成:(1)有限位宽带来的舍入误差Δx0、Δy0及其累积和传递的结果ΔxN、ΔyN;(2)以1-2-l近似ki带来的误差Δki;(3)迭代终止时Δφ带来的逼近误差.在矩阵模式下可表示为由多元函数的系统误差公式可得[10]其中Δxn为n次迭代舍入误差的累积值.同理可得根据文献[11]给出的公式,再考虑校正因子的误差可得舍入误差传递后的上限为其中其行列式的值满足且由式(14)~(18)得迭代最终误差如式(20)所示,将相应数值代入得其最大值不超过2×10-5.4.3 FPGA仿真与实测图3详细描述了本文提出的改进型CORDIC算法运算框图.在复位信号无效的情况下,累加器在时钟上升沿对频率控制字从-π开始进行累加,为保证相位的连续性,当累加结果溢出时将结果减去2π,累加器的输出送至区间压缩模块.将[-π,π]等分为8个区间,按照映射函数将[0,π/4]之外的角度压缩至[0,π/4][12].迭代完成后根据输入角度所在区间和三角函数的变换公式进行输出变换,结果输出到DAC.图4为Modelsim仿真所得输入角度(test-theta)、所在区间(interval)和正弦(sinvalue)余弦(cosvalue)波形,从图中可以看到相位的线性增加和溢出后减去2π再累加,interval信号的变化指示了输入角度所处区间,最后输出两路正交的正余弦信号.为完整表示[-π,π]内的角度,累加器进行运算时使用的是24位数据,包括1位符号位、3位整数位和20位小数位;压缩后的弧度制整数位为0,采用22位数据,包括1位符号位、1位整数位和20位小数位.将Modelsim仿真的数据导出,在Matlab中计算出20位定点小数下的误差如图5所示.由图5可得,误差的变化具有周期性,这是因为第二步旋转的起始角度φ-αm是周期变化的,最大误差均发生在迭代次数最多时,此时Δx0、Δy0累积和传递达到最大.由于Φyerr单调递减,Φxerr单调递增,故正弦的最大误差总体在减小,余弦的最大误差总体在增大,但两者的最大幅度均不超过2×10-5,符合计算结果.在[0,π/4]内φ相同时Δφ对余弦引起的误差总是小于正弦,故余弦函数的误差总体上小于正弦误差. 本设计电路的实现采用VHDL语言描述,FPGA型号为Xilinx公司Virtex5系列XC5VLX30,图6为实际输出波形.表2列出了本文设计与文献[5]和文献[6]的主要性能的对比,其中输出延时为FPGA实测数据.由于减小了迭代次数,本文提出的CORDIC算法精度最高,输出延时基本达到并行CORDIC算法的水平,运算速度比多级迭代的文献[6]有较大提高;且硬件资源消耗和文献[5]相比有所减少.本文提出的改进型CORDIC算法从以下两个方面减小迭代次数:(1)基于表驱动法一次旋转至输入角度附近,减小目标旋转角度的大小;(2)选取和剩余未旋转角度绝对值最相近的基本角度进行迭代,加速z→0的过程.迭代次数的减小降低了输出延迟,提高了速度;同时降低了舍入误差的传递和累积,提高了正余弦幅度精度.并通过移位/减法实现幅度校正,减少校正时加法器的使用数量,控制总的资源消耗.计算和实测结果表明,在硬件消耗未增加的情况下,本文提出的CORDIC算法在迭代次数、精度和速度等方面优于传统设计.史方显(通信作者) 男,1992年10月出生于安徽淮南.北京航空航天大学硕士研究生,研究方向为VHDL数字VLSI设计及FPGA在航天电子系统中的应用.E-mail:******************.cn曾立男,1976年8月出生于湖南邵阳.清华大学博士,北京航空航天大学副教授,研究方向为为空间环境仪器科学与工程.E-mail:**************.cn【相关文献】[1]Tierney J,Rader C M,Gold B.A digital frequency synthesizer[J].IEEE Transactions on Audio and Electroacoustics,1971,19(1):48-57.[2]Yang W,Hao M.A direct digital frequency synthesizer based on CORDIC algorithm implemented with FPGA[A].Proceedings of the 5th International Conference onASIC[C].Beijing,China:IEEE,2003.2:832-835.[3]Han W,Yousi Z,Xiaokang L.A parallel double-step CORDIC algorithm for digital down converter[A].2009 7th Annual Communication Networks and Services Research Conference (CNSR)[C].Moncton,BC,Canada:IEEE,2009.257-261.[4]Volder J E.The CORDIC trigonometric computing technique[J].IRE Transactions on Electronic Computers,1959,Ec-8(3):330-334.[5]祁艳杰,刘章发.基于Parallel-CORDIC的高精度高速度直接数字频率合成器的FPGA实现[J].电子学报,2014,42(7):1392-1397. QI Yan-jie,LIU Zhang-fa.FPGA implementation of high speed and high precision direct digital frequency synthesizer based on parallel-CORDIC[J].Acta Electronica Sinica,2014,42(7):1392-1397.(in Chinese)[6]Xin R,Zhang X,Li H,et al.An area optimized direct digital frequency synthesizer based on improved hybrid CORDIC algorithm[A].3rd International Workshop on Signal Design and Its Applications in Communications[C].Chengdu,China:IEEE,2007.243-246.[7]Shukla R,Ray K C.Low latency hybrid CORDIC algorithm[J].IEEE Transactions on Computers,2014,63(12):3066-3078.[8]Chuang T P,Huang C C,Hsiao S F.Design of a CORDIC-based SIN/COS intellectual property (IP) using predictable sign bits[A].Proceedings of the 27th European Solid-State Circuits Conference[C].Villach,Austria:IEEE,2001.277-280.[9]Han L,Ko S B.High-speed parallel decimal multiplication with redundant internal encodings[J].IEEE Transactions on Computers,2013,62(5):956-968.[10]Fei Yetai.Error Theory and Data Processing[M].Beijing:Higher Education Press,2010.66-74.(in Chinese)[11]Hu Y H.The quantization effects of the CORDIC algorithm[J].IEEE Transactions on Signal Processing,1992,40(4):834-844.[12]Maharatna K,Banerjee S,Grass E,et al.Modified virtually scaling-free adaptive CORDIC rotator algorithm and architecture[J].IEEE Transactions on Circuits and Systems for Video Technology,2005,15(11):1463-1474.。

基于CORDIC算法的改进型数字信号解调

基于CORDIC算法的改进型数字信号解调

基于CORDIC算法的改进型数字信号解调【摘要】软件无线电信号处理中,信号的解调处理直接影响通信质量,本文提出了一种应用CORDIC(coordinate rotation digital compute,坐标旋转数值计算)算法的数控振荡器,通过仿真证明了该方法可以有效的提高效果,具有较高的应用价值。

【关键词】软件无线电;CORDIC算法;解调0 引言软件无线电是近年现代通信技术的一个重要研究领域,其基本思想是:将宽带A/D变换尽可能的靠近射频天线,即尽可能早地将接收到的模拟信号数字化,最大程度的通过软件来实现电台的各种功能。

通过运行不同的算法,软件无线电可以事实的配置信号波形,是其能够提供各种语言编码、新星导调职、载波频率、加密算法等无线电通信业务。

在数字通信系统中,由于基带信号不适合在无线信道中传输,所以在远距离通信和无线移动通信系统中,通常要先采用数字调制技术把基带信号变换成频带信号,然后再进行传输,在接收端,要把频带信号解调成数字基带信号再进行基带处理,所以调制解调的质量直接影响了通信的质量。

1 一般数字信号解调图1表示了信号数字化解调的一般实现框图:图1 信号数字化解调的一般实现框图数控振荡器NCO的目标就是产生一个频率可变的正弦波样本:S(n)=cos(2π··n),(n=0,1,2…)式中:fLO为本地振荡频率;fs为输入信号的抽样频率,在软件无线电超高速信号采样频率的情况下,传统的NCO用查表法产生正弦波样本,即事先根据各个NCO正弦波相位计算好相位的正弦波样本,即事先根据各个NCO正弦波相位计算好相位的正弦值,并按相位角度作为地址存储该相位的正弦值数据。

工作时,每输入一个信号的采样样本,NCO就增加一个2π·相位增量,按照∑2π×相位累加角度作为地址,检查地址上的数值并输出到数字混频器,与信号样本相乘,乘积样本再经低通滤波后输出,这样就完成基带处理前的信号变换。

基于CORDIC的旋转变压器解码算法研究

基于CORDIC的旋转变压器解码算法研究

yn =
r sin kn
( 2)
zn 0
定向模式是直角表示向极化表示的转换, 已知的初始
条件为 x 0 = x , y0 = y , z 0 = 0, 旋转方向由 y i 控制,
- 1 y > 0 ( 逆时针旋转)
di = - sgn( yi ) = 1
y < 0 ( 顺时针旋转)
定向模式的最终结果用下列方程表示:
Decoding algorithm of resolvers based on CORDIC
Song Xiaomei Zhu Hui W ang W enjing ( S chool of Elect ronics & Inf ormat ion, X i an Polyt echni c U nivers it y, X i an 710048)
1 旋转变压器的基本原理
旋转变压器[4] ( 简称旋变) 是一种输出电压随转子转 角变化的信号元件。当励磁绕组以一定频率的交流电压 励磁时, 输出绕组的电压幅值与转子转角成正、余弦函数 关系, 或保持某一比例关系, 或在一定转角范围内与转角 成线性关系。
按输出电压与转子转角间的函数关系, 旋转变压器主 要分 3 类: 正余弦旋转变压器、线性旋转变压器、比例式旋 转变压器。在本文中介绍的解码算法主要是针对正余弦 旋转变压器, 如图 1 所示。
宋晓梅 等: 基于 CORDIC 的旋转变压器解码算法研究
第6期
r 1 = U0sin t 1 , r2 = U0sin t 2 , 如图 5 所示, 而 r 变化只是 对模长的大小发生了改变, 对角度解码没有任何影响, 旋 变信号的解码, 只要得到的是正确的角度值, 模长的大小 可以不做考虑。

cordic算法简明

cordic算法简明

初次接粗坐标旋转算法,感觉有些茫然。

如果你和我一样,请一步步听我讲解。

如上图如图中,直角坐标系中点(X0,Y0)逆时钟旋转角度θ,变换成坐标(X1,Y1),那么用X0,Y0,以及θ的三角函数,如果表示X1,Y1呢?请想象,如果坐标也旋转角度θ,那么X1,Y1的坐标依然是(X0,Y0)。

接着往下看:看完以上这副图,就该明白这个等式了:x1= x0cos θ− y0sin θy1= x0sin θ + y0cos θ再把这个式子化成正切函数。

Cordic 算法的思想是通过迭代的方法,不断的旋转特定的角度,使得累计旋转的角度的和无限接近某一设定的角度,每次旋转的角度的θ = arctan( 1/(2^n) );具体迭代如下表:Z0 =30°,Y0=0,X0 = 0.6073输入30°,经过9次迭代后,Z0 = 0,Y0=0.5006,X0 = 0.8657x '(i +1)= ( x 'i− y 'i(σi)2−i)y '(i +1)= ( x 'i(σi)2−i+ y 'i)(当i = 0)x '1= 0.607 − 0 ⋅ (+1 ) ⋅ 1 = 0.607y '1= 0.607 ⋅ (+1 ) ⋅ 1 + 0 = 0.607通过Cordic算法后,得到y9=0.5006 (=sin(30°))x9=0.8657 (=cos(30°))所以也可以用cordic算法求出正切值的。

或者求反正切值:计算公式:我的理解:CORDIC算法三要素(x i,y i,z i),分别代表坐标和角度(1)当需要求正余弦值时,角度z i=30已知,假定初始坐标为(1,0),通过旋转去靠近30度。

拟合完成时,此时输出的(x i+1,y i+1)就是所要求的cos30,sin30的值;(2)当需要求反正切值时,角度z i未知,(x0,y0)=(1,1),通过旋转令y i=0,即向x轴旋转靠近,当拟合完成时,此时输出的z i就是要求的反正切值。

CORDIC算法简介

CORDIC算法简介

CORDIC 算法简介CORDIC 算法是一种旋转坐标的方法.设起点坐标为(1)(1)(,)x y ,终点坐标为(2)(2)(,)x y 。

由三角函数知识,得到旋转后的新坐标为(2)(1)(1)(1)(1)(2)(1)(1)(1)(1)cos sin cos (tan )sin cos cos (tan )x x y x y yx y x y θθθθθθθθ=-=-=+=+把cos θ去掉后相当于把旋转后矢量的模减小了,为了保证最终的结果正确,一般在结果的后面乘上一个系数K 。

如果把θ约束成tan 2(0,1,2,)i i L θ-==,则正切项的乘法就变成了简单的二进制的移位运算,没旋转一次,i 加1,由于在/2~/2ππ-内,无论θ正负,cos θ始终是正值,因而可以讲上式改为11(tan )(tan )i i i i i i i i x K x y y K y x θθ++=-⎧⎨=+⎩其中,cos(arctan 2)1/1i i i K d -===±(当逆时针旋转时1i d =+,顺时针旋转时1i d =-)。

又因为(1)1arctan 2arctan 2arctan 22i i i --+-><所以arctan 22i i π∞-=>∑事实上arctan 299.883ii ∞-=>∑也就是说,假设我们从X 轴开始旋转,通过一些列逐次减少的角度旋转后,只要迭代的次数足够多,就可以实现/2~/2ππ-内任意角度的旋转,并且通过加法和移位运算得到目的的横坐标和纵坐标。

每次旋转后得到的实际矢量和目标矢量之间的误差角度(目标角度减去实际角度)如下式:1[arctan 2]i i i Z Z -+=其中,0Z 为目标矢量角度,若0i Z <,则1i d =+。

实际迭代后累计角度为:1[arctan 2]i i i i a a d -+=+其中,00a =。

基于CORDIC算法的双曲正余弦函数FPGA实现

基于CORDIC算法的双曲正余弦函数FPGA实现
收稿日期:2009-10-18;修回日期:2009-12-15 基金项目:中国工程物理研究院重大预研资助项目(重大预研-05)
y1
V1 ( x1 , y1 )
θ
x
x2
x1
Fig.1 Schematic of CORDIC algorithm
图 1 CORDIC 算法原理示意图
212
信息与电子工程
第8卷
本文为了兼顾算法的实时性,在 FPGA 实现时将迭代次数设为 8 次。CORDIC 迭代算法的流水线实现方法如
( ) 图 3 所示。图中,“>>1”表示向右移 1 位,Cn 为常数,即每次微小旋转的角度 θi ,为:C1 = artanh 2−1 ≈ 0.549 306 , C2 = ( ) ( ) ( ) ( ) artanh 2−2 ≈ 0.255 413 , C3 = artanh 2−3 ≈ 0.125 657 , C4 = artanh 2−4 ≈ 0.062 582 , C5 = artanh 2−4 ≈ 0.062 582 , C6 = ( ) ( ) ( ) artanh 2−5 ≈ 0.031 260 , C7 = artanh 2−6 ≈ 0.015 626 , C8 = artanh 2−7 ≈ 0.007 813 。
0.1
0.2
calculation error calculation error
0
0
-0.1
-0.2
-0.2
-0.4
-0.3
-0.6
-0.4
-0.8
0
5
10
15
0
5
10
15
number of iterations
number of iterations

cordic算法实现

cordic算法实现

CORDIC 的算法实现CORDIC 运算就是执行一个平面旋转,如下图所示,就是从一个向量转换到另一个向量.向量(Xi,Yi)的平面旋转用矩阵表示为⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡i i j j Y X Y X θθθθcos sin sin cos (1)旋转角度可以通过迭代运算分为多步执行,每一步完成旋转的一部分.单步表述为:⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡++n n n n n n n n Y X Y X θθθθcos sin sin cos 11(2)方程(2)提取COS 后变成⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡++n n n n n n n Y X Y X 1tan tan 1cos 11θθθ (3)方程(3)相比于(2)的4次相乘只需要3次,另外乘法可以通过选择如TANGEN 表示为2的次方的角度来消除乘法运算.2的次方的乘法或者除法运算可以用简单的移位来实现. 每一步的角度表示为⎪⎭⎫⎝⎛=n n 21arctan θ (4)旋转的角度:∑∞==0n nn S θθ(5)其中{}1;1+-=n S(6) n θtan 表示为n n n S -=2tan θ(7)结合(3)和(7)得到⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡--++n n nn n n n n n Y X S S Y X 1221cos 11θ (8)削去n θcos 系数,这一运算被简化成少量简单的移位和加法来实现.系数通过预先计算来消YX(Xj, Yj)(Xi, Yi)θ除. 第一步,重建系数 ⎪⎪⎭⎫⎝⎛⎪⎭⎫ ⎝⎛=n n 21arctan cos cos θ (9)第二步,计算方程(9),得所有的’n ’,记为K607253.021arctan cos 10≈⎪⎪⎭⎫⎝⎛⎪⎭⎫ ⎝⎛==∏∞=n n P K (10)K 是一个常数(给初始向量以及旋转角度的所有值),是一个非离散的常数,派生参数P 的定义也是因为需要经常使用. 用公式表示确却的计算:()()⎩⎨⎧+=-=θθθθsin cos sin cos i i ji i j X Y K Y Y X K X (11)代入K,方程(8)变成⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡-=⎥⎦⎤⎢⎣⎡--++n n n n n n n n Y X S S Y X 122111 (12)或者⎩⎨⎧+=-=-+-+nnn n n nn n n n X S Y Y Y S X X 212122 (13)此时引入一个新的变量’Z ’,表示未旋转的角度∑=+-=ni i n Z 01θθ(14)Sn 表示Zn 的符号⎩⎨⎧≥+<-=0101n n n Z if Z if S (15)结合(5),(15)可以减少未旋转的角度到0,用伪代码表示为 For n=0 to [inf] If (Z(n) >= 0) then Z(n + 1) := Z(n) – atan(1/2^n); Else Z(n + 1) := Z(n) + atan(1/2^n); End if; End for;Arctan(1/2^i)是一个预先计算好的值,形成一个查找表的形式,[inf]为需要的迭代次数,每一位需要1次(16轮的迭代将产生16位的结果),如果加入X,Y 的计算,用伪代码的表示如下: For n=0 to [inf] If (Z(n) >= 0) then X(n + 1) := X(n) – (Yn/2^n);Y(n + 1) := Y(n) + (Xn/2^n); Z(n + 1) := Z(n) – atan(1/2^n); Else X(n + 1) := X(n) + (Yn/2^n); Y(n + 1) := Y(n) – (Xn/2^n); Z(n + 1) := Z(n) + atan(1/2^n); End if; End for;使Z 趋向于0,[]()()()()()()[]0,sin cos ,sin cos ,,i i i i i i i i j j jZ X Z Y P Z Y Z X P Z Y X+-=存在一种特殊情况:60725.01≈==K PX i 0=i Y θ=i Z[][]0,sin ,cos ,,θθ=j j jZ Y X另一个就是使Y 趋向于0[]⎥⎦⎤⎢⎣⎡⎪⎪⎭⎫ ⎝⎛++=i i i i i j j j X Y Z Y X P Z Y Xarctan ,0,,,22 这存在两种特殊的情况:1)X X i = Y Y i = 0=i Z[]⎥⎦⎤⎢⎣⎡⎪⎪⎭⎫ ⎝⎛+=i ii i jj jX Y Y X P Z Y Xarctan ,0,,,22 2)1=i X a Y i = 0=i Z[]()[]a a P Z Y Xj j jarctan ,0,1,,2+=由上面的分析,来讨论SINE,COSINE 的实现.用上面提到的第一种假设[]()()()()()()[]0,sin cos ,sin cos ,,i i i i i i i i j j jZ X Z Y P Z Y Z X P Z Y X+-=使用以下值作为输入60725.06467.111≈==P X i 0=i Y θ=i Z=>[][]0,sin ,cos ,,θθ=j j jZ Y XZ 的值从-180DEG 到+180DEG ,可以将角度表示为0x8000 = –180degrees 0xEFFF = +80degrees其他的输入输出数值范围都是在-1到+1, )(4)(19898215hex DBA dec P Xi ==∙=举例如下: 计算30DEG 的SINE,COSINE:)(1555)(5461303602deg 303602deg 12deg 360161616hex dec =≈∙≡≡≡那么CORDIC 运算就是要计算Z=X ”1555”,的SINE,COSINE.Sin : 16380(dec) = 3FFC(hex) Cos : 28381(dec) = 6EDD(hex)输出范围在-1到+1,可以通过以下计算来得到:4999.01638020.1163800.121515=∙≡≡ 8661.0283812.1283810.121515=∙≡≡ 所以,30度的SINE 值是0.4999,COSINE 值是0.8661,相比于理论值,存在很小的误差.在提供的代码中Ain 就是量化后的角度输入,而输出则是量化后的SINE,COSINE 输出,量化的计算采用上面提供的方法.。

基于CORDIC算法的高速ODDFS电路设计

基于CORDIC算法的高速ODDFS电路设计

随着现代通信的高速发展,高精度的正交三角信号广泛应用在频率转换电路中。

目前产生正交三角信号的主要的方法是使用直接数字频率合成器(Direct Digital FrequencySynthesizer ,DDFS )。

DDFS 中频率控制字提供周期性的相位数字序列,在参考时钟的作用下这些相位作为地址信号来读取存储在ROM 中三角函数的波形幅度值。

然而,随着存储的波形数据和地址信号位数不断增加的,电路会消耗大量的硬件资源。

文中采用CORDIC 算法代替ROM 储存表结构,并实现正弦和余弦正交三角的函数信号电路。

1CORDIC 算法简介CORDIC 算法是J.E.Volder 在进行航天飞行控制系统设计时提出[1],它是一种迭代算法,在实现过程中利用移位和加法运算来代替乘法运算,因此特别适合于硬件实现。

假设初始向量OW 1(x ,y )旋转θ角度后得到向量OW 2(x 1,y 1),如图1所示。

由三角函数得:x 1=x cos θ-y sin θy 1=x cos θ+y sin θ(1)假设经过i 次旋转后角度为θi ,x i +1和y i +1分别为:x i +1=x i cos θi-y isin θiy i +1=x icos θi+y isin θi(2)对θi 进行一定的限制[2-3],令tan θi =2-i ,即θi =arctan2-i 。

旋转角度的总和θ=∞i =0Σd i θi,当d i=+1时表示向量逆时针旋转,d i=-1时表示向量顺时针旋转。

K i 为伸缩因子,表示每次旋转时向量模长发生的变化。

K i =cos (arctan2-i )=11+2-2i姨(3)如果位宽一定,旋转次数趋于无穷大时,总的伸缩因子图1向量旋转θ角度Fig.1Vector rotation θangle基于CORDIC 算法的高速ODDFS 电路设计戈华,聂阳(集宁师范学院物理系,内蒙古集宁012000)摘要:为了满足现代高速通信中频率快速转换的需求,基于坐标旋转数字计算(CORDIC ,Coordinate Rotation DigitalComputer )算法完成正交直接数字频率合成(ODDFS ,Orthogonal Direct Digital Frequency Synthesizer )电路设计方案。

FPGA之CORDIC算法实现_理论篇(上)

FPGA之CORDIC算法实现_理论篇(上)

FPGA之CORDIC算法实现_理论篇(上)关于cordic的算法原理核⼼思想就是规定好旋转⾓度,然后通过不停迭代逐步逼近的思想来实现数学求解,⽹上关于这部分的资料⾮常多,主要可以参考:Xinlinx⾃带的官⽅说明⽂档也⾮常值得参考,⽂章末尾会补充相关参考资料。

1、cordic的优化算法:1)2)第⼀次旋转,为旋转⽅向3)第⼆次旋转,为旋转⽅向式⼦⼀直都会有和,每次都可以提取。

虽然FPGA⽆法计算,但,因此可以执⾏和效果相同的移位操作来取代。

对于,可以预先全部提取出来,然后等待迭代结束之后,再把因为简化计算过程抽出的还原回去即可。

2、公式总结:提取,2-i等效替换成1)2)3)迭代过程:i从0开始迭代,假设当时,趋向于0(i从0⾄n-1),得到点,此时点就近似等于之前假设的点,此时将之前抽出的还原回去。

进⼀步将式⼦转化,可得注意:,的极值为1,因此当i的次数很⼤,的值趋于⼀个常数。

3、求解sina,cosa的起点取值问题设起点(x0,y0),当i = n-1时,迭代结束,到达终点(xn, yn), 因为中间⽤了伪旋转,所以结果必须要乘以为了简化计算过程抽出的,因此有观察上⾯的式⼦,我们的⽬标是根据迭代后的xn、yn求出sina,cosa,因此可设可将(1)化简得到上式中的xn,yn是经过迭代后的结果,⽽不是之前⼀开始假设的点(xn,yn),要注意区分这⼀点。

因此,我们可以观察到,最后正余弦的求解仅仅是以初始点的设置以及的值有关,可以预先通过matlab求解预存起来,⼀般经过16次的迭代后就逐渐趋于稳定。

下⼀篇,我会接着来讲⽤FPGA来实现这个Cordic算法。

cordic算法matlab实例

cordic算法matlab实例

cordic算法matlab实例% 111111111111111111111111111111111111111111111111 m=1;u=1;K=1.6468;a=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ];y0=0;x0=1/K;angle = 30;z0=angle*pi/180;for i=1:length(a)x=x0-m*u*y0*2^(-a(i));y=y0+u*x0*2^(-a(i));z=z0-u*atan(2^(-a(i)));x0=x;y0=y;z0=z;u=sign(z0);endcosine = x;sine = y;% 0000000000000000000000000000000000000000000000000function [sin,cos] =cordic(angle);% 初始化x = 1;y = 0;z = angle;a = 0;d = 1;k = 0.6073; %K 增益x = k*x;while a<100 %此处不能判断d的符号控制循环,会死循环.应用a 次数控制.if z >=0d=1;elsed=-1;end%迭代xNew=x;x=xNew-(y*d*(1/2^a));y=y+(xNew*d*(1/2^a));z=z-(d*(atan(1/2^a)));a=a+1;endcos= xsin= y%%%%%%%%以cos(a)/sin(a)计算为例,m = 1, x(0) = 1, y(0) = 0, z(0) = a, s(k) = sign(z(k)),移位序列q(1,k): 0, 1, 2, ..., 递进角度为d(k)=arctan(2^-q(1,k)) 。

下面是实现的Matlab程序(保存为m文件):function [sin,cos] =cordic(angle);% 初始化x = 1;y = 0;z = angle;a = 0;d = 1;k = 0.6073; %K 增益x = k*x;while a<100 %此处不能判断d的符号控制循环,会死循环.应用a 次数控制.if z >=0d=1;elsed=-1;end%迭代xNew=x;x=xNew-(y*d*(1/2^a));y=y+(xNew*d*(1/2^a));z=z-(d*(atan(1/2^a)));a=a+1;endcos= xsin= yk值为cos(arctan(1)), cos(arctan(2^-1)), ..., cos(arctan(2^-K) 的连积值,收敛为0.6072529350。

快速算法之CORDIC算法坐标转换

快速算法之CORDIC算法坐标转换

快速算法之CORDIC算法坐标转换功能:直⾓坐标转换为极坐标原理: 利⽤⾓度旋转与查找来进⾏快速计算....⼤家可以参考:我的⽂笔不好,实在没法⼦写那样多!还是代码来的好!上代码吧:#define MAX_ITERATION (13)double cordic_scale[13] = { 1,0.5,0.25,0.125,0.0625,0.03125,0.015625,0.0078125,0.00390625,0.001953125,0.000976463,0.000488281,0.000244141};int cordic_ang_i[13] = { 46080,// 45.0000000000,27203,// 26.5650511771,14373,// 14.0362434679,7296,// 7.1250163489,3662,// 3.5763343750,1833,// 1.7899106082,917,// 0.8951737102,458,// 0.4476141709,229,// 0.2238105004,115,// 0.1119056771,57,// 0.0559528919,29,// 0.027*******,14// 0.0139882271};double cordic_ang_d[13] ={45.0000000000,26.5650511771,14.0362434679,7.1250163489,3.5763343750,1.7899106082,0.8951737102,0.4476141709,0.2238105004,0.1119056771,0.0559528919,0.027*******,0.0139882271};void cordic_int_core(int &oldX,int &oldY,int &z,int depth){int d;if (oldY>=0){d = -1;}else{d = +1;}int newX;int newY;if (d>0){//newX = oldX - oldY*cordic_scale[depth];//newY = oldY + oldX*cordic_scale[depth];newX = oldX - (oldY>>depth);newY = oldY + (oldX>>depth);z = z - cordic_ang_i[depth];}if (d<0){newX = oldX + (oldY>>depth);newY = oldY - (oldX>>depth);z = z + cordic_ang_i[depth];}oldX = newX;oldY = newY;}void cordic_double_core(double &oldX,double &oldY,double &z, int depth ) {int d;if (oldY>=0){d = -1;}{d = +1;}double newX;double newY;if (d>0){newX = oldX - oldY*cordic_scale[depth];newY = oldY + oldX*cordic_scale[depth];z = z - cordic_ang_d[depth];}if (d<0){newX = oldX + oldY*cordic_scale[depth];newY = oldY - oldX*cordic_scale[depth];z = z + cordic_ang_d[depth];}oldX = newX;oldY = newY;}void cordic_int(int x, int y, double &R, double &A, int size ){x=x<<size;y=y<<size;int Angle = 0;for (int i=0; i<MAX_ITERATION; i++){cordic_int_core(x,y,Angle,i);}x=x>>size;y=y>>size;R = x*0.607252941; //此处需转化为2的倍数A = Angle/1024.0;}void cordic_double(double x, double y, double &R, double &A ) {double Angle = 0;for (int i=0; i<MAX_ITERATION; i++){cordic_double_core(x,y,Angle,i);}R = x*0.607252941;A = Angle;}int main(int argc, char* argv[]){int x = 10;int y = 10;int s = 3;double zR,zA;zR = 0.0;zA = 0.0;cordic_double(x, y, zR, zA);printf("double [%12.6f %9.5f] \n", zR, zA);double R,A;// for (int i=0; i<10; i++){R = 0.0;A = 0.0;// s = i;cordic_int(x, y, R, A, s);printf(" int [%12.6f %9.5f] s= %d %9.5f %9.5f\n", R, A, s, (zR - R)/zR, (zA - A)/zA); }return 0;}。

基于CORDIC算法的平方根计算模块的Verilog实现

基于CORDIC算法的平方根计算模块的Verilog实现

例2-28 基于CORDIC算法的平方根计算模块的Verilog实现。

① MATLAB代码为了便于读者理解,首先用MATLAB实现计算sqrt(x2+y2)的Cordic算法,代码如下:function Xout = mysqrt (x, y);K = 8;An = 1;for i =1: Ka(i) = 1/(2^(i));An =An*sqrt(1+1/(4^i));end%anger = atan(a); %计算出的角度theta = 0;for i = 1:Ksigma = -sign(y);x = x - sigma*y/(2^i);y = y + sigma*x/(2^i);% z = z - sigma*a(i);endXout= x/An;经过测试,上述程序可利用Cordic算法来计算输入数据平方和的根。

② Verilog代码module mysqrt(clk, x, y, fout, fy);input clk;input [15:0] x;input [15:0] y;output [15:0] fout;output [15:0] fy;reg [15:0] fout;reg [15:0] fy;//采用8级流水线来实现wire [15:0] x1, y1 ,x2, y2, x3, y3, x4, y4, x5, y5;wire [15:0] x6, y6 ,x7, y7, x8, y8;//reg [15:0] xtemp, ytemp;reg addx1, addx2, addx3, addx4, addx5, addx6, addx7, addx8; reg addy1, addy2, addy3, addy4, addy5, addy6, addy7, addy8;always @(posedge clk) beginxtemp <= x;ytemp <= y;fout <= x8;fy <= y8;if(ytemp[15] == 0) beginaddx1 <= 1;addy1 <= 0;endelse beginaddx1 <= 0;addy1 <= 1;endif(y1[15] == 0) beginaddx2 <= 1;addy2 <= 0;endelse beginaddx2 <= 0;addy2 <= 1;endif(y2[15] == 0) beginaddx3 <= 1;addy3 <= 0;endelse beginaddx3 <= 0;addy3 <= 1;endif(y3[15] == 0) beginaddx4 <= 1;addy4 <= 0;endelse beginaddx4 <= 0;addy4 <= 1;endif(y4[15] == 0) beginaddx5 <= 1;addy5 <= 0;endelse beginaddx5 <= 0;addy5 <= 1;endif(y5[15] == 0) begin addx6 <= 1;addy6 <= 0;endelse beginaddx6 <= 0;addy6 <= 1;endif(y6[15] == 0) begin addx7 <= 1;addy7 <= 0;endelse beginaddx7 <= 0;addy7 <= 1;endif(y7[15] == 0) begin addx8 <= 1;addy8 <= 0;endelse beginaddx8 <= 0;addy8 <= 1;endend//第1次迭代模块addandsub addandsub1x(.A(xtemp),.B({ytemp[15],ytemp[15:1]}),.ADD(addx1),.Q(x1),.CLK(clk));addandsub addandsub1y(.A(ytemp),.B({xtemp[15],xtemp[15:1]}),.ADD(addy1),.Q(y1),.CLK(clk));//第2次迭代模块addandsub addandsub2x(.A(x1),.B({{2{y1[15]}},y1[15:2]}), .ADD(addx2),.Q(x2),.CLK(clk));addandsub addandsub2y(.A(y1),.B({{2{x1[15]}},x1[15:2]}), .ADD(addy2),.Q(y2),.CLK(clk));//第3次迭代模块addandsub addandsub3x(.A(x2),.B({{3{y2[15]}},y2[15:3]}), .ADD(addx3),.Q(x3),.CLK(clk));addandsub addandsub3y(.A(y2),.B({{3{x2[15]}},x2[15:3]}), .ADD(addy3),.Q(y3),.CLK(clk));//第4次迭代模块addandsub addandsub4x(.A(x3),.B({{4{y3[15]}},y3[15:4]}), .ADD(addx4),.Q(x4),.CLK(clk));addandsub addandsub4y(.A(y3),.B({{4{x3[15]}},x3[15:4]}), .ADD(addy4),.Q(y4),.CLK(clk));//第5次迭代模块addandsub addandsub5x(.A(x4),.B({{5{y4[15]}},y4[15:5]}), .ADD(addx5),.Q(x5),.CLK(clk));addandsub addandsub5y(.A(y4),.B({{5{x4[15]}},x4[15:5]}), .ADD(addy5),.Q(y5),.CLK(clk));//第6次迭代模块addandsub addandsub6x(.A(x5),.B({{6{y5[15]}},y5[15:6]}), .ADD(addx6),.Q(x6),.CLK(clk));addandsub addandsub6y(.A(y5),.B({{6{x5[15]}},x5[15:6]}), .ADD(addy6),.Q(y6),.CLK(clk));//第7次迭代模块addandsub addandsub7x(.A(x6),.B({{7{y6[15]}},y6[15:7]}), .ADD(addx7),.Q(x7),.CLK(clk));addandsub addandsub7y(.A(y6),.B({{7{x6[15]}},x6[15:7]}),.ADD(addy7),.Q(y7),.CLK(clk));//第8次迭代addandsub addandsub8x(.A(x7),.B({{8{y7[15]}},y7[15:8]}),.ADD(addx8),.Q(x8),.CLK(clk));addandsub addandsub8y(.A(y7),.B({{8{x7[15]}},x7[15:8]}),.ADD(addy8),.Q(y8),.CLK(clk));endmodule上述程序的RTL级结构如图比较复杂,这里就不再给出。

原创采用汇编在STM32上实现cordic计算对数

原创采用汇编在STM32上实现cordic计算对数

【原创】在STM32上采用汇编实现CORDIC算法计算对数张十上简介cordic算法(坐标旋转算法)是一种快速计算方法,通过移位和加减等简单的运算,能够在数字计算机系统上高效快速的实现正余弦等三角函数、指数、对数诸多复杂的计算。

cordic算法经常运用在FGPA 等可编程逻辑器件中计算三角函数,然而,cordic算法不仅仅局限于使用在FPGA上,也可以运用于像C51、AVR以及最近普遍流行的STM32等单片机上面。

在单片机上实现cordic算法的目的在于加速三角函数、指数和对数的计算速度,最大限度的发挥单片机处理数据的能力。

通常大家习惯于采用C语言在单片机上实现旋转算法,采用C语言的好处是移植性好,但是其运行效率始终是无法和汇编语言媲美的。

为了进一步提高单片机的处理效能,今天与大家分享一种在STM32F103(基于CORTEX-M3内核)上采用汇编程序实现64位定点cordic算法来计算对数的方法,这种方法提高了STM32计算对数、指数以及三角函数的性能,大大的缩短了计算时间。

采用该算法的程序可应用到FFT变换后的幅值对数计算,以压缩较大范围的幅值变化。

主要特征有●定点运算●输入、输出以及所有内部变量都采用64位数值来计算●输入范围:1/2^27--68719476734.999999992549419403076●6次负迭代、29次正迭代●不超过1.3e-8的误差●完全迭代耗时26us;减小到14次正迭代耗时14.2us一、坐标旋转算法坐标旋转算法的英文全称是Coordinate Rotation Digital Computer,根据其字面意思可以知道这是一种图形计算方法,最早可追溯到1959年由J.Volder发表的一篇论文。

受当时电子计算机性能的限制,这种计算方法最先应用于导航系统,解决了采用查三角函数表、开方、乘法等常规方法计算速度慢的问题。

CORDIC 算法的核心思想就是通过设定初始坐标,然后通过坐标旋转把预设坐标旋转到目标坐标上去,在旋转过程中发生的角度累加、矢量伸缩等变量的变化可以反应出一个具体的值得变化,这个值就是我们要计算的诸如三角函数、对数、指数、开方、除法等复杂的算式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if z >=0
d=1;
else
d=-1;
end
%迭代
xNew=x;
x=xNew-(y*d*(1/2^a));
y=y+(xNew*d*(1/2^a));
z=z-(d*(atan(1/2^a)));
a=a+1;
end
cos= x
sin= y
%%%%
%%%%
以cos(a)/sin(a)计算为例,m = 1, x(0) = 1, y(0) = 0, z(0) = a, s(k) = sign(z(k)),移位序列q(1,k): 0, 1, 2, ..., 递进角度为d(k)=arctan(2^-q(1,k)) 。
下面是实现的Matlab程序(保存为m文件):
function [sin,cos] =cordic(angle);
% 初始化
x = 1;
y = 0;
z = angle;
a = 0;
d = 1;
k = 0.6073; %K 增益
x = k*x;
while a<100 %此处不能判断d的符号控制循环,会死循环.应用a次数控制.
以cosh(a)/sinh(a)计算为例,m = -1, x(0) = 1, y(0) = 0, z(0) = a, s(k) = sign(z(k)),移位序列q(-1,k): 1, 2, 3, 4, 4, 5, ... (3n+1重复两次以保证收敛, 4, 13, 40, ...), 递进角度为d(k)=arctanh(2^-q(-1,k)) 。
% 111111111111111111111111111111111111111111111111
m=1;
u=1;
K=1.6468;
a=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ];
y0=0;
x0=1/K;
angle = 30;
z0=angle*pi/180;
z=z0-u*atan(2^(-a(i)));
x0=x;
y0=y;
z0=z;
u=sign(z0);
end
cosine = x;
sine = y;
通过对初始值和旋转方向s(k) 的选择,模式m=0可以计算乘法和除法; 模式m=1可以计算sin/cos/arcsin/arccos/arctan; 模式m=-1可直接计算sinh/cosh/exp/arctanh/ln/sqrt, 间接计算arcsinh/arccosh.
MATLAB 代码实现2:
for i=1:length(a)
x=x0-m*u*y0*2^(-a(i));
y=y0+u*x0*2^(-a(i));
z=z0-u*atan(2^(-a(i)));
x0=x;
y0=y;
z0=z;
u=sign(z0);
end
cosine = x;
sine = y;
% 0000000000000000000000000000000000000000000000000
if z >=0
d=1;
else
d=-1;
end
%迭代
xNew=x;
x=xNew-(y*d*(1/2^a));
y=y+(xNew*d*(1/2^a));
z=z-(d*(atan(1/2^a)));
a=a+1; 来自end cos= x
sin= y
k值为cos(arctan(1)), cos(arctan(2^-1)), ..., cos(arctan(2^-K) 的连积值,收敛为0.6072529350。
function [sin,cos] =cordic(angle);
% 初始化
x = 1;
y = 0;
z = angle;
a = 0;
d = 1;
k = 0.6073; %K 增益
x = k*x;
while a<100 %此处不能判断d的符号控制循环,会死循环.应用a次数控制.
m=1;
u=1;
K=1.6468;
a=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ];
y0=0;
x0=1/K;
angle = 30;
z0=angle*pi/180;
for i=1:length(a)
x=x0-m*u*y0*2^(-a(i));
y=y0+u*x0*2^(-a(i));
相关文档
最新文档