网上找了一个代码,vc6.0编译通过,运行没反应

GCLNB 2020-07-10 08:42:28
#include <stdio.h>
#include "iirbcf.c"
#include "gainc.c"

int main(int argc, char *argv[])
{
int i,k,n,ns;
double a[50],b[50],x[1000],y[1000];
double f1,f2,f3,f4,fs,flc,fls,fhc,fhs,freq,db;

char fname[40];
FILE *fp;
db=50;
ns=2;
n=4;
flc=10;
fhc=500;
f1=0;
f2=flc;
f3=fhc;
f4=0;
fs=2000;
f1=f1/fs;
f2=f2/fs;
f3=f3/fs;
f4=f4/fs;
iirbcfpass(ns,n,f1,f2,f3,f4,db,b,a);
for (k=0;k<ns ;k++ )
{
printf("\nsection %d\n\n",k+1);
for (i=0;i<=n ;i++ )
{
printf("b[%d][%d]=%10.7if",k,i,b[k*(n+1)+i]);
if (((i%2==0)&&(i!=0)))
{
printf("\n");
}
}
printf("\n");
}
printf("\nenter file name f magnitude response\n");
scanf("%s,fname");
if((fp=fopen(fname,"w"))==NULL)
{
printf("cannot open file %s\n",fname);
exit(0);
}
gainc(b,a,n,ns,x,y,1000,2);
for (i=0;i<100 ;i++ )
{
freq=i*0.5/1000.0;
fprintf(fp,"%if %if\n",freq,x[i]);
}
fclose(fp);
}
...全文
141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
GCLNB 2020-07-11
  • 打赏
  • 举报
回复
#include <stdio.h> #include "math.h" void gainc(b,a,n,ns,x,y,len,sign) int n,ns,len,sign; double b[],a[],x[],y[]; { int i,j,k,n1; double ar,ai,br,bi,zr,zi,im,re,den,numr,numi,freq,temp; double hr,hi,tr,ti; n1=n+1; for (k=0;k<len ;k++ ) { freq=k*0.5/(len-1); zr=cos(-8.0*atan(1.0)*freq); zi=sin(-8.0*atan(1.0)*freq); x[k]=1.0; y[k]=0.0; for (j=0;j<ns ;j++ ) { br=0.0; bi=0.0; for (i=n;i>0 ;i-- ) { re=br; im=bi; br=(re+b[j*n1+i])*zr-im*zi; bi=(re+b[j*n1+i])*zi+im*zr; } ar=0.0; ai=0.0; for (i=n;i>0 ;i-- ) { re=ar; im=ai; ar=(re+a[j*n1+i])*zr-im*zi; ai=(re+a[j*n1+i])*zi+im*zr; } br=br+b[j*n1+0]; ar=ar+1.0; numr=ar*br+ai*bi; numi=ar*bi-ai*br; den=ar*ar+ai*ai; hr=numr/den; hi=numi/den; tr=x[k]*hr-y[k]*hi; ti=x[k]*hi+y[k]*hr; x[k]=tr; y[k]=ti; } switch(sign) { case 1: { temp=sqrt(x[k]*x[k]+y[k]*y[k]); if (temp!=0.0) { y[k]=atan2(y[k],x[k]); } else { y[k]=0.0; } x[k]=temp; break; } case 2: { temp=x[k]*x[k]+y[k]*y[k]; if (temp!=0.0) { y[k]=atan2(y[k],x[k]); } else { temp=1.0e-40; y[k]=0.0; } x[k]=10.0*log10(temp); } } } } 这是gainc程序,这是所有程序,
GCLNB 2020-07-11
  • 打赏
  • 举报
