當前位置:編程學習大全網 - 編程語言 - 定點運算的從浮點到定點

定點運算的從浮點到定點

在編寫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];

}

主程序與浮點的完全壹樣。

  • 上一篇:可編程控制器的分類有哪些?
  • 下一篇:求壹道例題的c語言解答,用c語言編程,謝謝了 9x9表格填空 要求每壹行每壹豎都包含有1-9 九個數字條件如圖
  • copyright 2024編程學習大全網