| zgl7903:<br />谢谢,这个道理我明白了,但是如果我要把浮点运算转化成定点运算,该如何办呢,<br />浮点运算如下:<br />   fw0=5625636.482914;<br />   fw1=16796184.027028;<br />   fw2=-16716106.802805;<br />   fw3=5545557.1237500 ;<br />   fw=1.0-((fw1+fw2+fw3)/fw0);     <br />   float w[0]=w[1]=w[2]=in_data[0];(in_data[] 是unsigned char数据)<br />  <br />   for(i=0;i<n;i++)<br />   {<br />      float x=in_data;<br /><br />      float sresult=(float)(fw*x + <br />            (fw1*w[2]+fw1*w[1]+fw2*w[0])/fw0) ;<br />      <br />      w[0]=w[1];<br />      w[1]=w[2];<br />      w[2]=sresult;<br />      <br />   }<br /><br />浮点转定点运算:<br /><br />   fw0=5625636.482914;<br />   fw1=16796184.027028;<br />   fw2=-16716106.802805;<br />   fw3=5545557.1237500 ;<br />   fw=1.0-((fw1+fw2+fw3)/fw0);     <br />   sw0 =(int) ( fw1/fw0 * 1024*1024  ); //11Q20<br />   sw1 =(int) ( fw2/fw0 * 1024*1024);  <br />   sw2 = (int)( fw3/fw0 * 1024*1024); <br />   sw = fw* 1024*1024 ; <br />   int w[0]=w[1]=w[2]=in_data[0];<br /><br />   for(i=0;i<n;i++)<br />   {<br />     int  x=in_data;<br />      ////////////////////////////////////////////////////////<br />     int sresult=(int)((sw*x + sw0*w[2]+sw1*w[1]+sw2*w[0])/1048576) ;<br />      ////////////////////////////////////////////////////////<br />      w[0]=w[1];<br />      w[1]=w[2];<br />      w[2]=sresult;<br />      <br />   }<br /><br />经过我DEBUG发现,定点运算的数据精度有损失是合理的,但是滤波出来的数据规律有问题,比如输入数据是1,2,3,4,5..........254,255;浮点运算后的输出数据基本是平滑的,但是定点运算后发现输出数据有周期性变化 如:1,2,3,4,5,6,8,9,10, 7,9,9,10, 15,16,17,18,19,20, 14,15,16, 24,25,26,27,........等等类似的情况,想不明白了!请高手指教,<br />这本质就是要实现一个滤波算法,但是要把浮点运算转化为定点运算,看了这方面的资料,根据这些资料改写了算法,但是就出现这样的结果,郁闷!!!!求救!!<br /><br /> |