赞
踩
这里主要先介绍如何利用CORDIC算法计算固定角度
一般利用MATLAB计算三角函数时,用
有一种最傻瓜的方式是用rom存储
为什么说是数形结合呢,让我们看下如何通过旋转求
下面首先引入一个在圆上的坐标旋转公式(不一定单位圆):
注:
其中
推导完毕。
我们继续看式
由于对
之前说的我们要把乘法运算变成移位运算,所以我们找到
于是把
这样,旋转
比如要旋转
现在考虑把
进行下一次迭代(旋转),得到:
可以看到每次旋转都可以提取出
现在考虑最后一个问题,如何确定每次迭代的旋转方向
令
当我们最终转到了目标角度
另外,在作比较判断时,单次旋转角度
由开始所说的数形结合可以推出,假设只旋转一次把
按第一节所说的,把一次就旋转到位用很多次旋转替代,每次旋转后坐标到原点的距离比上一次都大了
这样就只用通过
其实用CORDIC算法还能计算arctan、sinh、cosh等值,以后学习了再来补充进阶版。
- clc, clear, close all;
-
- %% 初始计算cos累乘值
- N = 16; % 设置迭代次数16次
- Nprod(1) = 1;
- for i = 1 : N
- Nprod(i + 1) = Nprod(i) * cos(atan(2^(-(i - 1))));
- end
-
- %% Cordic算法计算cos、sin值
- x(1) = Nprod(N); % 横坐标初始值赋为cos累乘值
- y(1) = 0; % 纵坐标初始值赋为0
- z(1) = 66 / 180 * pi; %目标旋转角度值,66°,注意转化成弧度值
- d(1) = 1; %旋转方向,初始肯定为1
-
-
- for i = 1 : N
- x(i + 1) = x(i) - d(i) * y(i) * 2^(-(i - 1)); %移位运算,公式(4)
- y(i + 1) = y(i) + d(i) * x(i) * 2^(-(i - 1)); %移位运算,公式(4)
- z(i + 1) = z(i) - d(i) * atan(2^(-(i - 1))); %计算累计旋转角度,查一次表,公式(6)
- if z(i + 1) >= 0 % 判断下一次的旋转方向
- d(i + 1) = 1;
- else
- d(i + 1) = -1;
- end
- end
-
- COS = x(N) % 输出cos66的值
- SIN = y(N) % 输出sin66的值
[1]:什么是CORDIC算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。