CORDIC算法原理及matlab仿真
CORDIC算法原理及实现

图4.1 圆坐标系旋转
CORDIC算法原理 --圆坐标系旋转原理
上面的方程组同样可写成矩阵向量形式:
x2 cos y sin 2 sin x1 y cos 1
例如一个90o相移为:
x2 0 1 x1 - y1 y 1 0 y x 1 1 2
x (i 1) x (i ) y (i ) di 2 i y (i 1) y (i ) x (i ) d i 2 i z (i 1) z (i ) d i e (i )
1
z
(0)
通过设定x(0)=1和z(0)=0来计算tan-1y(0)。向量模式 中,判决算子di 满足下面条件:
d i sign ( x (i ) y (i ) )
因此 我们输入x(0)和y(0)(z(0)=0),并通过迭代使y(0) 取值趋近于0。
CORDIC算法原理 --向量模式
CORDIC算法原理 --圆坐标系旋转原理
前面所示的伪旋转现在可以表示为(对每次迭代):
x (i 1) x (i ) d i (2 i y (i ) )
(4.7) 在这里引入第三个方程,被称为角度累加器,用来在 每次迭代过程中追踪累加的旋转角度: z (i 1) z (i ) d i (i ) (4.8) 这里:di=±1。符号di是一个判决算子,用于确定旋转的方向。 上述三个方程式为圆周坐标系中用于角度旋转的CORDIC算法的 表达式。在本章的后续部分中我们还将看到CORDIC算法被用于其 它的坐标系,通过使用这些坐标系可以执行更大范围的函数计算。
CORDIC算法原理 --圆坐标系旋转原理
CORDIC算法实现cosh和sinh计算

w x0 = 1/w; y0 = 0; z0n = -1.1182:0.001:1.1182; n = length(z0n); p1 = zeros(1,n); p2 = zeros(1,n); %% Cordic cosh and sinh for k = 1:n
z0 = z0n(k); x = zeros(1,iter); y = zeros(1,iter); z = zeros(1,iter);
图 2- 1
图 2- 2
扩展的 Cordic 实现:
% Expanding Hyperbolic and Rotation Mode % x = w*(x0*cosh(z0) - y0*sinh(z0)) % y = w*(y0*cosh(z0) + x0*sinh(z0)) % Condition: x0 = 1/w y0 = 0;
其中,
Hale Waihona Puke i = 1,2,3,4,4...N
if z(i) >= 0
d = 1;
else
d = -1;
end
输入的条件是: x0 = 1/w y0 = 0, abs(z0) <=1.1182
输出的结果是: x = w*(x0*cosh(z0) - y0*sinh(z0))
y = w*(y0*cosh(z0) + x0*sinh(z0))
%% Compare The Result figure;plot(1:n,p1);title('err-cosh'); figure;plot(1:n,p2);title('err-sinh');
图 2- 3 图 2- 4
3. sysgen 实现
CORDIC算法

xi 1 1 cos i y i 1 tani
tani xi xi yi tani cos i y 1 x tan y i i i i
每次旋转角度θ正切值都为2的倍数,则第i次旋转角tanθi=2-i
由表格可知,第一次迭 代45,第二次迭代26.56,第三次迭代 14.03...... 45 26.56 14.03 7.12 3.58...... 99.8 在- 99.8 , 99.8范围内都可以旋转,超 出范围可以用三角恒等 变换之后再使用
xi 1 R y 因为 sin( i ) i 1 R xi 1 R y sin( i ) sin( ) cos( i ) cos( ) sin( i ) i 1 R cos( i ) cos( ) cos( i ) sin( ) sin( i )
通过去除公因式cosθ可以得到伪旋转方程 y x tan( ) y 1 对比可知每次旋转的角度是正确的,但模值增大了 cos
i 1 i i
xi 1 x i yi tan( i )
i
注意:并不能通过数学方法去除cosθ,但是去除cosθ可以简化坐标 平面旋转的计算操作
假设初始向量经过N次旋转之后得到新向量,且每次旋转角度θ正 切值都为2的倍数, 则第i次旋转旋转角tan i 2i , 按照这样的法则,
xi 1 R cos( ) cos(i ) R sin( ) sin(i ) yi 1 R sin( ) cos(i ) R cos( ) sin(i )
带入可得: xi 1 x i cos(i ) yi sin(i ) cos(i )x i yi tan( i ) yi 1 yi cos(i ) x i sin(i ) cos(i )x i tan( i ) yi
CORDIC算法实现sin和cos

扩展的 Cordic 算法是将 i=0 计算三次,可以增大输入的范围 输入的条件是:z0 = [0,pi] 输出的结果是:y/2 = sin(z0),x/2 = cos(z0)
2. Matlab 实现
传统的 Cordic 算法实现:
(1-1)
% Cordic Sin and Cos :Circular and Rotation Mode
图 2- 3 图 2- 4
3. sysgen 实现
% y = sin(z0); x = cos(z0)
% Condition: z0 = [0,pi/2]
%
x0 = 1/k (k = 1.646760258) y0 = 0
clc; clear; close all;
N = 11; x0 = 1/1.646760258; y0 = 0; z0n = 0:pi/1000:pi/2; n = length(z0n); p1 = zeros(1,n); p2 = zeros(1,n);
if zt1 >= 0 d = 1;
else d = -1;
end xt2 = xt1 - yt1*d*2^0; yt2 = yt1 + xt1*d*2^0; zt2 = zt1 - d*atan(2^0);
if zt2 >= 0 d = 1;
else d = -1;
end xt3 = xt2 - yt2*d*2^0; yt3 = yt2 + xt2*d*2^0; zt3 = zt2 - d*atan(2^0);
clc; clear; close all;
N = 11; x0 = 1/1.646760258; y0 = 0; z0n = 0:pi/1000:pi; n = length(z0n); p1 = zeros(1,n); p2 = zeros(1,n);
cordic算法求角度的verilog实现 -回复

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算法的改进型数字信号解调【摘要】软件无线电信号处理中,信号的解调处理直接影响通信质量,本文提出了一种应用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算法原理与实现引言概述在计算机科学和数学领域,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仿真

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))从而可以看出,对于移动的角度θ,现在只需要硬件加减法器和移位器就可以算出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.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)等的重要组成部分,同时也是决定其性能的主要因素之一,随着芯片集成度的提高、在信号处理、数字通信领域、调制解调、变频调速、制导控制、电力电子等方面得到越来越广泛的应用。