举个例子,简单说说如何推导IIR滤波器和FIR滤波器的参数

前言

最近看这两个滤波器设计嘛,就试着来写一下

主要从双线性变换,z变换,然后举一个例子来进行一下滤波器的设计。

例子

我们考虑传递函数如下的low pass filter

IIR滤波器

脉冲响应不变法

考虑这个传递函数 H ( s ) = w 0 2 s 2 + w 0 Q s + w 0 2 H(s)=\frac{w_0^2}{s^2+\frac{w_0}{Q}s+w_0^2} H(s)=s2+Qw0s+w02w02

为了更好地将H(s)拆分开来,我们考虑分母的因式分解

假设 H ( s ) H(s) H(s)存在两个根,解一元二次方程,有:

p 1 , 2 = − w 0 2 Q ± 1 − 1 4 Q 2 p_{1,2}=-\frac{w_0}{2Q} \pm \sqrt{1-\frac{1}{4Q^2}} p1,2=−2Qw0±1−4Q21

为了方便计算,我们记

α = − w 0 2 Q \alpha =-\frac{w_0}{2Q} α=−2Qw0

β = w 0 1 − 1 4 Q 2 \beta = w_0\sqrt{1-\frac{1}{4Q^2}} β=w01−4Q21

因此我们知道

p 1 = α + j β p_1=\alpha + j\beta p1=α+jβ

p 2 = α − j β p_2=\alpha-j\beta p2=α−jβ

那我们的H(s)此时变成了:

H ( s ) = w 0 2 ( s − p 1 ) ( s − p 2 ) H(s)=\frac{w_0^2}{(s-p_1)(s-p_2)} H(s)=(s−p1)(s−p2)w02

我们假设这个式子可以展开,那么我们可以得到H(s)如下:

H ( s ) = A s − p 1 + B s − p 2 H(s)=\frac{A}{s-p1} + \frac{B}{s-p_2} H(s)=s−p1A+s−p2B

这里A和B是待定的,我们有

w 0 2 ( s − p 1 ) ( s − p 2 ) = A s − p 1 + B s − p 2 \frac{w_0^2}{(s-p_1)(s-p_2)}=\frac{A}{s-p_1}+\frac{B}{s-p_2} (s−p1)(s−p2)w02=s−p1A+s−p2B

这里我们其实可以计算出来,两边同时乘以分母,就有

A ( s − p 2 ) + B ( s − p 1 ) = w 0 2 A(s-p_2)+B(s-p_1)=w_0^2 A(s−p2)+B(s−p1)=w02

求得A和B如下:

A = w 0 2 p 1 − p 2 B = w 0 2 p 2 − p 1 A = \frac{w_0^2}{p_1-p_2} \\ B=\frac{w_0^2}{p_2-p_1} A=p1−p2w02B=p2−p1w02

然后我们将H(s)转换到时域上考量,使用你拉布拉斯变换

L − 1 { A s − p 1 } = A e p 1 t L − 1 { A s − p 2 } = B e p 2 t \mathcal{L}^{-1}\{ \frac{A}{s-p_1}\}=Ae^{p_1t}\\\mathcal{L}^{-1}\{ \frac{A}{s-p_2}\}=Be^{p_2t} L−1{s−p1A}=Aep1tL−1{s−p2A}=Bep2t

综上,得到

h ( t ) = A e p 1 t + B e p 2 t h(t)=Ae^{p_1t}+Be^{p_2t} h(t)=Aep1t+Bep2t

带入

p 1 = α + j β p 2 = α − j β p_1=\alpha+\mathcal{j}\beta\\p_2=\alpha-\mathcal{j}\beta p1=α+jβp2=α−jβ

有 h ( t ) = e α t ( A 1 e j β t + A 2 e − j β t ) h(t)=e^{\alpha t}(A_1e^{\mathcal{j}\beta t}+A_2e^{-\mathcal{j}\beta t}) h(t)=eαt(A1ejβt+A2e−jβt)

其实到这里就已经可以算作阶数了,但是这个可以继续化简减少工作量,我们利用欧拉公式

e j β t = cos ⁡ ( β t ) + j sin ⁡ ( β t ) e − j β t = cos ⁡ ( β t ) − j sin ⁡ ( β t ) e^{\mathcal{j}\beta t}=\cos(\beta t) + \mathcal{j}\sin(\beta t) \\ e^{\mathcal{-j}\beta t}=\cos(\beta t) - \mathcal{j}\sin(\beta t) ejβt=cos(βt)+jsin(βt)e−jβt=cos(βt)−jsin(βt)

假定我们在实数域上讨论和考虑,那么最终化简得到

h ( t ) = 2 A e α t c o s ( β t ) h(t)=2Ae^{\alpha t}cos(\beta t) h(t)=2Aeαtcos(βt)

这里是直接计算得到脉冲响应函数。

双线性变换法

还是考虑这个s域上的传递函数

