已经用其他程序试验过了,不是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”。
此帖出自小平头技术问答
//求实部与虚部的平方和,再开根号
for(i=0;i<32;i++)
{
tempRe=sqrt(re*re+im*im);x=tempRe;
}
看看这一句,x=tempRe; x在什么地方定义了?还有循环32次求模值后,x最终求的是31次模值
一周热门 更多>