滤波器学习笔记1
设计一款滤波器首先需要利用广义切比雪夫多项式得到S参数曲线,然后将S曲线转化成为y矩阵。之后采用提取留数的方法综合出耦合矩阵的主对角线,然后用Givens变换简化耦合矩阵,最终得到滤波器的各种矩阵形式。
-
广义切比雪夫多项式的综合
要设计一款滤波器首先要得到满足指标要求的S曲线。高通,低通,带通,带阻等各种形式的S曲线要从低通原型变换而来。因此设计滤波器低通原型的S曲线是设计滤波器的第一步。
这里给出了广义切比雪夫滤波器低通原型S曲线的设计方法。-
符号说明
- 为了简化计算,在 ω \omega ω平面上展开讨论。这样,关于 ω \omega ω的多项式的系数都变成了实系数。基于 s = j ω + σ s=j\omega+\sigma s=jω+σ作变换。变换后会对以s参数为自变量函数产生一些影响。这里不进行讨论。直接使用变换后函数展开讨论。
- S 11 ( ω ) S_{11}(\omega) S11(ω)和 S 21 ( ω ) S_{21}(\omega) S21(ω)代表滤波器的反射系数和传输系数。
- 滤波器的传输系数和反射系数可以表示为两个多项式的比值,其数学语言描述如下:
S
11
(
ω
)
=
F
(
ω
)
/
ϵ
R
E
(
ω
)
S_{11}(\omega) = \frac{F(\omega)/\epsilon_R}{E(\omega)}
S11(ω)=E(ω)F(ω)/ϵR
S
21
(
ω
)
=
P
(
ω
)
/
ϵ
E
(
ω
)
S_{21}(\omega)=\frac{P(\omega)/\epsilon}{E(\omega)}
S21(ω)=E(ω)P(ω)/ϵ
上式中 ϵ R \epsilon_R ϵR式用来归一化 F ( ω ) F(\omega) F(ω)和 E ( ω ) E(\omega) E(ω)的常数,使得他们的最高次项的系数为1,如果最高次项已经等于1则 ϵ R \epsilon_R ϵR等于1。
而 ϵ = 1 1 0 R L / 10 − 1 ∣ P ( ω ) F ( ω ) / ϵ R ∣ ω = ± 1 \epsilon=\frac{1}{\sqrt{10^{RL/10}-1}}|\frac{P(\omega)}{F(\omega)/\epsilon_R}|_ {\omega= \pm 1} ϵ=10RL/10−11∣F(ω)/ϵRP(ω)∣ω=±1 其中 R L RL RL的值为滤波器在 w = ± 1 w=\pm1 w=±1 时的回波损耗。 - 符号
C
N
(
ω
)
C_N(\omega)
CN(ω)为N阶滤波器函数,其广义切比雪夫形式为:
C N ( ω ) = c o s h [ ∑ n = 1 N a r c o s h ( x n ( ω ) ) ] C_N(\omega)=cosh[\sum^N_{n=1}arcosh(x_n(\omega))] CN(ω)=cosh[n=1∑Narcosh(xn(ω))]
其中 x n ( ω ) = 1 − ω ω n ω − ω n x_n(\omega)=\frac{1-\omega\omega_n}{\omega-\omega_n} xn(ω)=ω−ωn1−ωωn , ω n \omega_n ωn为滤波器低通原型的第n个传输零点。
-
理论推导
为了得到S曲线,首先要得到多项式 F ( ω ) , P ( ω ) , E ( ω ) F(\omega),P(\omega),E(\omega) F(ω),P(ω),E(ω)。由于存在能量守恒(无耗)的约束条件,实际只需要得到 F ( ω ) , P ( ω ) F(\omega),P(\omega) F(ω),P(ω)就可以确定 E ( ω ) E(\omega) E(ω)的值。传输零点是设计者自己确定的,因而下面的推导都基于传输零点已知的条件。也就是 x n ( ω ) x_n(\omega) xn(ω)已知。
首先假设 y = a r c o s h ( x n ( ω ) ) y=arcosh(x_n(\omega)) y=arcosh(xn(ω))于是有 x n ( ω ) = c o s h ( y ) x_n(\omega)=cosh(y) xn(ω)=cosh(y),然后有 1 − x n ( ω ) 2 = s i n h ( y ) 2 1-x_n(\omega)^2 = sinh(y)^2 1−xn(ω)2=sinh(y)2推得 a r c o s h ( x n ( ω ) ) = l n ( a n + b n ) arcosh(x_n(\omega))=ln(a_n+b_n) arcosh(xn(ω))=ln(an+bn)其中 a n = x n ( ω ) a_n=x_n(\omega) an=xn(ω), b n = x n ( ω ) 2 − 1 b_n=\sqrt{x_n(\omega)^2-1} bn=xn(ω)2−1
将上述结果带入到 C N ( ω ) C_N(\omega) CN(ω)中有
C N ( ω ) = 1 2 [ ∏ n = 1 N ( a n + b n ) + ∏ n = 1 N ( a n − b n ) ] C_N(\omega)=\frac{1}{2}[\prod_{n=1}^{N}(a_n+b_n)+\prod_{n=1}^{N}(a_n-b_n)] CN(ω)=21[n=1∏N(an+bn)+n=1∏N(an−bn)]
将 x n ( ω ) x_n(\omega) xn(ω)的表达式代入 a n , b n a_n,b_n an,bn中,最后 C N ( ω ) C_N(\omega) CN(ω)的表达式就可以写为C N ( ω ) = 1 2 [ ∏ n = 1 N ( c n + d n ) + ∏ n = 1 N ( c n − d n ) ∏ n = 1 N ( 1 − ω / ω n ) ] C_N(\omega)=\frac{1}{2}[\frac{\prod^{N}_ {n=1}(c_n+d_n) +\prod^{N}_ {n=1}(c_n-d_n)}{\prod_{n=1}^{N}(1-\omega/\omega_n)}] CN(ω)=21[∏n=1N(1−ω/ωn)∏n=1N(cn+dn)+∏n=1N(cn−dn)]
其中 c n = ( ω − 1 ω n ) c_n=(\omega-\frac{1}{\omega_n}) cn=(ω−ωn1), d n = ω ′ 1 − 1 ω n 2 ( ω ′ = ω 2 − 1 ) d_n=\omega^\prime\sqrt{1-\frac{1}{\omega_n^2}}(\omega^\prime=\sqrt{\omega^2-1}) dn=ω′1−ωn21(ω′=ω2−1)
可以看出,式中分子带 ω ′ \omega^\prime ω′的项可以对消,而最后计算出的分子为两个相等的分别来自分子初始式子两个子项的和。因而计算分子中第一项不带 ω ′ \omega^\prime ω′的项的和就可以计算出整个分子的值。
又由于存在 C N ( ω ) = F ( ω ) P ( ω ) C_N(\omega)=\frac{F(\omega)}{P(\omega)} CN(ω)=P(ω)F(ω),所以 C N ( ω ) C_N(\omega) CN(ω)的分子多项式的零点与 F ( ω ) F(\omega) F(ω)相同。求出分子多项式的表达式也就求出了 F ( ω ) F(\omega) F(ω)
分母多项式 P ( ω ) P(\omega) P(ω)完全是由传输零点确定的,按照公式计算即可。但值得注意的是在转换回s平面后,如果 N − n f z N-n_{fz} N−nfz ( n f z n_{fz} nfz 为传输零点的个数)为偶数,需要在 P ( s ) P(s) P(s)前乘上虚数j。
在得到 P ( ω ) P(\omega) P(ω)和 F ( ω ) F(\omega) F(ω)后就可以求 E ( ω ) E(\omega) E(ω)了,根据正交归一化条件可以得到一个求解 E ( ω ) E(\omega) E(ω)的流程。这里不做推导,直接给出流程。
构造多项式 P ( ω ) / ϵ − j F ( ω ) / ϵ R P(\omega)/\epsilon-jF(\omega)/\epsilon_R P(ω)/ϵ−jF(ω)/ϵR 求出它的零点,然后求下半平面零点的共轭(为了满足赫尔维茨条件)。再利用上半平面零点(包含求共轭得到的零点)将 E ( ω ) E(\omega) E(ω) 重构出来。
这样得到 F ( ω ) , P ( ω ) , E ( ω ) F(\omega),P(\omega),E(\omega) F(ω),P(ω),E(ω) 以后,通过简单的计算就得到了S参数。 -
程序编写
程序主要应用了sympy的符号计算方法,并且生成了低通原型的s11和s21曲线图。 -
import sympy
import numpy as np
from fractions import Fraction
import matplotlib as mt
import math
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
w1 = 1.3217
w2 = 1.8
wla = np.array([w1,w2,np.inf,np.inf])
wl = np.array([w2,np.inf,np.inf])
order = 4
w = sympy.symbols("w")
wp = sympy.symbols("wp")
f12 = Fraction(1,2)#用分数sympy可以自己花间
wp = (w**2-1)**f12
U = (w-1/w1)
V = wp*(1-1/w1**2)**f12
for wi in wl:#迭代产生F(w)
Ut = w*U - U/wi + wp*(1-1/wi**2)**f12*V
V = w*V - V/wi + wp*(1-1/wi**2)**f12*U
U = Ut
F = sympy.expand(U)
F = F/F.coeff(w**4)
P = 1
for wi in wla:#迭代产生P(w)
P = P*(1-w/wi)
P = sympy.expand(P)
P = P/P.coeff(w**2)
RL = 22#回波损耗22dB
#计算epsilon
fw1 = F.evalf(subs = {w:1})
pw1 = P.evalf(subs = {w:1})
epsilon = 1/(10**(RL/10)-1)**0.5*abs(pw1/fw1)
coff1 = np.array([P.coeff(w**4),P.coeff(w**3),P.coeff(w**2),P.coeff(w),P.evalf(subs= {w:0})])
coff2 = np.array([F.coeff(w**4),F.coeff(w**3),F.coeff(w**2),F.coeff(w),F.evalf(subs= {w:0})])
coff1n = [float(i) for i in coff1]
coff2n = [float(i) for i in coff2]
coff = np.dot(coff1n,1.0) + np.dot(coff2n,1j)
zro = np.roots(coff)
E = 1 #分母多项式
for i in zro:
wn = i
if i.imag < 0:
wn = i.conjugate()
E = E*(w-wn)
s11 = F/E
s21 = (P/epsilon)/E
p1 = sympy.plot(10*sympy.log(abs(s11)),(w,-2,2),show=False,adaptive=False,nb_of_points = 3000)
p2 = sympy.plot(10*sympy.log(abs(s21)),(w,-2,2),show=False,adaptive=False,nb_of_points = 3000)
p1.append(p2[0])
p1.show()
从上图中可以看出,带内的波纹在-22dB左右,并且带内有4个传输极点,并且通带右侧有两个带外传输零点。与通带左侧相对比我们可以看到,右侧通带边缘陡峭而左侧通带边缘平滑,这说明传输零点起到了带外抑制的作用。