H ( s ) = ω 0 2 s 2 + ω 0 Q s + ω 0 2 H(s) = \frac{\omega_0^2}{s^2 + \frac{\omega_0}{Q}s + \omega_0^2} H(s)=s2+Qω0s+ω02ω02

使用双线性变换法呢,则是直接将H(s)进行z变换,得我们令

s = 2 T 1 − z − 1 1 + z − 1 s=\frac{2}{T} \frac{1-z^{-1}}{1+z^{-1}} s=T21+z−11−z−1

求解极点,求解特征方程的根,即传递函数分母的零点:

s 2 + ω 0 Q s + ω 0 2 = 0 s^2 + \frac{\omega_0}{Q}s + \omega_0^2 = 0 s2+Qω0s+ω02=0

根为:

p 1 , 2 = − ω 0 2 Q ± j ω 0 1 − 1 4 Q 2 p_{1,2} = -\frac{\omega_0}{2Q} \pm j \omega_0 \sqrt{1 - \frac{1}{4Q^2}} p1,2=−2Qω0±jω01−4Q21

设:

α = − ω 0 2 Q \alpha = -\frac{\omega_0}{2Q} α=−2Qω0

β = ω 0 1 − 1 4 Q 2 \beta = \omega_0 \sqrt{1 - \frac{1}{4Q^2}} β=ω01−4Q21

将 s s s 替换为双线性变换的表达式:

s = 2 T 1 − z − 1 1 + z − 1 s = \frac{2}{T} \frac{1 - z^{-1}}{1 + z^{-1}} s=T21+z−11−z−1

代入 H ( s ) H(s) H(s) 中:

H ( 2 T 1 − z − 1 1 + z − 1 ) = ω 0 2 ( 2 T 1 − z − 1 1 + z − 1 ) 2 + ω 0 Q ( 2 T 1 − z − 1 1 + z − 1 ) + ω 0 2 H\left( \frac{2}{T} \frac{1 - z^{-1}}{1 + z^{-1}} \right) = \frac{\omega_0^2}{\left( \frac{2}{T} \frac{1 - z^{-1}}{1 + z^{-1}} \right)^2 + \frac{\omega_0}{Q} \left( \frac{2}{T} \frac{1 - z^{-1}}{1 + z^{-1}} \right) + \omega_0^2} H(T21+z−11−z−1)=(T21+z−11−z−1)2+Qω0(T21+z−11−z−1)+ω02ω02

将分子分母进行通分并展开,可以得到:

H ( z ) = ω 0 2 ( 1 + z − 1 ) 2 ( 2 T ) 2 ( 1 − z − 1 ) 2 + 2 ω 0 Q T ( 1 − z − 1 ) ( 1 + z − 1 ) + ω 0 2 ( 1 + z − 1 ) 2 H(z) = \frac{\omega_0^2 \left( 1 + z^{-1} \right)^2}{\left( \frac{2}{T} \right)^2 \left( 1 - z^{-1} \right)^2 + \frac{2 \omega_0}{QT} \left( 1 - z^{-1} \right) \left( 1 + z^{-1} \right) + \omega_0^2 \left( 1 + z^{-1} \right)^2} H(z)=(T2)2(1−z−1)2+QT2ω0(1−z−1)(1+z−1)+ω02(1+z−1)2ω02(1+z−1)2

最终得到的离散时间传递函数 H ( z ) H(z) H(z) 形式为:

