📄 低通fir滤波器设计.c
字号:
函数功能:利用窗口法设计低通FIR数字滤波器。
参数:window_type是所选择的窗口类型,1至8分别为矩形窗、汉宁窗、海明窗、布莱克曼窗、三项窗、最小三项窗、四项窗,最小四项窗。FH为低通滤波器的数字截止频率(0-1),DF为过渡带宽;*h为存放所设计的滤波器系数的地址指针,程序结束返回滤波器长度n。
特点:该算法可用多种窗口设计FIR滤波器,以满足不同阻带衰减和过渡带宽的需求(过渡带宽不小于0.05)。当需要过渡带宽小于0.05时,要增加中间工作单元w的尺寸。
int LowpassFIR(int window_type,float FH,float DF,float *h)
{
float w[200];
int i,j,n;
int NA1,NS1,I2,IS,IV;
float a[4],D;
switch(window_type)
{case 1: a[0]=1.0;a[1]=-0.0;a[2]=0.0;a[3]=-0.0;D=2;
break;
case 2: a[0]=0.5;a[1]=-0.5;a[2]=0.0;a[3]=-0.0;D=4;
break;
case 3: a[0]=0.54;a[1]=-0.46;a[2]=0.0;a[3]=-0.0;D=4;
break;
case 4: a[0]=0.42;a[1]=-0.5;a[2]=0.08;a[3]=-0.0;D=6;
break;
case 5: a[0]=0.44959;a[1]=-0.49364;a[2]=0.05677;a[3]=-0.0;D=5.5;
break;
case 6: a[0]=0.42323;a[1]=-0.49755;a[2]=0.07922;a[3]=-0.0;D=6;
break;
case 7: a[0]=0.4021;a[1]=-0.49703;a[2]=0.09392;a[3]=-0.00188;D=7;
break;
case 8: a[0]=0.35878;a[1]=-0.48829;a[2]=0.14128;a[3]=-0.01168;D=9;
break;
}
n=D/DF+1;
NA1=(n+1)/2;
NS1=(n-1)/2;
for(i=0;i<n;i++)
{w[i]=0.0;
for(j=0;j<=3;j++) w[i]+=a[j]*cos(2.0*M_PI*i/(n-1)*j);
}
if(n/2.0!=float(n/2))
{ for(i=0;i<NA1;i++)
{IS=i+NS1;
if(i==0) h[IS]=2.0*FH;
else h[IS]=2.0*(FH*sin(2.0*M_PI*i*FH)/(2.0*M_PI*i*FH));
IV=n-IS-1;
h[IV]=h[IS];
}
}
else
{for(i=-NS1;i<NA1;i++)
{ IS=i+NS1;
h[IS]=sin(2.0*M_PI*(i-0.5)*FH)/(M_PI*(i-0.5));
}
}
for(i=0;i<n;i++) h[i]*=w[i];
return n;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -