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;  

解决方案 »

  1.   

    还有啊,,FFT怎么只有实部没有虚部,怎么做谱?
      

  2.   

    我的fft是是序列的fft,程序如下:}void CMy11111View::rfft(int n, double x[])
    {
       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;
    }
    }
    }
    }
      

  3.   

    最后傅立叶的结果存入jg1数组中。 在rfft中求傅立叶变换结果,然后把前一半的数据存入jg1中,flength是2的k次方的长度。
      

  4.   

    先用sin函数做个正弦采样波性 然后调用你的FFT,看看是不是理想的结果
    把问题分开来调试
      

  5.   

    不好意思,不会传图,我说一下吧。我的文件为2756short型元素(2756*2个字节),我每次取512个元素进行傅立叶变换,在变换时将前256个元素存入一个全局数组(用于记录整个文件的变换结果)。但这样做问题就出现了。
    同样的文件,我如果对整个文件进行FFT变换(1方法),得到的波形和COOLEDIT的结果相同。但像上面那样分512个元素单独做,最后结果累加得到的结果会出现多个和1方法相同的波形,而不是一个波形。
    比如:文件1024个short型元素,用一方法绘出前512个元素,看到波形是有512个点的完整波形。而用二方法,每次取512个元素,分2此进行傅立叶变换,每次记录前256个值,最后绘出记录结果。虽然有512个点,但后256个点的波形和前256个大致相同,且两个波形和方法1的波形相同。即方法1的波形出现了两次。这是怎么回事?
      

  6.   

    有些没搞明白,,但是FFT的结果确实是是对称的