回复
#include <stdio.h> #include "math.h" static void bwtf(ln,l,n,k,d,c); static void fblt(d,c,n,fln,fhn,b,a); static double combin(i1,i2); static void bilinear(d,c,b,a,n); void iirbcfpass(ns,n,f1,f2,f3,f4,db,b,a) double b[],a[],f1,f2,f3,f4,db; int ns,n; { int k; double omega,lamda,esslon,fl,fh; //带通不需要omega;lamda;warp();bpsub();omin(),cosh1() void bwtf(); double cosh1(),warp(),bpsub(),omin(); void fblt(); fl=f2; fh=f3; for (k=0;k<ns;k++ ) { bwtf(2*ns,k,4,b,a); //求归一化L阶的每一阶的分子、分母系数 fblt(b,a,n,fl,fh,&b[k*(n+1)+0],&a[k*(n+1)+0]); //计算出低通滤波器系数,然后转化成为带通系数 } } static void bwtf(ln,l,n,k,d,c) int k,ln,n; double d[],c[]; { int i; double pi,tmp; pi=4.0*atan(1.0); d[0]=1.0; c[0]=1.0; for (i=1;i<n ;i++ ) { d[i]=0.0; c[i]=0.0; } tmp=(k+1)-(ln+1.0)/2.0; if (tmp==0.0) { c[1]=1.0; } else { c[1]=-2.0*cos((2*(k+1)+ln-1)*pi/(2*ln)); c[2]=1.0; } } #include "stdlib.h" static void fblt(d,c,n,fln,fhn,b,a) int n; double fln,fhn,d[],c[],b[],a[]; { int i,k,m,n1,n2,ls; double pi,w,w0,w1,w2,tmp,tmpd,tmpc,*work; double combin(); void bilinear(); pi=4.0*atan(1.0); w1=tan(pi*fln); for (i=n;i>=0 ;i-- ) { if(c[i]!=0.0 || (d[i]!=0.0)) break; } m=i; //标示非0值的位置 n2=2*m; n1=n2+1; work=malloc(n1*n1*sizeof(double)); w2=tan(pi*fhn); w=w2-w1; w0=w1*w2; for (i=0;i<=n2 ;i++ ) { work[0*n1+i]=0.0; //小心1与l work[1*n1+i]=0.0; } for (i=0;i<=m ;i++ ) { tmpd=d[i]*pow(w,(m-i)); tmpd=c[i]*pow(w,(m-i)); for (k=0;k<=i ;k++ ) { ls=m+i-2*k; tmp=combin(i,i)/(combin(k,k)*combin(i-k,i-k)); work[0*n1+ls]+=tmpd*pow(w0,k)*tmp; work[1*n1+ls]+=tmpc*pow(w0,k)*tmp; } } for (i=0;i<=n2 ;i++ ) { d[i]=work[0*n1+i]; c[i]=work[1*n1+i]; } free(work); bilinear(d,c,b,a,n);//合并每个级的系数到一个大的传递函数系数集合 } static double combin(i1,i2) int i1,i2; { int i; double s; s=1.0; if (i2==0) return(s); for (i=i1;i>(i1-i2) ;i-- ) { s*=i; } return(s); } static void bilinear(d,c,b,a,n) int n; double d[],c[],b[],a[]; { int i,j,n1; double sum,atmp,scale,*temp; n1=n+1; temp=malloc(n1*n1*sizeof(double)); for (j=0;j<=n ;j++ ) { temp[j*n1+0]=1.0; } sum=1.0; for (i=1;i<=n ;i++ ) { sum=sum*(double)(n-i-1)/(double)i; temp[0*n1+i]=sum; } for (i=1;i<=n ;i++ ) for (j=1;j<=n ;j++ ) { temp[j*n1+i]=temp[(j-1)*n1+i]-temp[j*n1+i-1]-temp[(j-1)*n1+i-1]; } for (i=n;i>=0 ;i-- ) { b[i]=0.0; atmp=0.0; for (j=0;j<=n ;j++ ) { b[i]=b[i]+temp[j*n1+i]*d[j]; atmp=atmp+temp[j*n1+i]*c[j]; } scale=atmp; if (i!=0) { a[i]=atmp; } } for (i=0;i<=n ;i++ ) { b[i]=b[i]/scale; a[i]=a[i]/scale; } a[0]=1.0; free(temp); } 这是iirbcf程序
自信男孩 2020-07-10
  • 打赏
  • 举报
回复
iirbcfpass

代码不全呢,这个函数的定义去哪里了?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