matlab迭代算法实例_CORDIC算法详解(四)CORDIC 算法之双曲系统及其数学应用

2023-05-16

CORDIC算法详解(四)- CORDIC 算法之双曲系统及其数学应用

文章目录

  • CORDIC算法详解(四)- CORDIC 算法之双曲系统及其数学应用

  • 4 CORDIC 算法之双曲系统及其数学应用

    • 4.1 CORDIC 算法之双曲系统

    • 4.2 CORDIC 算法之双曲系统数学应用

    • 4.3 CORDIC 算法之双曲系统MATLAB代码

      • MATLAB 代码 3-7 function: cordic_hr

      • MATLAB 代码 3-8 function: cordic_hr_it

    •   结果


  网上有很多类似的介绍,但是本文会结合实例进行介绍,尽量以最简单的语言进行解析。
  CORDIC ( Coordinate Rotation Digital Computer ) 是坐标旋转数字计算机算法的简称,
由 Vloder• 于 1959 年在设计美国航空导航控制系统的过程中首先提出[1], 主要用于解决导航系统中三角函数、 反三角函数和开方等运算的实时计算问题。 1971 年, Walther 将圆周系统、 线性系统和双曲系统统一到一个 CORDIC 迭代方程里 , 从而提出了一种统一的CORDIC 算法形式[2]。
  CORDIC 算法应用广泛, 如离散傅里叶变换 、 离散余弦变换、 离散 Hartley 变换、Chirp-Z 变换、 各种滤波以及矩阵的奇异值分解中都可应用 CORDIC 算法。 从广义上讲,CORDIC 算法提供了一种数学计算的逼近方法。 由于它最终可分解为一系列的加减和移位操作, 故非常适合硬件实现。 例如, 在工程领域可采用 CORDIC 算法实现直接数字频率合成器。 本节在阐述 CORDIC 算法三种旋转模式的基础上, 介绍了利用 CORDIC 算法计算三角函数、 反三角函数和复数求模等相关理论。 以此为依据, 阐述了基于 FPGA 的 CORDIC 算法的设计与实现及其工程应用。


整个系列分别从圆周系统、 线性系统和双曲系统及硬件实现进行分析,如下:

CORDIC算法详解(一)- CORDIC 算法之圆周系统之旋转模式( Rotation Mode )CORDIC算法详解(二)- CORDIC 算法之圆周系统之向量模式(Vectoring Mode)CORDIC算法详解(三)- CORDIC 算法之线性系统及其数学应用CORDIC算法详解(四)- CORDIC 算法之双曲系统及其数学应用CORDIC算法详解(五)- 统一的 CORDIC 算法形式CORDIC算法详解(六)- CORDIC 算法的硬件实现
其中第五篇及第六篇后会放出相关参考资料及源码。


4 CORDIC 算法之双曲系统及其数学应用

4.1 CORDIC 算法之双曲系统

  如图 3.87 所示, 在等轴双曲线的右半支上, 向量 OP与 X 正半轴夹角为 α, 故 P 点 坐标可表示为:bf4fdce3e1dea8f6a8ad5c7b78510048.png81c3ea4798f72351f2c76821e9b72d87.png
  将向量 OP 逆 时 针 旋 转 θ 角 至 向 量 OQ,此 时OQ 与 X 轴 正 半 轴 夹 角 为 a +θ 故 Q 点 坐 标可表示为:789e6d69302fa98d7857d29a14e8a2b2.png

  这里定义 θ 为目标旋转角度。 根据双曲函数公式可将式 (3.117) 展开为874c0415534c2b390156220c0c22158c.png
  将式 (3.116) 代入式 (3.118) 可得:4cb957d3df83556b2a579e6ec6b6edc4.png
  提取 coshθ , 式 (3.119) 可重写为:5dcef5d698daff9a5a6b8d85df7978e4.png
  类似于圆周系统下的分析方法, 将θ 分解为一系列的θi的线性组合, 其中:33121d57de00809d2f7e206b1491d5d7.png
式中di∈{-1, +1}。由于tanh-12-i=∞,故 i 从 1 开始。 类似地将旋转转换伪旋转下的微旋转,可得旋转模式和向量模式下的迭代公式, 如图 3.88 所示。

ce2b531331518fe8de23d24914cd09f2.png

  与圆周系统和线性系统有所不同, 双曲系统的迭代较为复杂。 其迭代过程要求当迭代顺序号为 4、 13、 40 等满足 i = 3k+ 1 时, 该次迭代必须重复, 才能保证收敛, 从而迭代过程变i = 1,2,3,4,4,5,… 。 根据迭代次数可确定图 3.88 中An≈0.82815936(n–>∞),故模长补偿因子为K≈1.20749706。同时还可确定旋转角度的总和为:c43a44aa363616698e49ac1913abdc35.png

  这就限定了在旋转模式下,初始化zi的取值范围为[-1.1181,+1.1181],在向量模式下 (y1/x1)的取值范围为[-0.8069,+0.8069] 。

