fir滤波器算法c语言程序,FIR滤波器设计C语言程序
實(shí)際可運(yùn)行的FIR濾波器系數(shù)設(shè)計(jì)的C語言程序
#include"math.h"
#include"stdio.h"
/*n:濾波器的階數(shù),n是奇數(shù)時(shí)可用來設(shè)計(jì)各種濾波器
band:濾波器類型1、2、3、4分別對(duì)應(yīng)低通,高通,帶通,帶阻
fln:通帶下邊界頻率
fhn:通帶上邊界頻率
wn:窗函數(shù)的類型1-7分別對(duì)應(yīng)
h:長(zhǎng)度為n+1,存放濾波器的系數(shù)
fs:采樣頻率*/
void firwin(n,band,fln,fhn,wn,h)
int n,band,wn;
double fln,fhn,h[];
{
int i,n2,mid;
double s,pi,wc1,wc2,beta,delay,fs;
double window();//窗函數(shù)的計(jì)算
beta=0.0;
if(wn==7)//只有凱塞窗需要輸入系數(shù)beta
{printf("input beta parameter of Kaiser window(2
scanf("%1f",&beta);
}
pi=4.0*atan(1.0);//pi=PI;
if((n%2)==0)/*如果階數(shù)n是偶數(shù)*/
{n2=n/2+1;/**/
mid=1;//
}
else
{n2=n/2;//n是奇數(shù),則窗口長(zhǎng)度為偶數(shù)
mid=0;//
}
delay=n/2.0;
wc1=2.0*pi*fln;//
if(band>=3) /*先判斷用戶輸入的數(shù)據(jù),如果band參數(shù)大于3*/
{wc2=2.0*pi*fhn;}
switch(band)
{
case 1:
{for(i=0;i<=n2;i++)
{s=i-delay;//
h[i]=(sin(wc1*s/fs)/(pi*s))*window(wn,n+1,i,beta);//低通,窗口長(zhǎng)度=階數(shù)+1,故為n+1
h[n-i]=h[i];
}
if(mid==1)h[n/2]=wc1/pi;//n為偶數(shù)時(shí),修正中間值系數(shù)
break;
}
case 2:
{for(i=0;i<=n2;i++)
{s=i-delay;
h[i]=(sin(pi*s)-sin(wc1*s/fs))/(pi*s);//高通-//對(duì)
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1)h[n/2]=1.0-wc1/pi;//對(duì)
break;
}
case 3:
{for(i=0;i
{s=i-delay;
h[i]=(sin(wc2*s/fs)-sin(wc1*s/fs))/(pi*s);//帶通-//對(duì)
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1)h[n/2]=(wc2-wc1)/pi;//對(duì)
break;
}
case 4:
{for(i=0;i<=n2;i++)
{s=i-delay;
h[i]=(sin(wc1*s/fs)+sin(pi*s)-sin(wc2*s/fs))/(pi*s);//帶阻-//對(duì)
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1)h[n/2]=(wc1+pi-wc2)/pi;
break;
}
}
}
/*返回窗函數(shù)的表達(dá)式
n:窗口長(zhǎng)度
type:選擇窗函數(shù)的類型
beta:生成凱塞窗的系數(shù)*/
static double window(type,n,i,beta)
int i,n,type;
double beta;
{
int k;
double pi,w;
double kaiser();
pi=4.0*atan(1.0);//pi=PI;
w=1.0;
switch(type)
{
case 1:
{w=1.0;//矩形窗
break;
}
case 2:
{k=(n-2)/10;
if(i<=k)
w=0.5*(1.0-cos(i*pi/(k+1)));//圖基窗
break;
}
case 3:
{w=1.0-fabs(1.0-2*i/(n-1.0));//三角窗
break;
}
case 4:
{w=0.5*(1.0-cos(2*i*pi/(n-1)));//漢寧窗
break;
}
case 5:
{w=0.54-0.46*cos(2*i*pi/(n-1));//海明窗
break;
}
case 6:
{w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));//布萊克曼窗
break;
}
case 7:
{w=kaiser(i,n,beta);//凱塞窗
break;
}
}
return(w);
}
static double kaiser(i,n,beta)//因凱塞窗的表達(dá)式復(fù)雜,調(diào)用貝塞爾窗表達(dá)式
int i,n;
double beta;
{
double a,w,a2,b1,b2,beta1;
double bessel0();
b1=bessel0(beta);
a
總結(jié)
以上是生活随笔為你收集整理的fir滤波器算法c语言程序,FIR滤波器设计C语言程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA将项目上传至码云/GitHub托
- 下一篇: java飞机大战boos代码_飞机大战