|
.查表法
在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。采用这种方法必须根据自变量的范围和精度要求制作一张表格。显然输人的范围越大,精度要求越高,则所需的表格就越大,即存储量也越大。查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。查表法比较适合于非线性函数是周期函数或已知非线性函数输入值范围这两种情况、例1.12和例1. 13分别说明这两种情况。
例1.12 已知正弦函数y=cos(x),制作一个512点表格,并说明查表方法。由于正弦函数是周期函数,函数值在-1至+1之间,用查表法比较合适。由于Q15的表示范围为1-至32767/32768之间,原则上讲-1至+1的范围必须用Q14表示。但一般从方便和总体精度考虑,类似情况仍用Q15表示,此时+1用32767来表示。
(1)产生5l2点值的C语言程序如下所示。
#define N 512
#define pi 3.14l59
int sin_tab[5l2];
void main()
{
int i;
for(i=0;i<N;i++)sin_tab=(int)(32767*sin(2*pi*i/N));
复制代码
(2)查表
查表实际上就是根据输人值确定表的地址。设输入x在0~2π之间,则x对应于512点表的地址为:index=(int)(512*x/2π),则y=sin(x)=sin_tab[index]如果x用Q12定点数表示,将512/2π用Q8表示为20861,则计算正弦表的地址的公式为。
index=(x*20861L)>>20;
复制代码
例1.12用查表法求以2为底的对数,已知自变量值范围为0.5-1,要求将自变量范围均匀划分为10等分。试制作这个表格并说明查表方法。
(1)作表:
y=log2(x),由于x在0.5到1之间,因此y在-1到0之间,x和y均可用Q15表示。由于对x均匀划分为10段,因此,10段对应于输入x的范围如表3.2所示。若每一段的对数值都取第一点的对数值,则表中第一段的对数值为y0(Q15)=(int)(log(O.5)*32768),第二段的对数值为y1(Q15)=(int)(log2(0.55)*32768),依次类推,如表3.2所示。
(2)查表:
查表时,先根据输人值计算表的地址,计算方法为:
index=((x-16384)*20)>>15;
复制代码
式中, index就是查表用的地址。例如,已知输人x=26869,则index=6,因此,y= -10549。
表1.2 logtab0 10点对数表
地址 输入值 对数值(Q15)
0 0.50-0.55 -32768
1 0.55-0.60 -28262
2 0.60-0.65 -24149
3 0.65-0.70 -20365
4 0.70-0.75 -16862
5 0.75-0.80 -13600
6 0.80-0.85 -10549
7 0.85-0.90 -7683
8 0.90-0.95 -4981
9 0.95-1.00 -2425
|
|