巴特沃兹滤波器的vb.net程序。
' 使用双线性变换法的 Butterworth 型 IIR 数字滤波器设计程序
'
' 形参说明如下 :
'
' PbType ----------- 输入整型量 ,滤波器通带类型 :
' PbType = 0 : 低通滤波器 ;
' PbType = 1 : 高通滤波器 ;
2 ' 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( ) ------------ 输出双精度量 ,滤波器的幅频特性数组 .
'
Sub Butterworth(PbType As Integer, fp1 As Double, fp2 As Double, Apass As Double, fs1 As Double, fs2 As
Double, Astop As Double, fsamp As Double, points As Integer, ord As Integer, NumSec() As Double,
DenSec() As Double, NumSec_Z() As Double, DenSec_Z() As Double, AR() As Double)
Dim i%, j%, k%, ord_t%
Dim angle#, emp1#, temp2#, temp3#
Dim ratio(0 To 50) As Double
''''''''''''''''''''
If PbType = 0 Then ' 低通滤波器 ;
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) + 1
omk0 = omika0(omikaP, epass, ord)
' 调用 Fz_LP 子程序, 将低通模拟滤波器的转移函数变量 s 映射为低通数字滤波器的系统函数变量 z
Call Fz_LP(F1(), F2(), ord_t) '
End If
''''''''''''''''''''
If PbType = 1 Then ' 高通滤波器 ;
wpass = 2# * Pi * fpass / fsamp: wstop = 2# * Pi * fstop / fsamp ' 通带、阻带边界频率
3 omikaP = 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) + 1
omk0 = omika0(omikaP, epass, ord)
' 调用 Fz_HP 子程序,将高通模拟滤波器的转移函数变量 s 映射为高通数字滤波器的系统函数变量 z
Call Fz_HP(F1(), F2(), ord_t)
End If
''''''''''''''''''''
If PbType = 2 Then ' 带通滤波器 ;
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))
If omikaS1 <= omikaS2 Then
omikaS = omikaS1
Else
omikaS = omikaS2
End If
epass = epson(Apass): estop = epson(Astop)
' 根据对幅频特性的技术要求 ,计算模拟滤波器的阶数
orde = Ne_B(estop, epass, omikaS, omikaP)
ord = Fix(orde) + 1
omk0 = omika0(omikaP, epass, ord)
' 调用 Fz_BP 子程序,将带通模拟滤波器的转移函数变量 s 映射为带通数字滤波器的系统函数变量 z
Call Fz_BP(fp1, fp2, fsamp, F1(), F2(), ord_t)
End If