在调用语句的时候不会进入函数,直接进行下一条语句
fft(ceshi,R,zm,zinv);
input=_IQ20(alfa);
例如,在上面两句附近分别设置断点,正常应该是在fft调用时进入子程序,但并没有进入,而是直接进行了input语句
这是为什么
函数语句如下
void fft(float sr[],float sx[],int m0,int inv)
{
int i,j,lm,li,k,lmx,np,lix,mm2;
_iq t1,t2,c,s,cv,st,ct,sri,srk,srj,sxk,sxi,sxj;
if(m0<0)
return;
lmx=1;
for(i=1;i<=m0;++i)
lmx+=lmx; //form 2**m0
cv=_IQ20div(_IQ20(PI),_IQ20(lmx));
//cv=2.0*PI/(double)lmx;
ct=_IQ20cos(cv);
//ct=cos(cv);
st=_IQ20sin(cv);
st=_IQ20mpy(_IQ20(-inv),st);
//st=-inv*sin(cv);
np=lmx;
mm2=m0-2;
for(i=1;i<=mm2;++i)
{
lix=lmx;lmx/=2;
c=ct;s=st;
for(li=0;li<np;li+=lix)
{
j=li;k=j+lmx;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
srj=srj+srk;
sxj=sxj+sxk;
srk=t1;
sxk=t2;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
//sr[j]+=sr[k];sx[j]+=sx[k];sr[k]=t1;sx[k]=t2;
++j;++k;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
srj=srj+srk;
sxj=sxj+sxk;
//sr[j]+=sr[k];sx[j]+=sx[k];
srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
//sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
}
for(lm=2;lm<lmx;++lm)
{
cv=c;
c=_IQ20mpy(c,ct)-_IQ20mpy(st,s);
s=_IQ20mpy(st,cv)+_IQ20mpy(ct,s);
//c=ct*c-st*s;s=st*cv+ct*s;
for(li=0;li<np;li+=lix)
{
j=li+lm;k=lmx+j;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
srj=srj+srk;
sxj=sxj+sxk;
//sr[j]+=sr[k];sx[j]+=sx[k];
srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
//sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
}
}
cv=ct;
ct=_IQ20mpy(_IQ20(2.0),_IQ20mpy(ct,ct))-_IQ20(1.0);
st=_IQ20mpy(_IQ20(2.0),_IQ20mpy(st,cv));
//ct=2.0*ct*ct-1.0;st=2.0*st*cv;
}
if(m0>=2)
for(li=0;li<np;li+=4)
{
j=li;k=j+2;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
srj=srj+srk;
sxj=sxj+sxk;
srk=t1;
sxk=t2;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
//sr[j]+=sr[k];
//sx[j]+=sx[k];
//sr[k]=t1;sx[k]=t2;
++j;++k;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
srj=srj+srk;
sxj=sxj+sxk;
srk=_IQ20mpy(_IQ20(inv),t2);
sxk=_IQ20mpy(_IQ20(-inv),t1);
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
//sr[j]+=sr[k];sx[j]+=sx[k];
//sr[k]=inv*t2;sx[k]=-inv*t1;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
}
for(li=0;li<np;li+=2)
{
j=li;k=j+1;
srj=_IQ20(sr[j]);//dingyi
srk=_IQ20(sr[k]);//
sxj=_IQ20(sx[j]);//
sxk=_IQ20(sx[k]);//
t1=srj-srk;
t2=sxj-sxk;
srj=srj+srk;
sxj=sxj+sxk;
srk=t1;
sxk=t2;
//t1=sr[j]-sr[k];t2=sx[j]-sx[k];
//sr[j]+=sr[k];sx[j]+=sx[k];
//sr[k]=t1;sx[k]=t2;
sr[k]=_IQ20toF(srk);
sr[j]=_IQ20toF(srj);
sx[k]=_IQ20toF(sxk);
sx[j]=_IQ20toF(sxj);
}
lmx=np/2;j=0;
for(i=1;i<np-1;++i)
{
k=lmx;
while(k<=j)
{
j-=k;k/=2;
}
j+=k;
if(i<j)
{
//t1=sr[j];sr[j]=sr[i];sr[i]=t1;
//t1=sx[j];sx[j]=sx[i];sx[i]=t1;
srj=_IQ20(sr[j]);//dingyi
sri=_IQ20(sr[i]);//sri 记得定义!!!
sxj=_IQ20(sx[j]);//
sxi=_IQ20(sx[i]);
t1=srj;srj=sri;sri=t1;
t1=sxj;sxj=sxi;sxi=t1;
sr[i]=_IQ20toF(sri);
sr[j]=_IQ20toF(srj);
sx[i]=_IQ20toF(sxi);
sx[j]=_IQ20toF(sxj);
}
}
if(inv!=-1)
return;
//t1=1.0/np;
t1=_IQ20div(_IQ20(1.0),_IQ20(np));
for(i=0;i<np;++i)
{
sri=_IQ20(sr[i]);
sxi=_IQ20(sx[i]);
sri=_IQ20mpy(sri,t1);
sxi=_IQ20mpy(sxi,t1);
//sr[i]*=t1;sx[i]*=t1;
sr[i]=_IQ20toF(sri);
sx[i]=_IQ20toF(sxi);
}
}
Coffee Ge73:
这个问题可以转一下C2000版块的工程师
Frank Xiao:
你好,可以下载个FFT的例程对比下,怀疑是否还需要用#include 定义下,谢谢。
user4242688:
回复 Frank Xiao:
28027没有FFT的例程
Frank Xiao:
回复 user4242688:
你好,28035或者28335有没有类似例程,道理一样的,我估计你是缺少些什么东西,头文件或者定义什么的,谢谢。
Jason Shen:
您好,您换个函数名试下?或者一个可以执行的空函数,然后将FFT代码移到这个空函数里。
Frank Xiao:
回复 Jason Shen:
你好,很久以前用的C2000基本忘记了,建议去C2000板块去确认下结果,谢谢。