关于
DSP
的一些反正切查表算法的编写
一直在拿
TMS20F28335
做电机控制,
也从早前的简单寄存器
IO
口配置时代过渡到了真
正的算法时代
,
很不适应,起初去查各种书籍
,
网上搜索各种网站,发现书本上讲的很多都是
快速傅里叶啊啥的
,
找不到很原始的像啥低通滤波器
,
正弦
,
正切这些函数的编写。
起初写程序发现,
C2000
的库里支持啥正弦函数,浮点预算,反正弦函数,开根运算等
算法,好兴奋。用了才知道,太慢了,根本没法用在工程上。
关于三角函数的编写,其实都是利用查表发,查表法大家应该都懂。这个就不再赘述,
怎样去查一个正弦表呢?这里做一个基本的介绍。
首先
,你可以自己写一个查表数组,也可以在程序初始化生成一个。
Eg
:
void
SinCOS_TAB(
void
)
{
unsigned
char
i;
float
Theta;
for
(i=0;i
#define
TAB_Max 180
{
Theta = i * Step_Angle; // Step_Angle=1.74532925E-02
Sin_tab[i] =sin(Theta); //
生成正弦表数组,利用了库里现成的
SIN
函数
Cos_tab[i] =cos(Theta); //
生成余弦表数组
}
}
为啥我的数组里面只有
180
个元素呢?一:我的精度要求不高,我是一度一个步进角的,
如果你要更高的精度,
你可以选择容量更大的数组。
二:
我不想因为庞大的浮点数组占据太大的
存储空间,所以我利用了奇函数,偶函数的原理
再次
,就进入正题写查表程序,就我们初中数学所知,正弦函数是奇函数,
余弦函数是偶函
数,所以我只用了
360
角度中的一半。
下面为正弦查表程序:
/*Refer to the truth that DSP use some SinCos operation will use six or
more command
* periods , So I look up the pre_generate SINCOS_TAB to speed up the
Execution speed*/
float
SinF(
float
single)
{
int
i=(
int
)(single*180/pi);
float
value=0;
if
(i<0)
value = -Sin_tab[i];
else
value = Sin_tab[i];
return
value;
}