www.pudn.com > kkfft_dualinput.rar > KKFFT.C


 
 
  #include 
  #include "stdio.h" 
  #include "math.h" 
  void kkfft(pr,pi,n,k,fr,fi,l,il) 
  int n,k,l,il; 
  double pr[],pi[],fr[],fi[]; 
  { int it,m,is,i,j,nv,l0; 
    double p,q,s,vr,vi,poddr,poddi; 
    for (it=0; it<=n-1; it++) 
      { m=it; is=0; 
        for (i=0; i<=k-1; i++) 
          { j=m/2; is=2*is+(m-2*j); m=j;} 
        fr[it]=pr[is]; fi[it]=pi[is]; 
      } 
    pr[0]=1.0; pi[0]=0.0; 
    p=6.283185306/(1.0*n); 
    pr[1]=cos(p); pi[1]=-sin(p); 
    if (l!=0) pi[1]=-pi[1]; 
    for (i=2; i<=n-1; i++) 
      { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1]; 
        s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]); 
        pr[i]=p-q; pi[i]=s-p-q; 
      } 
    for (it=0; it<=n-2; it=it+2) 
      { vr=fr[it]; vi=fi[it]; 
        fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1]; 
        fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1]; 
      } 
    m=n/2; nv=2; 
    for (l0=k-2; l0>=0; l0--) 
      { m=m/2; nv=2*nv; 
        for (it=0; it<=(m-1)*nv; it=it+nv) 
          for (j=0; j<=(nv/2)-1; j++) 
            { p=pr[m*j]*fr[it+j+nv/2]; 
              q=pi[m*j]*fi[it+j+nv/2]; 
              s=pr[m*j]+pi[m*j]; 
              s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]); 
              poddr=p-q; poddi=s-p-q; 
              fr[it+j+nv/2]=fr[it+j]-poddr; 
              fi[it+j+nv/2]=fi[it+j]-poddi; 
              fr[it+j]=fr[it+j]+poddr; 
              fi[it+j]=fi[it+j]+poddi; 
            } 
      } 
    if (l!=0) 
      for (i=0; i<=n-1; i++) 
        { fr[i]=fr[i]/(1.0*n); 
          fi[i]=fi[i]/(1.0*n); 
        } 
    if (il!=0) 
      for (i=0; i<=n-1; i++) 
	{ pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]); 
 
          if (fabs(fr[i])<0.000001*fabs(fi[i])) 
            { if ((fi[i]*fr[i])>0) pi[i]=90.0; 
              else pi[i]=-90.0; 
            } 
          else 
            pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306; 
        } 
    return; 
  } 
 
  main() 
  { int i,j,n; 
    char no; 
    double pr[64],pi[64],fr[64],fi[64]; 
    void output(); 
window(15,5,70,30); 
textbackground(1); 
clrscr(); 
loop:	 printf("\n                输出富立业变换的序列:1"); 
	 printf("\n                输出富立业变换的实部:2"); 
	 printf("\n                输出富立业变换的虚部:3"); 
	 printf("\n                输出富立业变换的模:4"); 
	 printf("\n                输出富立业变换的幅角:5"); 
	 printf("\n                输出逆富立业变换的模:6"); 
	 printf("\n                结束:7\n"); 
    printf("please input the number from 1 to 7:"); 
    scanf("%d",&n); 
    switch(n) 
    { 
      case    1:    printf("输出富立业变换的序列");    break; 
      case    2:    printf("输出富立业变换的实部");    break; 
      case    3:    printf("输出富立业变换的虚部");    break; 
      case    4:    printf("输出富立业变换的模");      break; 
      case    5:    printf("输出富立业变换的幅角");    break; 
      case    6:    printf("输出逆富立业变换的模");    break; 
      default:      break; 
    } 
 
    for (i=0; i<=63; i++) 
      { pr[i]=exp(-0.1*(i+0.5)); pi[i]=0.0;} 
    printf("\n"); 
        if(n==1){ 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",pr[4*i+j]); 
	printf("\n"); 
	} 
      getch(); 
      goto loop; 
/*  printf("\n继续操做吗?(y/n)"); 
   scanf("%d",&no); 
  switch(no) 
  { case 'y':  goto loop; break; 
    default:break; 
     }    */ 
     } 
    if(n==2){ 
    printf("\n"); 
    kkfft(pr,pi,64,6,fr,fi,0,1); 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",fr[4*i+j]); 
        printf("\n"); 
      } 
    getch(); 
    goto loop; 
    } 
    if(n==3){ 
    printf("\n"); 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",fi[4*i+j]); 
        printf("\n"); 
      } 
    getch(); 
    goto loop; 
    } 
    if(n==4){ 
    printf("\n"); 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",pr[4*i+j]); 
	printf("\n"); 
	output(pr[4*i+j]); 
      } 
    getch(); 
    goto loop; 
    } 
    if(n==5){ 
    printf("\n"); 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",pi[4*i+j]); 
        printf("\n"); 
      } 
    getch(); 
    goto loop; 
    } 
    if(n==6){ 
    printf("\n"); 
    kkfft(fr,fi,64,6,pr,pi,1,1); 
    for (i=0; i<=15; i++) 
      { for (j=0; j<=3; j++) 
          printf("%e   ",fr[4*i+j]); 
        printf("\n"); 
      } 
    getch(); 
    goto loop; 
    } 
    printf("\n"); 
  } 
 
 
 
void output(double *data1) 
{ 
  int n; 
  int gdriver=DETECT,gmode,errorcode; 
  initgraph(&gdriver,&gmode," "); 
  errorcode=graphresult(); 
  if(errorcode!=grOk) 
 { 
  printf("Graphics error:%s\n",grapherrormsg(errorcode)); 
 } 
  setbkcolor(1); 
  setcolor(3); 
  line(0,450,640,450); 
  line(10,0,10,480); 
  for(n=0;n<64;n++) 
   { setcolor(6); 
   line(10+5*n,450,10+5*n,450-data1[n]); 
   } 
  getch(); 
  closegraph(); 
 }