在編寫DSP模擬算法時,為了方便,壹般都是采用高級語言(如C語言)來編寫模擬程序。程序中所用的變量壹般既有整型數,又有浮點數。如例3.1程序中的變量i是整型數,而pi是浮點數,hamwindow則是浮點數組。
例3.1256點漢明窗計算
inti;
floatpi=3.14159;
floathamwindow[256];
for(i=0;iQy,加法/減法結果z的定標值為Qz,則
z=x+yÞ
=
=Þ
所以定點加法可以描述為:
intx,y,z;
longtemp;
temp=y>(Qx-Qz)),若Qx≥Qz
z=(int)(temp>2)=29491;
因為z的Q值為13,所以定點值z=29491即為浮點值z=29491/8192=3.6。
例3.3定點減法
設x=3.0,y=3.1,則浮點運算結果為z=x-y=3.0-3.1=-0.1;
Qx=13,Qy=13,Qz=15,則定點減法為:
x=24576;y=25295;
temp=25395;
temp=x-temp=24576-25395=-819;
因為QxQy,加法結果z的定標值為Qz,則定點加法為:
intx,y;
longtemp,z;
temp=y>(Qx-Qz),若Qx≥Qz
z=temp32767,因此
Qx=1,Qy=0,Qz=0,則定點加法為:
x=30000;y=20000;
temp=20000>1=35000;
因為z的Q值為0,所以定點值z=35000就是浮點值,這裏z是壹個長整型數。
當加法或加法的結果超過16位表示範圍時,如果程序員事先能夠了解到這種情況,並且需要保證運算精度時,則必須保持32位結果。如果程序中是按照16位數進行運算的,則超過16位實際上就是出現了溢出。如果不采取適當的措施,則數據溢出會導致運算精度的嚴重惡化。壹般的定點DSP芯片都設有溢出保護功能,當溢出保護功能有效時,壹旦出現溢出,則累加器ACC的結果為最大的飽和值(上溢為7FFFH,下溢為8001H),從而達到防止溢出引起精度嚴重惡化的目的。
3.2.2乘法運算的C語言定點模擬
設浮點乘法運算的表達式為:
floatx,y,z;
z=xy;
假設經過統計後x的定標值為Qx,y的定標值為Qy,乘積z的定標值為Qz,則
z=xyÞ
=Þ
=
所以定點表示的乘法為:
intx,y,z;
longtemp;
temp=(long)x;
z=(temp×y)>>(Qx+Qy-Qz);
例3.5定點乘法
設x=18.4,y=36.8,則浮點運算值為z=18.4×36.8=677.12;
根據上節,得Qx=10,Qy=9,Qz=5,所以
x=18841;y=18841;
temp=18841L;
z=(18841L*18841)>>(10+9-5)=354983281L>>14=21666;
因為z的定標值為5,故定點z=21666即為浮點的z=21666/32=677.08。
3.2.3除法運算的C語言定點模擬
設浮點除法運算的表達式為:
floatx,y,z;
z=x/y;
假設經過統計後被除數x的定標值為Qx,除數y的定標值為Qy,商z的定標值為Qz,則
z=x/yÞ
=Þ
所以定點表示的除法為:
intx,y,z;
longtemp;
temp=(long)x;
z=(temp
constintlength=180
voidfilter(intxin[],intxout[],intn,floath[]);
staticfloath[19]=
{0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,
-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,
0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,
-0.04743239,-0.02881839,-0.009012882,0.01218354};
staticintx1[length+20];
voidfilter(intxin[],intxout[],intn,floath[])
{
inti,j;
floatsum;
for(i=0;i
constintlength=180;
voidfilter(intxin[],intxout[],intn,inth[]);
staticinth[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,
7503,5061,2112,-285,-1503,-1555,-945,-296,399};
staticintx1[length+20];
voidfilter(intxin[],intxout[],intn,inth[])
{
inti,j;
longsum;
for(i=0;i>15;
}
for(i=0;i<(n-1);i++)x1[n-i-2]=xin[length-i-1];
}
主程序與浮點的完全壹樣。