short *shiy;
double *dshiy,*dshiyy;
double dshiy1[512];
int length;
CFile f;
length=1; //flength ???????????
bool mode2=true;
int chang=0;
if(f.Open("c:\\ww3.pcm",CFile::modeRead |CFile::typeBinary))
{
length=f.GetLength();
if((length%2)!=0)
{
length=length+1;
mode2=false;
}
chang=length/2;
CString sd;
sd.Format("length is %d",chang);
MessageBox(sd);
shiy=new short[chang];
if(mode2==false)
{
f.Read(shiy,chang-1); //f.Read(shiy,(chang-1)*sizeof(short));
shiy[chang]=0; //shiy[chang-1]=0;
}
else
f.Read(shiy,chang); //f.Read(shiy,chang*sizeof(short));
f.Close();
}
CString stre;
dshiy=new double[chang];//
jg1=new double[chang]; //jg1 ??? del [] 下面的自己查吧,没耐心了
short temp=0;
length=chang;
jishu=0;
if(flength <512)
{
memset(dshiy1,0,flength);
for(int ih=0;ih <flength;ih++)
{
dshiy1[ih]=shiy[ih];
}
for(ih=flength;ih <512;ih++)
{
dshiy1[ih]=0;
}
rfft(512, dshiy1);
}
int dw=512;
while(dw <=flength)
{
memset(dshiy1,0,512);
for(int ih=0;ih <512;ih++)
{
dshiy1[ih]=shiy[ih+512*jishu];
}
rfft(512, dshiy1);
jishu=jishu+1;
dw=dw+512;
}
delete[] shiy;
delete[] dshiy;
{
int i,j,k,m,i1,i2,i3,i4,n1,n2,n4;
double a,e,cc,ss,xt,t1,t2;
for(j=1,i=1;i<36;i++)
{
m=i;
j=2*j;
if(j==n)break;
} n1=n-1;
for(j=0,i=0;i<n1;i++)
{
if(i<j)
{
xt=x[j];
x[j]=x[i];
x[i]=xt;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}for(i=0;i<n;i+=2)
{
xt=x[i];
x[i]=xt+x[i+1];
x[i+1]=xt-x[i+1];
}
n2=1; for(k=2;k<=m;k++)
{
n4=n2;
n2=2*n4;
n1=2*n2;
e=6.28318530718/n1;
for(i=0;i<n;i+=n1)
{
xt=x[i];
x[i]=xt+x[i+n2];
x[i+n2]=xt-x[i+n2];
x[i+n2+n4]=-x[i+n2+n4];
a=e;
for(j=1;j<=(n4-1);j++)
{
i1=i+j;
i2=i-j+n2;
i3=i+j+n2;
i4=i-j+n1;
cc=cos(a);
ss=sin(a);
a=a+e;
t1=cc*x[i3]+ss*x[i4];
t2=ss*x[i3]-cc*x[i4];
x[i4]=x[i2]-t2;
x[i3]=-x[i2]-t2;
x[i2]=x[i1]-t1;
x[i1]=x[i1]+t1;
}
}
}
}
把问题分开来调试
同样的文件,我如果对整个文件进行FFT变换(1方法),得到的波形和COOLEDIT的结果相同。但像上面那样分512个元素单独做,最后结果累加得到的结果会出现多个和1方法相同的波形,而不是一个波形。
比如:文件1024个short型元素,用一方法绘出前512个元素,看到波形是有512个点的完整波形。而用二方法,每次取512个元素,分2此进行傅立叶变换,每次记录前256个值,最后绘出记录结果。虽然有512个点,但后256个点的波形和前256个大致相同,且两个波形和方法1的波形相同。即方法1的波形出现了两次。这是怎么回事?