CORDIC算法原理及matlab仿真
- 格式:doc
- 大小:49.50 KB
- 文档页数:4
cordic算法求角度的verilog实现-回复Cordic算法,全称为Coordinate Rotation Digital Computer算法,是一种用于计算三角函数以及其它相关函数的数值方法,它以固定点运算和迭代的方式实现高效的角度计算。
在本文中,我们将详细解释Cordic算法的原理,并给出一个Verilog的实现。
一、Cordic算法的原理Cordic算法是通过将一个向量旋转到目标角度来求角度的方法。
具体而言,Cordic算法使用一个旋转矩阵,通过一系列迭代将原始向量旋转到目标角度。
在每一次迭代中,算法会根据当前向量的角度与目标角度的差值,选择旋转矩阵中的一个旋转角度,将当前向量旋转一定的角度。
二、Cordic算法的基本流程Cordic算法的基本流程如下:1. 初始化:将初始向量以及目标角度设置为输入参数;2. 迭代计算:通过一系列的迭代,将原始向量旋转到目标角度;3. 输出结果:将最终的向量的角度作为输出结果。
三、Cordic算法的迭代计算在Cordic算法的迭代计算中,每一次迭代都会选择一个旋转角度,并将当前向量旋转到该角度。
为了提高计算效率,Cordic算法中使用了一种近似的旋转角度,称为Cordic常数。
四、Cordic常数的计算Cordic常数是在Cordic算法中用于近似旋转角度的固定常数。
Cordic常数的计算是一个关键的步骤,通常使用二进制表示法进行计算。
Cordic 常数可以根据所需的精度和性能来调整,一般越精确的结果会需要更多的迭代次数。
五、Cordic算法的Verilog实现下面是Cordic算法的Verilog实现的基本代码框架:verilogmodule cordic(input [N-1:0] x_in,input [N-1:0] y_in,input [M-1:0] angle_in,output [N-1:0] x_out,output [N-1:0] y_out);定义Cordic常数parameter M = 32; Cordic常数的位宽parameter [M-1:0] c = ; Cordic常数的值定义迭代次数parameter K = ; 迭代次数定义内部变量reg [N-1:0] x_internal;reg [N-1:0] y_internal;always *begin初始化内部变量x_internal = x_in;y_internal = y_in;迭代计算for (i = 0; i < K; i = i + 1)beginif (y_internal > 0)beginx_internal = x_internal + (y_internal >> i);y_internal = y_internal - (x_internal >> i);angle_in = angle_in - c[i];endelsebeginx_internal = x_internal - (y_internal >> i);y_internal = y_internal + (x_internal >> i);angle_in = angle_in + c[i];endendendassign x_out = x_internal;assign y_out = y_internal;endmodule六、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(Coordinate Rotation Digital Computer)算法是一种用于计算旋转和坐标转换的迭代算法。
由Jack E. Volder于1959年提出,CORDIC算法以其高效、简单的特性在数字信号处理、图形学和通信等领域得到了广泛应用。
本文将深入探讨CORDIC算法的原理和实现,揭示其在现代计算中的重要性。
正文内容1. CORDIC算法的基本原理1.1 旋转向量的基本概念CORDIC算法的核心思想是通过迭代旋转一个向量,使其逐步趋近于目标向量。
这里,向量旋转可以通过一系列坐标变换和旋转操作来完成。
在CORDIC中,旋转角度通常是一个固定的、预先设定的角度,如45度或30度。
1.2 坐标旋转的迭代过程CORDIC算法通过一系列迭代步骤,逐渐调整向量的坐标,使其最终趋近于目标向量。
每一步迭代都包括一个旋转和坐标调整操作,通过这种方式,算法能够在有限次迭代后收敛到所需的结果。
1.3 旋转因子的选择与优化CORDIC算法中,旋转因子的选择对算法的性能有着重要影响。
通过合理选择旋转因子,可以使得迭代过程更快速、更精确。
优化旋转因子的选择是CORDIC算法在不同应用中取得高性能的关键。
1.4 旋转模式与运算精度CORDIC算法支持不同的旋转模式,包括旋转、缩放和坐标转换等。
在应用中,需要根据具体问题选择合适的旋转模式。
此外,算法的运算精度也受到迭代次数的影响,需要权衡计算速度和精度。
1.5 硬件实现与软件实现CORDIC算法可以通过硬件电路实现,也可以通过软件编程实现。
硬件实现通常能够提供更高的运算速度,而软件实现更加灵活,适用于不同的计算平台。
选择合适的实现方式取决于具体应用的要求和硬件资源的可用性。
2. CORDIC算法的应用领域2.1 数字信号处理在数字信号处理领域,CORDIC算法常被用于计算旋转和相位调制等操作。
CORDIC算法原理及matlab仿真.1、坐标旋转数字计算机CORDIC坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如Sin,Cos,Sinh,Cosh等函数,由J. Volder于1959年提出,首先用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。
J. Walther 在1974年用它研究了一种能计算出多种超越函数的统一算法。
1.2、CORDIC原理如图所示,初始向量(X(0),Y(0))旋转θ角度之后得到向量(X1,Y1),此向量有如下关系:CORDIC算法X1=X0*cos(θ)-Y0*sin(θ)=cos(θ)(X0-Y0*tan(θ))Y1=Y0*cos(θ)+X0*sin(θ)=cos(θ)(Y0+X0*tan(θ))注:θ为待求角假设初始向量经过N次旋转之后得到新向量,且每次旋转角度δ正切值都为2的倍数,则第i次旋转角度为δ=arctan(2^(-i)),即cosδ=(1/(1+2^(-2i)))^0.5。
容易得到角度θ≈∑S(i)●δ(i),其中S(i)=1或-1,表示旋转角度的方向,第i步旋转可以表示为:X(i+1)=((1/(1+2^(-2i)))^0.5)●(X(i)-S(i)Y(i)2^(-i))Y(i+1)=((1/(1+2^(-2i)))^0.5)●(Y(i)+S(i)X(i)2^(-i))其中(1/(1+2^(-2i)))^0.5)称为校模因子,当旋转次数一定时,趋于一个常数,Π(1/(1+2^(-2i)))^0.5)≈0.6073这样,算法每一步就可以简化为:X(i+1)=0.6073●(X(i)-S(i)Y(i)2^(-i))Y(i+1)=0.6073●(Y(i)+S(i)X(i)2^(-i))从而可以看出,对于移动的角度θ,现在只需要硬件加减法器和移位器就可以算出结果。
CORDIC算法原理
在旋转模式下,CORDIC算法通过迭代计算旋转角度来逼近目标函数
的值。
具体而言,它使用的是一组预设的旋转角度,这些角度可以通过查
表或者计算得到。
在每一次迭代中,CORDIC算法根据目标函数的符号,
选择旋转角度的正负,并对当前矢量进行旋转。
然后,它通过调整旋转角
度的系数,逼近目标函数的值。
在矢量模式下,CORDIC算法通过将目标函数转换为旋转问题,然后
再对矢量进行旋转来逼近目标函数的值。
具体而言,它使用的是一个旋转
因子向量,这个向量的元素取决于目标函数和旋转角度。
在每一次迭代中,CORDIC算法选择矢量的旋转方向,并通过调整旋转因子向量的系数,逼
近目标函数的值。
然而,CORDIC算法也有一些缺点。
首先,它的收敛速度相对较慢,
因此在需要高精度计算的场合下,可能需要大量的迭代次数。
其次,CORDIC算法对算法的设计和实现要求较高,需要对旋转角度和旋转因子
的选择有一定的经验。
总的来说,CORDIC算法通过将目标函数转换为旋转问题,并通过一
系列旋转操作来逼近目标函数的值,实现了高效的三角函数和超越函数的
计算。
虽然它具有一定的缺点,但在许多应用领域中仍然被广泛应用。
cordic算法求角度的verilog实现【原创实用版】目录1.引言2.CORDIC 算法的原理3.CORDIC 算法的 Verilog 实现4.仿真结果与分析5.结论正文1.引言CORDIC(Coordinate Rotation Digital Computer,坐标旋转数字计算机)算法是一种使用简单的移位、加法和查表运算来计算任意角度的算法。
该算法在数字信号处理、图像处理和通信系统等领域具有广泛的应用。
本文主要介绍了一种基于 Verilog 硬件描述语言实现 CORDIC 算法求角度的方法,并对其进行了仿真验证。
2.CORDIC 算法的原理CORDIC 算法的基本思想是将角度的计算分解为坐标轴旋转和查表两个步骤。
首先,根据给定的角度,计算出旋转方向和旋转次数。
然后,通过查表得到每次旋转所需的坐标轴偏移量。
接着,根据旋转次数和偏移量,依次进行坐标轴旋转。
最后,根据旋转后的坐标轴位置,得到所求角度。
3.CORDIC 算法的 Verilog 实现CORDIC 算法的 Verilog 实现主要包括模块的定义、输入输出端口声明、状态机的设计以及仿真测试等内容。
其中,模块的定义主要包括角度计算模块、坐标旋转模块和查表模块。
输入输出端口声明主要包括角度输入、旋转方向输入、旋转次数输出和角度输出等。
状态机的设计主要根据CORDIC 算法的原理,实现角度计算、坐标旋转和查表等功能。
仿真测试则用于验证 CORDIC 算法的正确性和性能。
4.仿真结果与分析通过对 CORDIC 算法的 Verilog 实现进行仿真测试,可以得到不同角度输入下的旋转次数输出和角度输出。
仿真结果表明,该实现能够正确计算出给定角度的旋转次数和角度值,具有较高的精度和稳定性。
此外,通过对比不同输入角度下的仿真结果,可以分析 CORDIC 算法的性能,如计算速度、资源占用等。
5.结论本文介绍了一种基于 Verilog 硬件描述语言实现 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算法原理CORDIC算法原理。
CORDIC算法是一种用于计算三角函数、双曲函数和其他复杂函数的算法,它可以在不使用乘法器和除法器的情况下进行高效的计算。
CORDIC算法的全称是Coordinate Rotation Digital Computer,即坐标轮换数字计算机。
它最初是由Volder 在1959年提出的,用于计算超宽带信号处理中的正弦和余弦函数。
CORDIC算法在数字信号处理、通信系统、图像处理、雷达系统、全局定位系统(GPS)等领域得到了广泛的应用。
CORDIC算法的原理非常简单,它利用一系列的旋转和缩放操作来逼近目标函数的值。
通常情况下,CORDIC算法使用一个旋转因子K,通过不断地迭代旋转和缩放操作,最终得到目标函数的值。
CORDIC算法的核心思想是将复杂的函数计算问题转化为简单的旋转和缩放操作,从而实现高效的计算。
在CORDIC算法中,旋转和缩放操作是通过一系列的迭代步骤来实现的。
在每一步迭代中,输入数据会被旋转一个固定的角度,同时进行缩放操作,直到达到预先设定的精度要求。
通过不断地迭代旋转和缩放操作,最终得到目标函数的值。
CORDIC算法的迭代步骤非常简单,只需要进行加法、减法和移位操作,因此可以在不使用乘法器和除法器的情况下进行高效的计算。
在实际应用中,CORDIC算法通常用于计算三角函数和双曲函数。
以计算正弦函数为例,CORDIC算法可以通过一系列的旋转和缩放操作来逼近正弦函数的值。
首先,输入数据会被旋转一个固定的角度,然后进行缩放操作,不断地迭代直到达到预先设定的精度要求。
通过这种方式,可以高效地计算出正弦函数的值,而且不需要使用乘法器和除法器。
除了计算三角函数和双曲函数,CORDIC算法还可以用于解决其他复杂的函数计算问题。
例如,在数字信号处理中,CORDIC算法可以用于计算复数的幅度和相位,从而实现高效的信号处理。
在通信系统中,CORDIC算法可以用于计算信号的相位调制和解调制,提高系统的性能和效率。
采用Cordic算法求余弦函数的仿真结果如下:
将采用不同迭代次数的cordic仿真结果与双精度的cos函数结果进行对比。
图中蓝色曲线表示用于对照的双精度cos函数结果,绿色曲线是cordic算法迭代的结果,红线曲线是两者误差。
由下图可以看出,随着迭代次数的增加,cordic的精度越来越高,最大误差由4次迭代时的0.122496降低到16次迭代时的0.005029
类似地,也可以方便的得出cordic算法的sine函数仿真结果
需要特别说明的是,但其并不是单调的,中间迭代结果可能比后续迭代结果误差更小。
随着迭代次数n的逐步增大,结果逐步收敛。
下面的例子显示了5次迭代的结果比6次迭代结果
的cos值,第5次迭代结果误差为0.00020393,第6次迭代结果误差为更加精确。
对于/5
0.01776952。
误差的条形图如下:
Cordic算法的迭代过程如下图所示:。
cordic旋转迭代算法Cordic旋转迭代算法是一种常用于计算机数学运算的算法,它可以高效地计算三角函数和其他复杂的数学函数。
本文将介绍Cordic算法的原理、应用以及优缺点,并探讨其在现代计算机中的应用前景。
一、Cordic算法的原理Cordic算法全名为Coordinate Rotation Digital Computer,是由Jack E. Volder在1959年提出的一种迭代算法。
该算法通过旋转坐标系中的向量来近似计算三角函数和其他复杂的数学函数。
Cordic算法的原理是将一个向量通过一系列旋转操作,使其旋转到目标角度。
具体而言,Cordic算法通过不断迭代地将向量旋转到目标角度,并在每次迭代中调整向量的长度,直到达到所需的精度。
Cordic算法的优点是简单、高效。
它不依赖于查表或级数展开等复杂的数学运算,只需要一些简单的移位和加减操作即可实现。
因此,Cordic算法在资源有限的嵌入式系统中得到了广泛应用。
二、Cordic算法的应用Cordic算法最常见的应用之一是计算三角函数。
通过不断迭代调整向量的角度和长度,Cordic算法可以高效地计算正弦、余弦和反正切等三角函数的值。
这在信号处理、图像处理、通信系统等领域都有广泛的应用。
Cordic算法还可以用于计算其他复杂的数学函数,如指数函数、对数函数等。
通过将复杂的函数转化为三角函数的组合,再利用Cordic算法计算三角函数的值,可以高效地计算出这些复杂函数的近似值。
三、Cordic算法的优缺点Cordic算法的优点主要体现在以下几个方面:1. 简单高效:Cordic算法只需要简单的移位和加减操作,不依赖于复杂的数学运算,因此实现起来非常简单高效。
2. 精度可控:Cordic算法可以通过控制迭代次数来控制计算的精度,可以在计算精度和计算速度之间进行权衡。
3. 适用性广泛: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算法原理作者:曹剑英刘凌云来源:《赤峰学院学报·自然科学版》 2014年第7期曹剑英,刘凌云(集宁师范学院物理系,内蒙古乌兰察布 012000)摘要:CORDIC算法根据不同的旋转轨迹分成线性系统、圆周系统和双曲系统;每个系统又有旋转模式和向量模式两种,本文详细地来阐述CORDIC的算法原理和实现不同的运算,给初学者一些参考.关键词:坐标旋转算法;CORDIC算法;原理中图分类号:O241文献标识码:A文章编号:1673-260X(2014)04-0021-031 CORDIC算法原理1.1 算法推导[1]CORDIC算法是一种旋转坐标的方法.设起点坐标为P0=(x(1),y(1)),旋转?兹角度,得到终点坐标,设为Pn=(x(2),y(2)),如图 1所示.由三角函数知识,旋转后的坐标由式(1-1)计算得到当n趋于无穷大时,An的极限值约为1.647.在实现CORDIC算法时,由于An当作系统的处理增益不做处理,因此只需要移位、相加运算就可完成矢量旋转,很适合在FPGA中实现[2].2 CORDIC算法引申及模型以上所作的Cordic理论分析,只是Cordic算法提出时的理论雏形;之后,John Walther 于1971年对其进行了扩展引申,进一步的完备了Cordic算法,得到以下Cordic的迭代模型[2].2.6 CORDIC算法小结当m取不同的值时,可以得到CORDIC的三种不同计算方式,在各个计算方式下,通过多次迭代,可以计算得到多个函数的值,比如三角函数、双曲函数以及开方运算等.表2描述了线性系统、圆周系统和双曲系统在旋转和向量模式下的迭代结果.参考文献:〔1〕孔德元.针对正弦余弦计算的CORDIC算法优化及其FPGA实现[D].中南大学硕士论文,2008.1-3.〔2〕J. E. Volder. The CORDIC trigonometric computing technique [J]. IRE Trans. on Electron. Computers, vol. EC-8, 1959.330-334.〔3〕Xiaobo Hu, Ronald G. Harber, and Steven C. Bass, Expanding the Range of Convergence of the CORDIC Algorithm, IEEE Trans. on Computers, [J].vol.40, no.1, 1991 .Jan.P.13-P.21.〔4〕曹剑英.M倍降速递归流水线技术实现正切余切函数[J].通信技术,2013(05).。
cordic算法的实现结构
CORDIC算法是一种用于计算各种数学函数(如三角函数、指数函数、对数函数等)的迭代算法。
该算法可以在硬件和软件上高效实现,并且不需要存储预先计算的值或使用外部函数库。
CORDIC算法的基本原理是使用迭代的方式逼近所需函数的值。
在每次迭代中,算法通过一系列简单的加法、减法和移位操作来更新计算值。
CORDIC算法的实现结构可以根据具体的应用场景和性能要求进行选择。
以下是几种常见的CORDIC算法实现结构:
1. 串行结构:串行结构是最简单的CORDIC算法实现方式。
在这种结构中,每次迭代只处理一个数据样本,并依次进行迭代直到达到所需的精度。
由于每次迭代都需要计算所有的函数值,因此串行结构需要大量的计算资源。
2. 并行结构:并行结构是一种更高效的CORDIC算法实现方式。
在这种结构中,多个数据样本同时进行迭代,并且每个迭代步骤都由不同的计算单元完成。
这种结构可以显著减少计算时间,但需要更多的硬件资源。
3. 并行流水线结构:并行流水线结构是一种折衷的CORDIC算法实现方式。
在这种结构中,多个数据样本同时进行迭代,但每个迭代步骤都由相同的计算单元完成。
这种结构可以在硬件资源有限的情况下获得较好的性能。
无论选择哪种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算法。
.1、坐标旋转数字计算机CORDIC
坐标旋转数字计算机CORDIC(COordinate Rotation DIgital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如Sin,Cos,Sinh,Cosh等函数,由J. Volder于1959年提出,首先用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。
J. Walther 在1974年用它研究了一种能计算出多种超越函数的统一算法。
1.2、CORDIC原理
如图所示,初始向量(X(0),Y(0))旋转θ角度之后得到向量(X1,Y1),此向量有如下关系:
CORDIC算法
X1=X0*cos(θ)-Y0*sin(θ)=cos(θ)(X0-Y0*tan(θ))
Y1=Y0*cos(θ)+X0*sin(θ)=cos(θ)(Y0+X0*tan(θ))
注:θ为待求角
假设初始向量经过N次旋转之后得到新向量,且每次旋转角度δ正切值都为2的倍数,则第i次旋转角度为δ=arctan(2^(-i)),即cosδ=(1/(1+2^(-2i)))^0.5。
容易得到角度θ≈∑S(i)●δ(i),其中S(i)=1或-1,表示旋转角度的方向,第i步旋转可以表示为:
X(i+1)=((1/(1+2^(-2i)))^0.5)●(X(i)-S(i)Y(i)2^(-i))
Y(i+1)=((1/(1+2^(-2i)))^0.5)●(Y(i)+S(i)X(i)2^(-i))
其中(1/(1+2^(-2i)))^0.5)称为校模因子,当旋转次数一定时,趋于一个常数,Π(1/(1+2^(-2i)))^0.5)≈0.6073
这样,算法每一步就可以简化为:
X(i+1)=0.6073●(X(i)-S(i)Y(i)2^(-i))
Y(i+1)=0.6073●(Y(i)+S(i)X(i)2^(-i))
从而可以看出,对于移动的角度θ,现在只需要硬件加减法器和移位器就可以算出结果。
引入Z,表示i次旋转后相位累加的部分和,则:
Z(i+1)=Z(i)-S(i)arctan(2^(-i))
经过n次旋转之后,Z→0,即与目标角重合,即:
X(n)=X1=X0*cos(θ)-Y0*sin(θ)
Y(n)=Y1=Y0*cos(θ)+X0*sin(θ)
1.3、三角函数的计算
以sin/cos计算为例,可利用正/余弦的和角公式递归进行:
cos(a+b) = cos(a)cos(b) –sin(a)sin(b) = cos(a) [cos(b) –tan(a)sin(b)] sin(a+b) = sin(a)cos(b) + cos(a)sin(b) = cos(a) [tan(a)cos(b) +sin(b)] 取a=arctan(2^-k), 即tan(a)=2^-k, 则cos(b) – tan(a)sin(b) 可通过移位和减法来实现。
如果角度z可以表示为z = s0 arctan(2^0) + s1 arctan(2^-1) + ... + sn arctan(2^-n), 其中s0, s1, ..., sn取+1或-1(+1可以理解为逆时针转角,即加上一个角度; -1则相反) ,那么角度z的sin/cos计算可以通过一系列的移位和加减运算来实现。
注意到cos(sk arctan(2^-k))=cos(arctan(2^-k)) 与转角方向无关。
此外,z应取第一项限角度(收敛域),对於其他项限角度,可由其第一项限对应角度变换得到。
相类似地,sinh/cosh的计算利用以下公式:
cosh(a+b) = cosh(a)cosh(b) + sinh(a)sinh(b) = cosh(a) [cosh(b) +
tanh(a)sinh(b)]
sinh(a+b) = sinh(a)cosh(b) + cosh(a)sinh(b) = cosh(a) [tanh(a)cosh(b) + sinh(b)]
取a=arctanh(2^-k), 即tanh(a)=2^-k, 则cosh(b) + tanh(a)sinh(b) 可通过移位和减法来实现。
如果参数z可以表示为z = s1 arctanh(2^-1) + s2 arctanh(2^-2) + ... + sn arctanh(2^-n), 其中s1, s2, ..., sn取+1或-1 ,那么z的sinh/cosh计算可以通过一系列的移位和加减运算来实现。
z应取[-ln2, ln2]范围内的值,否则应先预处理z = z’– pln2, 求得
cosh(z’)/sinh(z’)的值,则
cosh(z) = cosh(z’)cosh(pln2) + sinh(z’)sinh(pln2) = ½[cosh(z’) + sinh(z’)]2^p + ½[cosh(z’) –sinh(z’)]2^-p
sinh(z) = sinh(z’)cosh(pln2) + cosh(z’)sinh(pln2) = ½[cosh(z’) + sinh(z’)]2^p + ½[sinh(z’) –cosh(z’)]2^-p 。
sin/cos和sinh/cosh的计算是CORDIC算法的两个特例,CORDIC算法可描述如下:
给定初始值x(0), y(0), z(0),
x(k+1) = x(k) –ms(k)y(k)2^-q(m,k), y(k+1) = y(k) + s(k)x(k) 2^-q(m,k), z(k+1) = z(k) – s(k)d(k),
其中m表示模式,q(m,k) 为移位序列,s(k) 取+1或-1表示旋转方向,d(k) 为递进角度。
1.4、CORDIC的MATLAB 运算
以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;
z = angle;
a = 0;
d = 1;
k = 0.6073; %K 增益
x = k*x;
while a<100 %此处不能判断d的符号控制循环,会死循环.应用a次数控制.
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。
以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)) 。
通过对初始值和旋转方向s(k) 的选择,模式m=0可以计算乘法和除法;模式m=1可以计算sin/cos/arcsin/arccos/arctan; 模式m=-1可直接计算
sinh/cosh/exp/arctanh/ln/sqrt, 间接计算arcsinh/arccosh,参见[1]。
MATLAB 代码实现2:
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;
u=sign(z0);
end
cosine = x;
sine = y;
编辑本段现实意义
由于具有频率精度高、转换时间短、频谱纯度高以及频率相位易编程等特点,数控振荡器(NCO)被广泛应用于软件无线电数字上、下变频以及各种频率和相位数字调制解调系统中。
NCO传统的实现方法主要有查表法、多项式展开法或近似法,但这些方法在速度、精度、资源方面难以兼顾。
而采用CORDIC算法来实现超函数时,则无需使用乘法器,它只需要一个最小的查找表(LUT),利用简单的移位和相加运算,即可产生高精度的正余弦波形,尤其适合于FPGA的实现。
数字控制振荡器(NCO,numerical controlled oscillator)是软件无线电、直接数据频率合成器(DDS,Direct digital synthesizer)、快速傅立叶变换(FFT,Fast Fourier Transform)等的重要组成部分,同时也是决定其性能的主要因素之一,随着芯片集成度的提高、在信号处理、数字通信领域、调制解调、变频调速、制导控制、电力电子等方面得到越来越广泛的应用。