打印

一个极其怪的问题!

[复制链接]
1643|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pdm97|  楼主 | 2008-4-21 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个极其怪的问题! 

   fw0=5625636.482914;
   fw1=16796184.027028;
   fw2=-16716106.802805;
   fw3=5545557.1237500 ;
   fw=1.0-((fw1+fw2+fw3)/fw0);     
   sw0 =(short) ( fw1/fw0 * 8192  ); //Q13
   sw1 =(short) ( fw2/fw0 * 8192 );  //Q13
   sw2 = (short)( fw3/fw0 * 8192  ); //Q13
   w[0]=w[1]=w[2]=in_data[0];
   fwf[0]=fwf[1]=fwf[2]=in_data[0];

for(i=0;i<n;i++)
   {
      x=in_data;

(1)     sresult=(short)(x + 
            ((sw0*(w[2]-x)+sw1*(w[1]-x)+sw2*(w[0]-x))  >>13) );
      ////////////////////////////////////////////////////////
(2)    sresult=(short)(x + 
            ((sw0*(w[2]-x)+sw1*(w[1]-x)+sw2*(w[0]-x))/8192) );
      ////////////////////////////////////////////////////////
      w[0]=w[1];
      w[1]=w[2];
      w[2]=sresult;
      if(fresult!=sresult)    printf("f %d,s %d ",fresult,sresult);
   }
为什么语句(1),(2)执行出来的结果不一样,请高手指点,问题在什么地方!
 
 

相关帖子

沙发
zgl7903| | 2008-4-22 08:58 | 只看该作者

个人见解

整数在存储器中以8421的顺序排列,所以正整数的不溢出和等次幂的乘除法结果一样,整数考虑移位扩展位时和等次幂的乘除法结果也一样,但是浮点数表示的方法不同于整数,因此移位和乘除法的结果不一样,看看IEEE754浮点数标准就晓得了

使用特权

评论回复
板凳
pdm97|  楼主 | 2008-4-23 11:11 | 只看该作者

一个极其怪的问题!

zgl7903:
谢谢,这个道理我明白了,但是如果我要把浮点运算转化成定点运算,该如何办呢,
浮点运算如下:
   fw0=5625636.482914;
   fw1=16796184.027028;
   fw2=-16716106.802805;
   fw3=5545557.1237500 ;
   fw=1.0-((fw1+fw2+fw3)/fw0);     
   float w[0]=w[1]=w[2]=in_data[0];(in_data[] 是unsigned char数据)
  
   for(i=0;i<n;i++)
   {
      float x=in_data;

      float sresult=(float)(fw*x + 
            (fw1*w[2]+fw1*w[1]+fw2*w[0])/fw0) ;
      
      w[0]=w[1];
      w[1]=w[2];
      w[2]=sresult;
      
   }

浮点转定点运算:

   fw0=5625636.482914;
   fw1=16796184.027028;
   fw2=-16716106.802805;
   fw3=5545557.1237500 ;
   fw=1.0-((fw1+fw2+fw3)/fw0);     
   sw0 =(int) ( fw1/fw0 * 1024*1024  ); //11Q20
   sw1 =(int) ( fw2/fw0 * 1024*1024);  
   sw2 = (int)( fw3/fw0 * 1024*1024); 
   sw = fw* 1024*1024 ; 
   int w[0]=w[1]=w[2]=in_data[0];

   for(i=0;i<n;i++)
   {
     int  x=in_data;
      ////////////////////////////////////////////////////////
     int sresult=(int)((sw*x + sw0*w[2]+sw1*w[1]+sw2*w[0])/1048576) ;
      ////////////////////////////////////////////////////////
      w[0]=w[1];
      w[1]=w[2];
      w[2]=sresult;
      
   }

经过我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,........等等类似的情况,想不明白了!请高手指教,
这本质就是要实现一个滤波算法,但是要把浮点运算转化为定点运算,看了这方面的资料,根据这些资料改写了算法,但是就出现这样的结果,郁闷!!!!求救!!

使用特权

评论回复
地板
pdm97|  楼主 | 2008-4-23 22:14 | 只看该作者

浮点转定点运算:

没有指点,自己顶一下!!!1

使用特权

评论回复
5
zgl7903| | 2008-4-24 14:07 | 只看该作者

short型的数据范围是多少?

Q20 至少是20位的数据长度 是不是数据溢出了呢

使用特权

评论回复
6
pdm97|  楼主 | 2008-4-24 15:49 | 只看该作者

浮点转定点运算

改成int 类型还是有问题!!!!!!!!!!!!!!!!!!!!!!!!
浮点转定点运算:

   fw0=5625636.482914;
   fw1=16796184.027028;
   fw2=-16716106.802805;
   fw3=5545557.1237500 ;
   fw=1.0-((fw1+fw2+fw3)/fw0);     
   sw0 =(int) ( fw1/fw0 * 1024*1024  ); //11Q20
   sw1 =(int) ( fw2/fw0 * 1024*1024);  
   sw2 = (int)( fw3/fw0 * 1024*1024); 
   sw = fw* 1024*1024 ; 
   int w[0]=w[1]=w[2]=in_data[0];

   for(i=0;i<n;i++)
   {
     int  x=in_data;
      ////////////////////////////////////////////////////////
     int sresult=(int)((sw*x + sw0*w[2]+sw1*w[1]+sw2*w[0])/1048576) ;
      ////////////////////////////////////////////////////////
      w[0]=w[1];
      w[1]=w[2];
      w[2]=sresult;
      
   }
输入的数据是0-255之间,int 32Bit,short 16 bit,我用的是TMS320C6414

使用特权

评论回复
7
pdm97|  楼主 | 2008-4-27 10:20 | 只看该作者

一个极其怪的问题!

还是没有人给些建议,请高手指点一二!万分感谢!!!!!!!!!!!!!!!!

使用特权

评论回复
8
zgl7903| | 2008-4-29 18:11 | 只看该作者

看看sizeof(int)是多少?

使用特权

评论回复
9
pdm97|  楼主 | 2008-4-29 19:42 | 只看该作者

看看sizeof(int)是多少?

int 已经确定是32 位的!

使用特权

评论回复
10
zgl7903| | 2008-4-30 15:10 | 只看该作者

在PC机上调试跟踪一圈,看看和你的理论上差在哪里

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