📄 filter.c
字号:
#include<stdio.h>
#include<math.h>
static double pi;
static int n;
double windows(int winnum,int wn);
int main()
{
int n1,i,j,band,factor,winnum;
double fl,fh,fs,wc,w1,w2,a,s;
double h[2000];
unsigned short int hh[1000];
char fname[40];
FILE *fp;
printf ("\t\t矩形窗设计低通滤波器求任意阶抽头系数软件——Tornado\n");
printf ("\t\t\t 作者:卢鸥 班级:04通信1班\n");
printf ("\n1--低通 2--高通 3--带通 4--带阻\n");
printf ("\n请选滤波器类型:");
scanf ("%d",&band);
printf ("\n请输入低通滤波器的阶数N:");
scanf ("%d",&n);
switch(band)
{
case 1:
printf ("\n请输入低通滤波器的截止频率:");
scanf ("%lf",&fl);
break;
case 2:
printf ("\n请输入高通滤波器的截止频率:");
scanf ("%lf",&fl);
break;
case 3:
printf ("\n请输入带通滤波器的低频截止频率:");
scanf ("%lf",&fl);
printf ("\n请输入带通滤波器的高频截止频率:");
scanf ("%lf",&fh);
break;
case 4:
printf ("\n请输入带阻滤波器的低频截止频率:");
scanf ("%lf",&fl);
printf ("\n请输入带阻滤波器的高频截止频率:");
scanf ("%lf",&fh);
break;
}
printf ("\n请输入低通滤波器的采样频率:");
scanf ("%lf",&fs);
printf ("\n1--矩形窗 2--三角窗 3--汉宁窗 4--海明窗 5--布拉克曼窗\n");
printf ("\n请选择窗口函数:");
scanf ("%d",&winnum);
(n%2)==0 ? (n1=n/2-1) : (n1=n/2);
pi=4.0*atan(1.0);
if(band<=2)
wc=(2*pi*fl)/fs;
else
{
w1=(2*pi*fl)/fs;
w2=(2*pi*fh)/fs;
}
a=(n-1)/2.0;
for(i=0;i<=n1;i++)
{
s=i-a;
switch(band)
{
case 1:
if(s!=0)
h[i]=h[i]=(sin(wc*s)/(pi*s));
else
h[i]=h[i]=wc/pi;
break;
case 2:
if(s!=0)
h[i]=(sin(pi*s)-sin(wc*s))/(pi*s);
else
h[i]=1-wc/pi;
break;
case 3:
if(s!=0)
h[i]=(sin(w2*s)-sin(w1*s))/(pi*s);
else
h[i]=(w2-w1)/pi;
break;
case 4:
if(s!=0)
h[i]=(sin(pi*s)+sin(w1*s)-sin(w2*s))/(pi*s);
else
h[i]=(w1-w2+pi)/pi;
break;
}
h[i]=h[i]*windows(winnum,i);
h[n-i-1]=h[i];
}
if((fp=fopen("h(n).txt","w"))==NULL)
{
printf ("\n打开文件错误\n");
exit(1);
}
for(i=0;i<=n1;i++)
{
j=n-i-1;
fprintf(fp,"h(%2d)=%12.8lf=h(%2d)\n",i,h[i],j);
}
printf ("\n请输入影响因子:");
scanf ("%d",&factor);
for(i=0;i<=n1;i++)
{
hh[i]=h[i]*factor;
j=n-i-1;
//fprintf(fp,"h(%2d)=%4x=h(%2d)\n",i,hh[i],j);
}
fprintf(fp,"\n%d阶抽头系数h(n):\n",n);
for(i=0;i<=n1;i++)
fprintf(fp,"0x%x,",hh[i]);
(n%2==0) ? (i=n1) : (i=n1-1);
for(;i>=1;i--)
fprintf(fp,"0x%x,",hh[i]);
fprintf(fp,"0x%x",hh[i]);
printf ("\n计算完毕,");
system("pause");
return 0;
}
double windows(int winnum,int wn)
{
double w;
switch(winnum)
{
case 1: w=1;
break;
case 2:
wn<=(n-1)/2 ? (w=2*wn/(double)(n-1)) : (w=2-2*wn/(double)(n-1));
break;
case 3:
w=0.5*(1.0-cos(2*wn*pi/(n-1)));
break;
case 4:
w=0.54-0.46*cos(2*wn*pi/(n-1));
break;
case 5:
w=0.42-0.5*cos(2*wn*pi/(n-1))+0.08*cos(4*wn*pi/(n-1));
break;
}
return w;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -