第一范文网 - 专业文章范例文档资料分享平台

IIR数字滤波器设计的核心程序

来源:用户分享 时间:2025/10/27 23:33:56 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

If ord Mod 2 <> 0 Then

' 滤波器系统函数的阶数为奇数时,级联节的起始序号为 0(序号为 0 的级联节是一阶节,其余为

‘ 二阶节)

start = 0 Else

' 滤波器系统函数的阶数为偶数时,级联节的起始序号为 1(级联节都是二阶节,没有一阶节) start = 1 End If

NR = ord \\ 2

' 系统函数由一阶、二阶节级联而成,k 是节序号。此处求各节的分子分母多项式的系数 For k = start To NR If k = 0 Then

' 求 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) End If

If k <> 0 Then

' 求 Butterworth 滤波器转移函数的二阶节分子分母多项式的系数组 Call HS_B(ord, k, omikaP, epass, Nums(), Dens()) For j = 0 To 2

NumSec(k, j) = Nums(j): DenSec(k, j) = Dens(j) Next j End If

' 从模拟滤波器的转移函数求数字滤波器的系统函数 If k = 0 Then

Call BSF2(Nums(), Dens(), 1, F1(), F2(), ord_t, Numz(), Denz(), order_z) Else

Call BSF2(Nums(), Dens(), 2, F1(), F2(), ord_t, Numz(), Denz(), order_z) End If

' 求系统函数第 k 节的分子多项式系数组 For j = 0 To order_z

NumSec_Z(k, j) = Numz(j) Next j

' 求系统函数第 k 节的分母多项式系数组 For j = 0 To order_z

DenSec_Z(k, j) = Denz(j) Next j Next k

' 求滤波器的幅频特性 For i = 0 To points - 1 For k = start To NR

angle = i * 2# * Pi / points ' 在单位圆上,第 i 点的幅值为 1, 相角为 angle. For j = 0 To order

Call Find_ratio(ord, k, angle, NumSec_Z(), DenSec_Z(), ratio(k)) ' Call Find_ratio(order, angle, Num(), Den(), ratio(k)) If ratio(k) = 0# Then ratio(k) = 0.000001 End If Next k AR(i) = 1

5

For k = start To NR

AR(i) = AR(i) * ratio(k) Next k Next i End Sub

' 使用双线性变换法的 Chebyshev 1 型 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( ) ------ 输出双精度量 转移函数二阶节的分母多项式系数二维数组. ' 元素 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 Chebyshev1(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, H0 As Double, NumSec() As Double, DenSec() As Double, NumSec_Z() As Double, DenSec_Z() As Double, AR() As Double) Dim i%, k%, Fg%, ord_t%, order_z0% Dim angle#, A#

Dim ratio(0 To 50) As Double '

6

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_Ch12(omikaP, omikaS, epass, estop) ord = Fix(orde) + 1 A = 1# / epass

A = (1# / ord) * Log(A + Sqr(A ^ 2 + 1#)) A = sinh(A)

omk0 = A * omikaP ' 调用 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 omikaP = 1# / Tan(wpass / 2#): omikaS = 1# / Tan(wstop / 2#) epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求,计算模拟滤波器的阶数 orde = Ne_Ch12(omikaP, omikaS, epass, estop) ord = Fix(orde) + 1 A = 1# / epass

A = (1# / ord) * Log(A + Sqr(A ^ 2 + 1#)) A = sinh(A)

omk0 = A * omikaP ' 调用 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_Ch12(omikaP, omikaS, epass, estop) ord = Fix(orde) + 1 A = 1# / epass

A = (1# / ord) * Log(A + Sqr(A ^ 2 + 1#)) A = sinh(A)

omk0 = A * omikaP ' 调用 Fz_BP 子程序,将带通模拟滤波器的转移函数变量 s 映射为带通数字滤波器的系统函数变量 z Call Fz_BP(fp1, fp2, fsamp, F1(), F2(), ord_t)

7

End If '''''''''''''''

If PbType = 3 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(Sin(wp2) / (Cos(wp2) - Ci)) omikaS1 = Sin(ws1) / (Cos(ws1) - Ci) omikaS2 = Sin(ws2) / (Cos(ws2) - Ci) If Abs(omikaS1) <= Abs(omikaS2) Then omikaS = Abs(omikaS1) Else

omikaS = Abs(omikaS2) End If

epass = epson(Apass): estop = epson(Astop) ' 根据对幅频特性的技术要求,计算模拟滤波器的阶数 orde = Ne_Ch12(omikaP, omikaS, epass, estop) ord = Fix(orde) + 1 A = 1# / epass

A = (1# / ord) * Log(A + Sqr(A ^ 2 + 1#)) A = sinh(A)

omk0 = A * omikaP

Call Fz_BS(fp1, fp2, fsamp, F1(), F2(), ord_t) End If '''''''''''''''

NR = ord \\ 2

If ord Mod 2 <> 0 Then start = 0

Nums(0) = omk0: Nums(1) = 0#: Nums(2) = 0# Dens(0) = omk0: Dens(1) = 1#: Dens(2) = 0# For i = 0 To 2

NumSec(0, i) = Nums(i): DenSec(0, i) = Dens(i) Next i H0 = 1 Else

start = 1

H0 = Sqr(1# / (1# + epass ^ 2)) End If

' 系统函数由一阶、二阶节级联而成,k 是节序号。此处求各节的分子分母多项式的系数 For k = start To NR If k <> 0 Then

Call HS_Ch1(ord, k, omikaP, epass, Nums(), Dens(), NumSec(), DenSec()) End If

If k = 0 Then

Call BSF2(Nums(), Dens(), 1, F1(), F2(), ord_t, Numz(), Denz(), order_z0) order_z = order_z0 Else

Call BSF2(Nums(), Dens(), 2, F1(), F2(), ord_t, Numz(), Denz(), order_z) End If

For i = 0 To order_z

NumSec_Z(k, i) = Numz(i) Next i

8

搜索更多关于: IIR数字滤波器设计的核心程序 的文档
IIR数字滤波器设计的核心程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c3pbpc1f20y0wacw0f2p46m3qp9xkwe00yqj_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top