⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 基于CCS开发的低通滤波器
💻 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 + -