debug正常,51运算错误

2019-03-24 18:48发布

已经用其他程序试验过了,不是xdata的问题,xdata里的数据能正常使用。我在用51做一个32点的fft。
部分代码如下:
#include <reg52.h>
#include <math.h>
#define  uchar  unsigned  char
#define  uint unsigned int
#define  N 32 //fft点数
float xdata re[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};//实部
float xdata im[32]=0;//虚部
uint x[32];
float code RSin[16] = {1.0000,0.9808,0.9239,0.8315,0.7071,0.5556,0.3827,0.1951,0,-0.1951,-0.3827,-0.5556,-0.7071,-0.8315,-0.9239,-0.9808};
float code RCos[16] = {0.0000,0.1951,0.3827,0.5556,0.7071,0.8315,0.9239,0.9808,1.0000,0.9808,0.9239,0.8315,0.7071,0.5556,0.3827,0.1951};
float tempRe;//实部缓存
float tempIm;//虚部缓存
float sinVal = 0;//正弦值
float cosVal = 0;//余弦值
uint s=0;//
uint group_intf = 0;//
uint num =0;//
uint i = 0;//
uint indexA  =0;//
uint indexB = 0;//
uint index_Rotate = 0;//
uint group = 0;//
uint stage = 0;//
uint g =0;//
char TempData[3];
上面是程序用到的主要变量的定义
***************************************************************************************************
下面是主体
main()
{
//倒位序算法
tempRe=re[1];re[1]=re[16];re[16]=tempRe;
tempRe=re[2];re[2]=re[8];re[8]=tempRe;
tempRe=re[3];re[3]=re[24];re[24]=tempRe;
tempRe=re[5];re[5]=re[20];re[20]=tempRe;
tempRe=re[6];re[6]=re[12];re[12]=tempRe;
tempRe=re[7];re[7]=re[28];re[28]=tempRe;
tempRe=re[9];re[9]=re[18];re[18]=tempRe;
tempRe=re[11];re[11]=re[26];re[26]=tempRe;
tempRe=re[13];re[13]=re[22];re[22]=tempRe;
tempRe=re[15];re[15]=re[30];re[30]=tempRe;
tempRe=re[19];re[19]=re[25];re[25]=tempRe;
tempRe=re[23];re[23]=re[29];re[29]=tempRe;

//*****************fft算法*************************//
    stage = 5;
for(s = 0; s < stage; s++)  //级
{
  group = N/2/(int)(0x01<<s);  //组
  group_intf = N / group;  //组间下标间隔

  for(g = 0; g < group; g++)
  {
   num = (int)(0x01 << s);  //组内蝶形数
   for (i = 0; i < num; i++)
   {
    indexA = g * group_intf + i;
    indexB = indexA + (int)(0x01<<s); //单个蝶形两个下标
    index_Rotate = i * (int)(0x01<<(stage-s-1));  //旋转因子下标
    sinVal = RSin[index_Rotate];
    cosVal = RCos[index_Rotate];
   
    tempRe = (re[indexB] * sinVal - im[indexB] * cosVal);
    tempIm = (re[indexB] * cosVal + im[indexB] * sinVal);

    re[indexB] = re[indexA] - tempRe;
    im[indexB] = im[indexA] - tempIm;
    re[indexA] = re[indexA] + tempRe;
    im[indexA] = im[indexA] + tempIm;

    }
  }
}

//求实部与虚部的平方和,再开根号

   for(i=0;i<32;i++)
   {
     tempRe=sqrt(re*re+im*im);x=tempRe;
   }
//将结果显示在1602上,用其他程序,1602显示正常
LCD_Init();
LCD_Clear();//清屏
while (1)
{  
for(i=0;i<16;i=i+4)
  {
   TempData[0]=x[i/4]/100;//分解显示信息
   TempData[1]=(x[i/4]%100)/10;
   TempData[2]=(x[i/4]%100)%10;
   LCD_Write_Char(i,0,TempData[0]+48);
   LCD_Write_Char(i+1,0,TempData[1]+48);
   LCD_Write_Char(i+2,0,TempData[2]+48);
   LCD_Write_Char(i+3,0,'#');
  }
  for(i=16;i<32;i=i+4)
  {
   TempData[0]=x[i/4]/100;//分解显示信息
   TempData[1]=(x[i/4]%100)/10;
   TempData[2]=(x[i/4]%100)%10;
   LCD_Write_Char(i-16,1,TempData[0]+48);
   LCD_Write_Char(i-16+1,1,TempData[1]+48);
   LCD_Write_Char(i-16+2,1,TempData[2]+48);
   LCD_Write_Char(i-16+3,1,'#');
  }
  while(1);
}
}
************************************
最后显示结果“y35#y35#y35#y35#”“y35#y35#y35#y35#”。
怀疑原因在 for(i=0;i<32;i++){tempRe=sqrt(re*re+im*im);x=tempRe;}部分。
若直接用x=re(正常结果,re=469,-15,-15...,-16),则469能够正常显示,后面的显示“y35”。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
机械绿藤
1楼-- · 2019-03-24 22:04
有没有人能告诉我。51做数据运算应该注意什么?
zqjqq88
2楼-- · 2019-03-25 02:38
尽量使用加减法移位等方式代替乘除法,尤其是除法!
机械绿藤
3楼-- · 2019-03-25 06:25
内容那我的程序错在哪呢?
辛昕
4楼-- · 2019-03-25 11:48
先直接在显示到1602之前,用一组明确的数据填充到tempdata里先,确定1602显示对不对?即使不是1602底层有问题,也可以把问题范围缩小到显示那一部分的代码
辛昕
5楼-- · 2019-03-25 16:14
两个疑问,进入显示死循环之前,求虚实部平方和,为什么好端端要循环32次?
辛昕
6楼-- · 2019-03-25 17:51
 精彩回答 2  元偷偷看……

一周热门 更多>