4.2 CORDIC 算法之双曲系统数学应用

  利用双曲系统可求取一系列超越函数。 在旋转模式下, 可求取双曲正弦函数和双曲余弦函数, 进而可求取 e 指 数, 如 图 3 . 8 9 所 示。 据 此, 可 得 MATLAB下的仿真结果如3.90 所示。380ab6633f0782168f8d783524e66083.png11a33d474a7db74ca4b2da441843056e.png

  在向量模式下, CORDIC 算法可实现反双曲正切函数的计算, MATLAB仿真结果如 3.91所示。

e21b6db081a0220840a6d749296e6ab2.png

  除了可进行反双曲正切函数的计算外, 还可进行对数运算以及开方运算, 如 3.92 所示。d79b1b70243efc4ea2d080aa0d7db9a9.png

  由于向量模式下, 限定了(y1/x1)的取值范围为[-0.8069,+0.8069] , 故在对数运算和开方运算时, 图 3.92 中的α 需满足69743cfd9a540b45ac3bd935a5e464c4.png

从而可确定α∈[0.1069,9.3573]。

4.3 CORDIC 算法之双曲系统MATLAB代码

  CORDIC 双曲系统算法模型如 MATLAB 代码 如下, 该函数调用了函数 cordic_hr_it,具体如下:

MATLAB 代码 3-7 function: cordic_hr

% /*
% * @Author: ZLK
% * @Date: 2018-10-31 10:00:17
% * @Last Modified by: ZLK
% * @Last Modified time: 2018-10-31 13:50:05
% */
function a = cordic_hr(x1,y1,z1,mode,it)
% mode: 0 rotation mode, 1 vectoring mode.
% it: iteration number.
if it<4
error('Iterations must be greater than 3');
end
if mode==0
if abs(z1)>1.1181
error('In rotation mode abs(zl)<1.1181');
end
else
if abs(y1/x1)>0.8069
error('In vectoring mode abs(yl/xl)<0.8069');
end
end
myit = cordic_hr_it(it);
len_myit = length(myit);
x = zeros(len_myit+1,1);
y = zeros(len_myit+1,1);
z = zeros(len_myit+1,1);
x(1) = x1;
y(1) = y1;
z(1)= z1;
di = 0;
for k=1:len_myit
if mode==0
di = sign(z(k));
else
di = sign(-y(k));
end
x(k+1) = x(k)+ y(k)*di*2^(-myit(k));
y(k+1) = y(k)+ x(k)*di*2^(-myit(k));
z(k+1) = z(k)- di*atanh(2^(-myit(k)));
end

kn = 1/prod(sqrt(1-2.^(-2*myit)));
xn = kn*x(it+1);
yn = kn*y(it+1);
zn = z(it+1);

if mode==0
xt = x1*cosh(z1)+y1*sinh(z1);
yt = y1*cosh(z1)+x1*sinh(z1);
zt = 0;
else
xt = sqrt(x1^2-y1^2);
yt = 0;
zt = z1+atanh(y1/x1);
end

a = [xn, xt,yn,yt,zn,zt];

MATLAB 代码 3-8 function: cordic_hr_it

% /*
% * @Author: ZLK
% * @Date: 2018-10-31 13:50:22
% * @Last Modified by: ZLK
% * @Last Modified time: 2018-10-31 13:52:57
% */
function it = cordic_hr_it(kmax)
% return cordic hybolic system iteration index
it = zeros(kmax,1);
it(1) = 1;
k = 1;
repeat_value = 4;
while k+1<=kmax
it(k+1) = it(k)+ 1;
if it(k+1)==repeat_value && k+2<=kmax
it(k+2)= it(k+1);
repeat_value = 3*repeat_value+1;
k = k+2;
else
k = k+1;
end
end

  结果

  相关参数转换如下:

  • x1=1;(本程序中,表示x1cosh/x1sinh,因为程序中已经进行了相关的计算)

345609a4bbe77272e36fdd896be1e83d.png

  • y1 = 0;

  • z1=π/4 ;(cosh(z1=π/4)/sinh(z1=π/4))

  • 经过100次迭代计算后,得到的xn 和yn分别为coshθ和sinhθ。

a74847a884058e903ee7324927470989.png

  • α=5

  • x1=6;(本程序中,表示x1cosh/x1sinh,因为程序中已经进行了相关的计算)

  • y1 = 4;

  • z1=0 ;(cosh(z1=π/4)/sinh(z1=π/4))

  • 经过1000次迭代计算后,得到的xn 和yn分别为2α^0.5和0.5ln(α)。4923aa2fb953eff37c86e3246ab1f502.png
      其中开方操作,还有点误差,还在查找原因。

be5b9ca1dffefd90fccbcf05e198d3f2.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab迭代算法实例_CORDIC算法详解(四)CORDIC 算法之双曲系统及其数学应用 的相关文章

随机推荐