H ( z ) = b 0 + b 1 z − 1 + b 2 z − 2 1 + a 1 z − 1 + a 2 z − 2 H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} H(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2

上下一比对,我们最终可以推导出 b 0 , b 1 , b 2 , a 1 , a 2 b_0,b_1,b_2,a_1,a_2 b0,b1,b2,a1,a2的参数计算公式

b 0 = ω 0 2 T 2 4 + 2 ω 0 T Q + ω 0 2 T 2 b_0 = \frac{\omega_0^2 T^2}{4 + \frac{2\omega_0 T}{Q} + \omega_0^2 T^2} b0=4+Q2ω0T+ω02T2ω02T2

b 1 = 2 b 0 b_1 = 2b_0 b1=2b0

b 2 = b 0 b_2 = b_0 b2=b0

a 1 = 2 ( ω 0 2 T 2 − 4 ) 4 + 2 ω 0 T Q + ω 0 2 T 2 a_1 = \frac{2(\omega_0^2 T^2 - 4)}{4 + \frac{2\omega_0 T}{Q} + \omega_0^2 T^2} a1=4+Q2ω0T+ω02T22(ω02T2−4)

a 2 = 4 − 2 ω 0 T Q + ω 0 2 T 2 4 + 2 ω 0 T Q + ω 0 2 T 2 a_2 = \frac{4 - \frac{2\omega_0 T}{Q} + \omega_0^2 T^2}{4 + \frac{2\omega_0 T}{Q} + \omega_0^2 T^2} a2=4+Q2ω0T+ω02T24−Q2ω0T+ω02T2

FIR滤波器

窗函数法

还是考虑这个传递函数

H ( s ) = ω 0 2 s 2 + ω 0 Q s + ω 0 2 H(s) = \frac{\omega_0^2}{s^2 + \frac{\omega_0}{Q}s + \omega_0^2} H(s)=s2+Qω0s+ω02ω02

为了找到其时域冲激响应 h ( t ) h(t) h(t),我们需要对 H ( s ) H(s) H(s) 进行拉普拉斯逆变换。首先,重写传递函数:

H ( s ) = w 0 2 ( s + α 1 ) ( s + α 2 ) H(s) = \frac{w_0^2}{(s + \alpha_1)(s + \alpha_2)} H(s)=(s+α1)(s+α2)w02

其中, α 1 \alpha_1 α1 和 α 2 \alpha_2 α2 是特征根,可以通过解方程 s 2 + w 0 Q s + w 0 2 = 0 s^2 + \frac{w_0}{Q}s + w_0^2 = 0 s2+Qw0s+w02=0 得到:

α 1 , α 2 = − w 0 2 Q ± w 0 ( 1 4 Q 2 − 1 ) \alpha_1, \alpha_2 = \frac{-w_0}{2Q} \pm w_0 \sqrt{\left(\frac{1}{4Q^2} - 1\right)} α1,α2=2Q−w0±w0(4Q21−1)

然后,采用部分分式分解:

H ( s ) = A s + α 1 + B s + α 2 H(s) = \frac{A}{s + \alpha_1} + \frac{B}{s + \alpha_2} H(s)=s+α1A+s+α2B

我们可以通过匹配系数法找到 A A A 和 B B B。

对于每个分式:

L − 1 { A s + α 1 } = A e − α 1 t \mathcal{L}^{-1}\left\{\frac{A}{s + \alpha_1}\right\} = A e^{-\alpha_1 t} L−1{s+α1A}=Ae−α1t

L − 1 { B s + α 2 } = B e − α 2 t \mathcal{L}^{-1}\left\{\frac{B}{s + \alpha_2}\right\} = B e^{-\alpha_2 t} L−1{s+α2B}=Be−α2t

因此,时域冲激响应 h ( t ) h(t) h(t) 为:

h ( t ) = A e − α 1 t + B e − α 2 t h(t) = A e^{-\alpha_1 t} + B e^{-\alpha_2 t} h(t)=Ae−α1t+Be−α2t

假设采样率为 f s f_s fs,我们将时域冲激响应 h ( t ) h(t) h(t) 离散化得到 h d [ n ] h_d[n] hd[n]:

h d [ n ] = h ( n T ) = A e − α 1 n T + B e − α 2 n T h_d[n] = h(nT) = A e^{-\alpha_1 nT} + B e^{-\alpha_2 nT} hd[n]=h(nT)=Ae−α1nT+Be−α2nT

其中 T = 1 f s T = \frac{1}{f_s} T=fs1。

选择一个适当的窗函数(如Hamming窗、Hann窗等) w [ n ] w[n] w[n],并将其应用到采样后的冲激响应上,以得到最终的FIR滤波器系数。

假设我们使用Hamming窗 w [ n ] w[n] w[n]:

h w [ n ] = h d [ n ] ⋅ w [ n ] h_w[n] = h_d[n] \cdot w[n] hw[n]=hd[n]⋅w[n]

其中,Hamming窗的定义为:

w [ n ] = 0.54 − 0.46 cos ⁡ ( 2 π n N − 1 ) w[n] = 0.54 - 0.46 \cos\left(\frac{2 \pi n}{N-1}\right) w[n]=0.54−0.46cos(N−12πn)

最终的FIR滤波器系数为:

h [ n ] = h w [ n ] h[n] = h_w[n] h[n]=hw[n]

相关推荐
ヾ慈城31 分钟前
【数据结构 - 二叉树】
c语言·数据结构·算法·链表
卡戎-caryon38 分钟前
【项目实践】贪吃蛇
c语言·数据结构·算法
PeterClerk39 分钟前
PCA算法降维代码示例
人工智能·算法·机器学习·pca
带带老表学爬虫40 分钟前
2.opencv保存图片和摄像头读取
人工智能·opencv·计算机视觉
冲鸭嘟嘟可1 小时前
【数据结构】使用C语言 从零实现一个栈的数据结构
c语言·数据结构·算法
github_zwl1 小时前
昇思25天学习打卡营第6天|linchenfengxue
人工智能·学习·目标跟踪
小白菜又菜1 小时前
Leetcode 516. Longest Palindromic Subsequence
算法·leetcode·职场和发展
hf2000121 小时前
实时智能全托管-云器Lakehouse重新定义多维数据分析
大数据·人工智能·数据分析
网恋褙骗八万1 小时前
pytorch跑手写体实验
人工智能·pytorch·python
℡☞小白☜ღ2 小时前
信号量(semaphore)
算法