使用CORDIC计算平方根
这个例子展示了如何使用一个内核CORDIC算法计算平方根的MATLAB®。CORDIC-based算法是至关重要的许多嵌入式应用程序,包括电机控制、导航、信号处理和无线通信。
CORDIC坐标旋转数字计算机的缩写。的吉文斯rotation-based CORDIC算法(见[1,2])是一种最硬件高效算法,因为它只需要迭代shift-add操作。CORDIC算法不需要显式的乘数,并适用于计算各种功能,如正弦、余弦,反正弦,余弦,反正切,矢量大小,分裂,平方根,双曲线和对数函数。
定点CORDIC算法需要以下操作:
1查表每个迭代
2班每个迭代
3增加每个迭代
请注意,对于双曲CORDIC-based算法,如根、某些迭代(40我= 4,13日,121年,…k, k, 3 + 1,…)是重复实现收敛结果。
CORDIC算法内核使用双曲线计算模式
您可以使用CORDIC算法计算模式计算双曲函数,例如双曲三角,平方根,日志,经验等。
CORDIC方程的双曲引导模式
双曲引导模式是用于计算平方根。
引导模式,CORDIC方程如下:
在哪里
如果 , 否则。
这种模式提供了以下结果 方法 :
在哪里
。
通常 选择是一个足够大的常数值。因此, 可能的预先计算。
还请注意,平方根我们将只使用 结果。
在MATLAB实现CORDIC双曲矢量算法
MATLAB代码实现CORDIC夸张的例子引导内核算法遵循(标量的情况下x
,y
,z
)。这个代码可以用于定点和浮点数据类型。
CORDIC双曲引导内核
k = 4;%用于重复(3 * k + 1)迭代步骤为idx = 1: n xtmp = bitsra (x, idx);%乘以2 ^ (idx)ytmp = bitsra (y, idx);%乘以2 ^ (idx)如果y < 0 x (:) = x + ytmp;(,)= y + xtmp;z (:) = z - atanhLookupTable (idx);其他的(,)= x - ytmp;(,)= y - xtmp;z (:) = z + atanhLookupTable (idx);结束如果idx = = k xtmp = bitsra (x, idx);%乘以2 ^ (idx)ytmp = bitsra (y, idx);%乘以2 ^ (idx)如果y < 0 x (:) = x + ytmp;(,)= y + xtmp;z (:) = z - atanhLookupTable (idx);其他的(,)= x - ytmp;(,)= y - xtmp;z (:) = z + atanhLookupTable (idx);结束k = 3 * k + 1;结束结束% idx循环
计算平方根使用CORDIC双曲引导内核
明智地选择初始值允许CORDIC内核双曲矢量模式算法计算平方根。
首先,下面的初始化步骤执行:
被设置为 。
被设置为 。
后 迭代,这些初始值导致以下输出 方法 :
这可能是进一步简化如下:
在哪里 是CORDIC获得如上定义。
注意:对于平方根,
和atanhLookupTable
对结果没有影响。因此,
和atanhLookupTable
不习惯。
MATLAB实现CORDIC平方根内核
MATLAB代码实现CORDIC算法内核平方根遵循的例子(标量x
和y
)。这个代码可以用于定点和浮点数据类型。
CORDIC平方根内核
k = 4;%用于重复(3 * k + 1)迭代步骤
为idx = 1: n xtmp = bitsra (x, idx);%乘以2 ^ (idx)ytmp = bitsra (y, idx);%乘以2 ^ (idx)如果y < 0 x (:) = x + ytmp;(,)= y + xtmp;其他的(,)= x - ytmp;(,)= y - xtmp;结束
如果idx = = k xtmp = bitsra (x, idx);%乘以2 ^ (idx) ytmp = bitsra (y, idx);%乘以2 ^ (idx)如果y < 0 x (:) = x + ytmp;(,)= y + xtmp;其他(,)= x - ytmp;(,)= y - xtmp;结束k = 3 * k + 1;结束结束% idx循环
这段代码是相同的CORDIC双曲引导内核实现,除了z
和atanhLookupTable
不习惯。这是一个成本节约每迭代1表查找和添加。
例子
使用cordicsqrt
函数来计算近似的平方根v_fix
使用十CORDIC内核迭代:
一步= 2 ^ 7;v_fix = fi(0.5:步骤:(两步),1,20);在区间[%定点输入。5、2)硝石= 10;% CORDIC的迭代次数x_sqr = cordicsqrt (v_fix、硝石);
得到实际值(RWV) CORDIC输出的比较和情节之间的误差MATLAB参考和CORDIC sqare根值。
x_cdc =双(x_sqr);% CORDIC结果(由An_hp缩放)v_ref =双(v_fix);%参考输入浮点值x_ref =√v_ref);% MATLAB参考浮点结果图;次要情节(211);情节(v_ref x_cdc,“r”。v_ref x_ref,“b -”);传奇(“CORDIC”,“参考”,“位置”,“东南”);标题(“CORDIC平方根(范围内)和MATLAB参考结果');次要情节(212);absErr = abs (x_ref - x_cdc);情节(v_ref absErr);标题(的绝对误差与MATLAB√参考结果)”);
克服算法输入范围的局限性
许多平方根算法规范化输入值, 的范围内(0.5,2)。这个预处理通常是通过使用一个固定的单词长度归一化,并且可以用于支持小型以及大型输入值范围。金宝app
CORDIC-based平方根算法实现特别敏感输入这个范围之外。的cordicsqrt
函数通过一个标准化的方法克服了这一算法的距离限制基于以下的数学关系:
,对于一些 甚至一些整数 。
因此:
在cordicsqrt
函数的值
和
,发现上面所描述的那样,在标准化的输入
。
是前导零的数量最重要的比特(位元)输入的二进制表示
。这些值被发现通过一系列位逻辑和转变。注意,因为
必须是偶数,如果前导零现金服务企业的数量是奇数,一个额外的位是由转向
偶数。这些变化后得到的值值
。
成为输入CORDIC-based平方根内核,近似 计算。然后结果是按比例缩小的 所以它是在正确的输出范围。这是通过一个简单的移位 位。(左或右)转变方向取决于的迹象 。
例子
计算平方根的10位定点输入数据使用CORDIC小范围非负。比较CORDIC-based算法结果浮点MATLAB参考结果在相同的输入范围。
一步= 2 ^ 8;u_ref = 0:步骤:(0.5一步一步);%输入数组(小范围的值)u_in_arb = fi (u_ref 0 10);% 10位无符号定点输入数据值u_len =元素个数(u_ref);sqrt_ref =√双(u_in_arb));% MATLAB sqrt参考结果硝石= 10;结果= 0 (u_len, 2);结果:2)= sqrt_ref (:);
计算等效实际价值(RWV)策划的结果。情节的RWV CORDIC和MATLAB参考结果。
x_out = cordicsqrt (u_in_arb、硝石);结果(:1)=双(x_out);图;次要情节(211);情节(u_ref结果(:1),“r”。,u_ref,结果(:,2),“b -”);传奇(“CORDIC”,“参考”,“位置”,“东南”);标题(“CORDIC平方根(小输入范围)和MATLAB参考结果的);轴([0 0 0.75 0.5]);次要情节(212);absErr = abs(结果(要求:2),结果(:1));情节(u_ref absErr);标题(的绝对误差与MATLAB√参考结果)”);
例子
计算平方根的16位定点输入数据,积极使用CORDIC范围。比较CORDIC-based算法结果浮点MATLAB参考结果在相同的输入范围。
u_ref = 0:5:2500;%输入数组(大范围的值)u_in_arb = fi (u_ref 0 16);% 16位无符号定点输入数据值u_len =元素个数(u_ref);sqrt_ref =√双(u_in_arb));% MATLAB sqrt参考结果硝石= 16;结果= 0 (u_len, 2);结果:2)= sqrt_ref (:);
计算等效实际价值(RWV)策划的结果。情节的RWV CORDIC和MATLAB参考结果。
x_out = cordicsqrt (u_in_arb、硝石);结果(:1)=双(x_out);图;次要情节(211);情节(u_ref结果(:1),“r”。,u_ref,结果(:,2),“b -”);传奇(“CORDIC”,“参考”,“位置”,“东南”);标题(“CORDIC平方根(大输入范围)和MATLAB参考结果);轴([0 2500 0 55]);次要情节(212);absErr = abs(结果(要求:2),结果(:1));情节(u_ref absErr);标题(的绝对误差与MATLAB√参考结果)”);
引用
杰克·e·Volder CORDIC三角计算技术,“愤怒交易电子计算机、体积EC-8, 1959年9月,第330 - 334页。
J.S.二人沃尔特”,一个统一的初等函数的算法,“会议论文集,春天联合计算机会议,1971年5月,页379 - 385。