📄 lp_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,factor,winnum;
double fl,fs,wc,a,s;
double h[2000];
unsigned short int hh[1000];
char fname[40];
FILE *fp;
printf ("\t\t矩形窗设计低通滤波器求任意阶抽头系数软件——Tornado\n");
printf ("\n请输入低通滤波器的阶数N:");
scanf ("%d",&n);
printf ("\n请输入低通滤波器的截至频率:");
scanf ("%lf",&fl);
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);
wc=(2*pi*fl)/fs;
a=(n-1)/2.0;
for(i=0;i<=n1;i++)
{
s=i-a;
if(s!=0)
h[i]=(sin(wc*s)/(pi*s));
else
h[i]=wc/pi;
h[i]=h[i]*windows(winnum,i);
h[n-i-1]=h[i];
}
//printf ("\n请输入保存输出数据的文件名:");
//scanf ("%s",fname);
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 + -