您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 设计四种IIR数字滤波器的VB核心程序
1四种IIR数字滤波器的核心程序'本文给出双线性变换法设计四种IIR数字滤波器的核心程序。程序用VB写成。这四种滤波器是1.巴特沃思滤波器2.切比雪夫1型滤波器3.切比雪夫2型滤波器4.椭圆滤波器图1、2示出以上几种滤波器的程序框图。图12图2`'使用双线性变换法的Butterworth型IIR数字滤波器设计程序''形参说明如下:''PbType-----------输入整型量,滤波器通带类型:'PbType=0:低通滤波器;'PbType=1:高通滤波器;3'PbType=2:带通滤波器;'PbType=3:带阻滤波器.'fp1-----------输入双精度量,低通或高通滤波器的通带边界频率(Hz);带通或带阻滤波器的通带低端边‘界频率(Hz).'fp2-----------输入双精度量,带通或带阻滤波器的通带低端边界频率(Hz).'Apass-----------输入双精度量,通带衰减(dB).'fs1-----------输入双精度量,低通或高通滤波器的阻带边界频率(Hz);带通或带阻滤波器的阻带高端边‘界频率(Hz).'fs2-----------输入双精度量,带通或带阻滤波器的阻带高端边界频率(Hz).'Astop-----------输入双精度量,阻带衰减(dB).'fsamp-----------输入双精度量,采样频率(Hz).'points-----------输入整型量,幅频特性计算点数.'ord-----------输入整型量,滤波器阶数.'NumSec()--------输出双精度量,转移函数二阶节的分子多项式系数二维数组.'元素NumSec(k,i)中,'k:二阶节序号;'i:多项式系数,i=0相应于常数项.'DenSec()--------输出双精度量转移函数二阶节的分母多项式系数二维数组.'元素DenSec(k,i)中,'k:二阶节序号;'i:多项式系数,i=0相应于常数项.'NumSec_Z()------输出双精度量系统函数二阶节的分子多项式系数二维数组.'元素NumSec_Z(k,i)中,'k:二阶节序号;'i:多项式系数,i=0相应于常数项.'DenSec_Z()------输出双精度量系统函数二阶节的分母多项式系数二维数组.'元素DenSec_Z(k,i)中,'k:二阶节序号;'i:多项式系数,i=0相应于常数项.'AR()------------输出双精度量,滤波器的幅频特性数组.'SubButterworth(PbTypeAsInteger,fp1AsDouble,fp2AsDouble,ApassAsDouble,fs1AsDouble,fs2AsDouble,AstopAsDouble,fsampAsDouble,pointsAsInteger,ordAsInteger,NumSec()AsDouble,DenSec()AsDouble,NumSec_Z()AsDouble,DenSec_Z()AsDouble,AR()AsDouble)Dimi%,j%,k%,ord_t%Dimangle#,emp1#,temp2#,temp3#Dimratio(0To50)AsDouble''''''''''''''''''''IfPbType=0Then'低通滤波器;wpass=2#*Pi*fpass/fsamp:wstop=2#*Pi*fstop/fsamp'通带、阻带边界频率omikaP=Tan(wpass/2#):omikaS=Tan(wstop/2#)epass=epson(Apass):estop=epson(Astop)'根据对幅频特性的技术要求,计算模拟滤波器的阶数orde=Ne_B(estop,epass,omikaS,omikaP)ord=Fix(orde)+1omk0=omika0(omikaP,epass,ord)'调用Fz_LP子程序,将低通模拟滤波器的转移函数变量s映射为低通数字滤波器的系统函数变量zCallFz_LP(F1(),F2(),ord_t)'EndIf''''''''''''''''''''IfPbType=1Then'高通滤波器;wpass=2#*Pi*fpass/fsamp:wstop=2#*Pi*fstop/fsamp'通带、阻带边界频率4omikaP=1#/Tan(wpass/2#):omikaS=1#/Tan(wstop/2#)epass=epson(Apass):estop=epson(Astop)'根据对幅频特性的技术要求,计算模拟滤波器的阶数orde=Ne_B(estop,epass,omikaS,omikaP)ord=Fix(orde)+1omk0=omika0(omikaP,epass,ord)'调用Fz_HP子程序,将高通模拟滤波器的转移函数变量s映射为高通数字滤波器的系统函数变量zCallFz_HP(F1(),F2(),ord_t)EndIf''''''''''''''''''''IfPbType=2Then'带通滤波器;wp1=2#*Pi*fp1/fsamp:wp2=2#*Pi*fp2/fsamp'通带上下边界频率ws1=2#*Pi*fs1/fsamp:ws2=2#*Pi*fs2/fsamp'阻带上下边界频率Ci=BpC(wp1,wp2)omikaP=Abs((Ci-Cos(wp2))/Sin(wp2))omikaS1=Abs((Ci-Cos(ws1))/Sin(ws1))omikaS2=Abs((Ci-Cos(ws2))/Sin(ws2))IfomikaS1=omikaS2ThenomikaS=omikaS1ElseomikaS=omikaS2EndIfepass=epson(Apass):estop=epson(Astop)'根据对幅频特性的技术要求,计算模拟滤波器的阶数orde=Ne_B(estop,epass,omikaS,omikaP)ord=Fix(orde)+1omk0=omika0(omikaP,epass,ord)'调用Fz_BP子程序,将带通模拟滤波器的转移函数变量s映射为带通数字滤波器的系统函数变量zCallFz_BP(fp1,fp2,fsamp,F1(),F2(),ord_t)EndIf''''''''''''''''''''IfPbType=3Then'带阻滤波器;wp1=2#*Pi*fp1/fsamp:wp2=2#*Pi*fp2/fsamp'通带上下边界频率ws1=2#*Pi*fs1/fsamp:ws2=2#*Pi*fs2/fsamp'阻带上下边界频率Ci=BpC(wp1,wp2)omikaP=Abs(Sin(wp2)/(Cos(wp2)-Ci))omikaS1=Sin(ws1)/(Cos(ws1)-Ci)omikaS2=Sin(ws2)/(Cos(ws2)-Ci)IfAbs(omikaS1)=Abs(omikaS2)ThenomikaS=Abs(omikaS1)ElseomikaS=Abs(omikaS2)EndIfepass=epson(Apass):estop=epson(Astop)'根据对幅频特性的技术要求,计算模拟滤波器的阶数orde=Ne_B(estop,epass,omikaS,omikaP)ord=Fix(orde)+1omk0=omika0(omikaP,epass,ord)'调用Fz_BS子程序,将带阻模拟滤波器的转移函数变量s映射为带阻数字滤波器的系统函数变量zCallFz_BS(fp1,fp2,fsamp,F1(),F2(),ord_t)EndIf''''''''''''''''''''5IfordMod20Then'滤波器系统函数的阶数为奇数时,级联节的起始序号为0(序号为0的级联节是一阶节,其余为‘二阶节)start=0Else'滤波器系统函数的阶数为偶数时,级联节的起始序号为1(级联节都是二阶节,没有一阶节)start=1EndIfNR=ord\2'系统函数由一阶、二阶节级联而成,k是节序号。此处求各节的分子分母多项式的系数Fork=startToNRIfk=0Then'求Butterworth滤波器转移函数的一阶节分子分母多项式的系数组Nums(0)=1#:Nums(1)=0#:Nums(2)=0#Dens(0)=1#:Dens(1)=1#/omk0:Dens(2)=0#NumSec(0,0)=Nums(0):NumSec(0,1)=Nums(1):NumSec(0,2)=Nums(2)DenSec(0,0)=Dens(0):DenSec(0,1)=Dens(1):DenSec(0,2)=Dens(2)EndIfIfk0Then'求Butterworth滤波器转移函数的二阶节分子分母多项式的系数组CallHS_B(ord,k,omikaP,epass,Nums(),Dens())Forj=0To2NumSec(k,j)=Nums(j):DenSec(k,j)=Dens(j)NextjEndIf'从模拟滤波器的转移函数求数字滤波器的系统函数Ifk=0ThenCallBSF2(Nums(),Dens(),1,F1(),F2(),ord_t,Numz(),Denz(),order_z)ElseCallBSF2(Nums(),Dens(),2,F1(),F2(),ord_t,Numz(),Denz(),order_z)EndIf'求系统函数第k节的分子多项式系数组Forj=0Toorder_zNumSec_Z(k,j)=Numz(j)Nextj'求系统函数第k节的分母多项式系数组Forj=0Toorder_zDenSec_Z(k,j)=Denz(j)NextjNextk'求滤波器的幅频特性Fori=0Topoints-1Fork=startToNRangle=i*2#*Pi/points'在单位圆上,第i点的幅值为1,相角为angle.Forj=0ToorderCallFind_ratio(ord,k,angle,NumSec_Z(),DenSec_Z(),ratio(k))'CallFind_ratio(order,angle,Num(),Den(),ratio(k))Ifratio(k)=0#Thenratio(k)=0.000001EndIfNextkAR(i)=16Fork=startToNRAR(i)=AR(i)*ratio(k)NextkNextiEndSub'使用双线性变换法的Chebyshev1型IIR数字滤波器设计程序‘'形参说明如下:'PbType----------输入整型量,滤波器通带类型:'PbType=0:低通滤波器;'PbType=1:高通滤波器;'PbType=2:带通滤波器;'PbType=3:带阻滤波器.'fp1-----------输入双精度量,低通或高通滤波器的通带边界频率(Hz);带通或带阻滤波器的通带低端‘边界频率(Hz).'fp2-----------输入双精度量,带通或带阻滤波器的通带低端边界频率(Hz).'Apass----------输入双精度量,通带衰减(dB).'fs1-----------输入双精度量,低通或高通滤波器的阻带边界频率(Hz);带通或带阻滤波器的阻带高端‘边界频率(Hz).'fs2-----------输入双精度量,带通或带阻滤波器的阻带高端边界频率(Hz).'Astop-----------输入双精度量,阻带衰减(dB).'fsamp-----------输入双精度量,采样频率(Hz).'points-----------输入整型量,幅频特性计算点数.'ord-----------输入整型量,滤波器阶数.'H0--------------输出双精度量,转移函数和系统函数的常数因子.'NumSec()------输出双精度量,转移函数二阶节的分子多项式系数二维数组.'元素NumSec(k,i)中,'k:二阶节序号;'i:多项式系数,i=0相应于常数项.'DenSec()---
本文标题:设计四种IIR数字滤波器的VB核心程序
链接地址:https://www.777doc.com/doc-3946516 .html