拟合可以调用matlab的命令ployfit来做,例如:
x=[start:
:
stop];
y=atan(x);
pa=polyfit(x,y,2);
上式中的运算都是简单的乘法运算,较为简单。
开方运算
浮点开方运算描述为:
floatx,y;
y=sqrt(x);
定点求开方有多种方法,各种方法在收敛速度上不尽相同,下面介绍几种常用的迭代算法。
1.Newton-Raphson-Babylonian算法:
给定整数N,求sqrt(N)。
首先确定初值x[0],然后利用一个简单的迭代公式:
x[n+1]=(x[n]+N/x[n])/2
迭代次数的选择:
迭代次数与初值x[0]的选取很有关系,x[0]越接近sqrt(N),收敛越快。
但总的来说,该方法收敛较快。
缺点是收敛时间不确定。
2.确定收敛速度的算法:
该方法描述如下:
intsqrt(intx)
{inttest,step;
if(x<0)return(-1);if(x==0)return(0);
step=1<<15;
test=0;
while(step!
=0)
{
registerinth;
h=(test+step)*(test+step);
if(h<=x){test+=step;}
if(h==x)break;
step>>=1;
}
return(test);}
以上例子是32位开放运算,32位以上的开方运算可参考附录1voidfixsqrt(UINT4*a,UINT4*b,intdigits),方法同上。
求开方还可以运用线性拟合的方法,由于曲线变化较快,必须根据自变量的范围分段拟合才能达到理想的精度。
附录
附录1:
定点函数库
/*___________________________________________________________________________
||
|FunctionName:
L_add|
||
|Purpose:
|
||
|32bitsadditionofthetwo32bitsvariables(L_var1+L_var2)with|
|overflowcontrolandsaturation;theresultissetat+47when|
|overflowoccursorat-48whenunderflowoccurs.|
||
|Complexityweight:
2|
||
|Inputs:
|
||
|L_var132bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var3<=0x7fffffff.|
||
|L_var232bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var3<=0x7fffffff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|L_var_out|
|32bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var_out<=0x7fffffff.|
|___________________________________________________________________________|
*/
Word32L_add(Word32L_var1,Word32L_var2)
/*___________________________________________________________________________
||
|FunctionName:
L_sub|
||
|Purpose:
|
||
|32bitssubtractionofthetwo32bitsvariables(L_var1-L_var2)with|
|overflowcontrolandsaturation;theresultissetat+7when|
|overflowoccursorat-8whenunderflowoccurs.|
||
|Complexityweight:
2|
||
|Inputs:
|
||
|L_var132bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var3<=0x7fffffff.|
||
|L_var232bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var3<=0x7fffffff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|L_var_out|
|32bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var_out<=0x7fffffff.|
|___________________________________________________________________________|
*/
Word32L_sub(Word32L_var1,Word32L_var2)
/*___________________________________________________________________________
||
|FunctionName:
add|
||
|Purpose:
|
||
|Performstheaddition(var1+var2)withoverflowcontrolandsaturation;|
|the16bitresultissetat+32767whenoverflowoccursorat-32768|
|whenunderflowoccurs.|
||
|Complexityweight:
1|
||
|Inputs:
|
||
|var1|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|var2|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|var_out|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var_out<=0x00007fff.|
|___________________________________________________________________________|
*/
Word16add(Word16var1,Word16var2)
/*___________________________________________________________________________
||
|FunctionName:
sature|
||
|Purpose:
|
||
|Limitthe32bitinputtotherangeofa16bitword.|
||
|Inputs:
|
||
|L_var1|
|32bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var1<=0x7fffffff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|var_out|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var_out<=0x00007fff.|
|___________________________________________________________________________|
*/
Word16sature(Word32L_var1)
/*___________________________________________________________________________
||
|FunctionName:
sub|
||
|Purpose:
|
||
|Performsthesubtraction(var1+var2)withoverflowcontrolandsatu-|
|ration;the16bitresultissetat+32767whenoverflowoccursorat|
|-32768whenunderflowoccurs.|
||
|Complexityweight:
1|
||
|Inputs:
|
||
|var1|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|var2|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|var_out|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var_out<=0x00007fff.|
|___________________________________________________________________________|
*/
Word16sub(Word16var1,Word16var2)
/*___________________________________________________________________________
||
|FunctionName:
L_mult|
||
|Purpose:
|
||
|L_multisthe32bitresultofthemultiplicationofvar1timesvar2|
|withoneshiftleft.:
|
|L_mult(var1,var2)=shl((var1timesvar2),1)and|
|L_mult(-32768,-32768)=47.|
||
|Complexityweight:
1|
||
|Inputs:
|
||
|var1|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|var2|
|16bitshortsignedinteger(Word16)whosevaluefallsinthe|
|range:
0xffff8000<=var1<=0x00007fff.|
||
|Outputs:
|
||
|none|
||
|ReturnValue:
|
||
|L_var_out|
|32bitlongsignedinteger(Word32)whosevaluefallsinthe|
|range:
0x80000000<=L_var_out<=0x7fffffff.|
|___________________________________________________________________________|
*/
Word32L_mult(Word16var1,Word16var2)
/*Computesthesquarerootofafixpointnumbera=square(b).*/
/*length:
a[digits],b[2*digits]*/
voidfixsqrt(UINT4*a,UINT4*b,intdigits)
{
Returnscarry.
Lengths:
a[digits],b[digits],c[digits].
*/
NN_DIGITNN_Add(a,b,c,digits)
NN_DIGIT*a,*b,*c;
unsignedintdigits;
/*Computesa=b-c.Returnsborrow.
Lengths:
a[digits],b[digits],c[digits].
*/
NN_DIGITNN_Sub(a,b,c,digits)
NN_DIGIT*a,*b,*c;
unsignedintdigits;
/*Computesa=b*c.
Lengths:
a[2*digits],b[digits],c[digits].
Assumesdigits*/
voidNN_Mult(a,b,c,digits)
NN_DIGIT*a,*b,*c;
unsignedintdigits;
/*Returnssignofa-b.*/
intNN_Cmp(a,b,digits)
NN_DIGIT*a,*b;
unsignedintdigits;
/*Computesa=b*2^c.,shiftsleftcbits),returningcarry.
RequirescNN_DIGITNN_LShift(a,b,c,digits)
NN_DIGIT*a,*b;
unsignedintc,digits;
/*Computesa=bdiv2^c.,shiftsrightcbits),returningcarry.
Requ