📄 quan.c
字号:
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
# include <math.h>
# define PI 3.14159
# define N 512
main()
{void ss(float xr[],float xi[],int n);
void fft(float xr[],float xi[],int m,int n);
void f1(float f,float x[],int n);
void f2(float f,float x[],int n);
void f3(float x[],int n);
void draw11(float x[],int n);
void draw12(float x[],int k);
void draw21(float x[],int n);
void draw22(float x[],int n);
void jiafd(float x[],float z[],int m,int p);
void juanji(float x[],int n,float h[],int m,float y[]);
void liufd(float x[],float z[],int n,int m,int c,int p);
int d=DETECT,v=VGAHI;
int k,i,j,l;
int n,c,m,p;
float f,t;
int q;
float x[N],h[N],y[N],z[N]={0},z1[N]={0},z2[N];
float zr[N]={0},zi[N]={0};
float hr[N]={0},hi[N]={0};
float yr[N]={0},yi[N]={0};
for(q=0;q<2;q++)
{
printf("chose the signals:\n");
printf("1:sin......:\n");
printf("2:cos......:\n");
printf("in put the number:\n");
scanf("%d",&k);
if(k==1)
{printf("in put f,n:\n");
scanf("%f%d",&f,&n);
f1(f,x,n);}
else if(k==2)
{printf("in put f,n:\n");
scanf("%f%d",&f,&n);
f2(f,x,n);}
printf("in put c of h[n]:\n");
scanf("%d",&c);
f3(h,c);
printf("in put the way to pass:\n");
printf("chongdiexiangjia.......:1\n");
printf("chongdiebaoliu.........:2\n");
scanf("%d",&k);
if(k==1)
{printf("in put the per points\n");
scanf("%d",&m);
for(j=0;j<n/m;j++)
{for(k=0;k<(m+c);k++)
z2[k]=0;
jiafd(x,z1,m,j);
juanji(z1,m,h,c,z2);
for(i=0;i<=(c+m-2);i++)
y[j*m+i]=y[j*m+i]+z2[i];
}
initgraph(&d,&v,"");
cleardevice();
draw11(x,n);
draw12(h,c);
draw21(y,(n+c-1));
closegraph();}
if(k==2)
{printf("in put the per points\n");
scanf("%d",&m);
printf("In put the numbers of FFT:\n");
scanf("%d",&l);
initgraph(&d,&v,"");
cleardevice();
for(j=0;j<=n/m;j++)
{for(k=0;k<l;k++)
{zr[k]=0;zi[k]=0;hr[k]=0;hi[k]=0;}
liufd(x,z,n,m,c,j); /*m>c*/
for(i=0;i<(c+m);i++)
zr[i]=z[i];
fft(zr,zi,1,l);
for(i=0;i<c;i++)
hr[i]=h[i];
fft(hr,hi,1,l);
for(i=0;i<l;i++)
{zr[i]=zr[i]*hr[i]-zi[i]*hi[i];
zi[i]=zr[i]*hi[i]+zi[i]*hr[i];
}
fft(zr,zi,-1,l);
for(i=0;i<m;i++)
{yr[j*m+i]=yr[j*m+i]+zr[c+i-1];
yi[j*m+i]=yi[j*m+i]+zi[c+i-1];
}
}
draw11(x,n);
draw12(h,c);
draw21(yr,(n+c-1));
draw22(yi,(n+c-1));
closegraph();}
}
}
void ss(float xr[],float xi[],int n)
{int i=0,j,s1;
float a,bj;
for(j=1;j<n;j++)
{for (s1=n/2;s1<=i;s1=s1/2)
{i=i-s1;
}
i=i+s1;
if(i>j)
{a=xr[i];
bj=xi[i];
xr[i]=xr[j];
xi[i]=xi[j];
xr[j]=a;
xi[j]=bj;
}
}
}
void fft(float xr[],float xi[],int m,int n)
{
int loop1,loop2,loop3,le,lel,ip,i=1;
float wr,wi,tr,ti,url,ur,ui,ls;
ls=log(n)/log(2);
ss(xr,xi,n);
for(loop1=1;loop1<=ls;loop1++)
{ ur=1.0;
ui=0.0;
le=pow(2,loop1);
lel=le/2;
wr=cos(PI*m/lel);
wi=-sin(PI*m/lel);
for(loop2=0;loop2<lel;loop2++)
{ for(loop3=loop2;loop3<n;loop3=loop3+le)
{ ip=loop3+lel;
tr=ur*xr[ip]-ui*xi[ip];
ti=ur*xi[ip]+ui*xr[ip];
xr[ip]=xr[loop3]-tr;
xi[ip]=xi[loop3]-ti;
xr[loop3]=tr+xr[loop3];
xi[loop3]=ti+xi[loop3];
}
url=wr*ur-ui*wi;
ui=wr*ui+ur*wi;
ur=url;
}
}
if(m==-1)
{ for(i=0;i<n;i++)
{xr[i]=xr[i]/n;
xi[i]=xi[i]/n;
}
}
}
void draw11(float x[],int n)
{int i,j;
setcolor(3);
line(10,20,600,20);
line(10,20,10,100);
line(10,100,600,100);
line(10,60,600,60);
getch();
setcolor(4);
for(i=0;i<n;i++)
{j=x[i]*30;
line(10+i,60,10+i,60-j);
}
setcolor(1);
for(i=1;i<n;i++)
line (10+(i-1),60-x[i-1]*30,10+i,60-x[i]*30);
getch();
}
void draw12(float x[],int n)
{int i,j;
setcolor(3);
line(10,130,600,130);
line(10,130,10,210);
line(10,210,600,210);
line(10,170,600,170);
getch();
setcolor(4);
for(i=0;i<n;i++)
{j=x[i]*50;
line(10+i*4,170,10+i*4,170-j);
}
setcolor(1);
for(i=1;i<n;i++)
line (10+(i-1)*4,170-x[i-1]*50,10+i*4,170-x[i]*50);
getch();
}
void draw21(float x[],int n)
{int i;
float j=0;
setcolor(3);
line(10,240,600,240);
line(10,240,10,340);
line(10,340,600,340);
line(10,290,600,290);
getch();
setcolor(4);
for(i=0;i<n;i++)
{j=x[i]*30;
line(10+i,290,10+i,290-j);
}
setcolor(1);
for(i=1;i<n;i++)
line(10+(i-1),290-x[i-1]*30,10+i,290-x[i]*30);
setcolor(15);
if(1)
line(10+14,290,10+14,290-x[14]*30);
getch();
}
void draw22(float x[],int n)
{int i,j;
setcolor(3);
line(10,370,600,370);
line(10,370,10,470);
line(10,470,600,470);
line(10,420,600,420);
getch();
setcolor(4);
for(i=0;i<n;i++)
{j=x[i]*30;
line(10+i,420,10+i,420-j);
}
setcolor(1);
for(i=1;i<n;i++)
line(10+(i-1),420-x[i-1]*30,10+i,420-x[i]*30);
getch();
}
void f1(float f,float x[],int n)
{int i;
for(i=0;i<n;i++)
x[i]=sin(2*PI*f*i);
}
void f2(float f,float x[],int n)
{int i;
for(i=0;i<n;i++)
x[i]=cos(2*PI*f*i);
}
void f3(float x[],int n)
{int i;
float p;
for(i=0;i<((n-1)/2);i++)
{p=2/PI;
x[2*i]=p/(2*i-15);
x[2*i-1]=0;
}
}
void jiafd(float x[],float z[],int m,int p)
{int i;
for(i=0;i<m;i++)
z[i]=x[p*m+i];
}
void liufd(float x[],float z[],int n,int m,int c,int p)
{int i;
if(p==0)
{for(i=0;i<(c-1);i++)
z[i]=0;
for(i=(c-1);i<=(c+m-2);i++)
z[i]=x[p*m+i-(c-1)];}
else if(p>0&&p<(n/m))
for(i=0;i<=(c+m-2);i++)
z[i]=x[p*m+i-(c-1)];
else if(p==(n/m))
{for(i=0;i<m;i++)
z[i]=x[p*m+i-(c-1)];
for(i=m;i<=(c+m-2);i++)
z[i]=0;}
}
void juanji(float x[],int n,float h[],int m,float y[])
{int i,j;
for(i=0;i<(n+m-1);i++)
{if(i<=m-2)
for(j=0;j<=i;j++)
y[i]=y[i]+x[j]*h[i-j];
else if(i>=(m-1)&&i<=n)
for(j=i-30;j<=i;j++)
y[i]=y[i]+x[j]*h[i-j];
else if(i>n&&i<(n+m-2))
for(j=i-30;j<=200;j++)
y[i]=y[i]+x[j]*h[i-j];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -