Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(3) プロトタイプLPFから BPF(バンドパスフィルタ)を設計・合成してチェビシェフとバタワースを比べる。
以前にLPF(ローパスフィルタ)の設計をやってみた。
今回はBPF(バンドパスフィルタ)。LPFからシャントCをLC並列に、シリーズLをLC直列に変換することでバンドパスフィルタが作れる。
どういう変換をするかはこれらを参照:
Microwave Filters, Impedance-Matching Networks, and Coupling Structures
Microwave Filters for Communication Systems: Fundamentals, Design, and Applications
LPFと違うのは帯域幅も指定する必要があること。LCの値を計算する関数は以下の通り。
def LC_BPF(n, f0, df, z0 = 50.0, first_element = "series", type = "Chebyshev", ripple = 0.1):
"""
信号源、負荷の特性インピーダンスZo、中心周波数f0, 帯域幅dfのBPFのL,C素子の値をndarrayで返す関数
n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
f0 : 中心周波数[GHz]
df : 帯域幅[GHz]
z0 : 信号源の特性インピーダンス
first_element : 最初にシリーズのLCが来る場合"series", 最初にシャントのLCが来る場合"shunt"
type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
"""
gk = prototype_LPF(n, type, ripple)
LC_elements = np.zeros((n + 2, 2))
LC_elements[0, 0] = z0
LC_elements[n + 1, 0] = gk[n+1] * z0
d = df/f0
w0 = 2 * np.pi * f0 * 1.0E9
if first_element == "series":
for k in range(1, n + 1):
if k % 2 != 0:
LC_elements[k,0] = gk[k] * z0 / (d * w0)
LC_elements[k,1] = d / (z0 * w0 * gk[k])
else:
LC_elements[k,0] = d * z0/ (w0 * gk[k])
LC_elements[k,1] = gk[k] / (z0 * w0 * d)
elif first_element == "shunt":
for k in range(1, n + 1):
if k % 2 != 0:
LC_elements[k,0] = d * z0/ (w0 * gk[k])
LC_elements[k,1] = gk[k] / (z0 * w0 * d)
else:
LC_elements[k,0] = gk[k] * z0 / (d * w0)
LC_elements[k,1] = d / (z0 * w0 * gk[k])
return LC_elements
|
これを使って3次のチェビシェフフィルタを計算すると
[1.27032014e-07, 1.99400884e-13],
[7.25621158e-10, 3.49084307e-11],
[1.27032014e-07, 1.99400884e-13],
[5.00000000e+01, 0.00000000e+00]])
def BPF_synthesis(n, f0, df, fstart, fstop, points, z0=50.0, first_element="series", type = "Chebyshev", ripple = 0.1):
"""
BPFを合成し、scikit-rfのCircuitとして返す関数
n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
f0 : 中心周波数[GHz]
df : 帯域幅[GHz]
fstart : 開始周波数[GHz]
fstop : 終了周波数[GHz]
points : 周波数点数
z0 : 信号源の特性インピーダンス
first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
"""
freq = rf.Frequency(start=fstart, stop=fstop, unit='GHz', npoints=points)
LC_elements = LC_BPF(n, f0, df, z0, first_element, type, ripple)
tl_media = rf.DefinedGammaZ0(freq, z0=LC_elements[0, 0], gamma=1j*freq.w/rf.c)
gnd = rf.Circuit.Ground(freq, name='gnd')
port1 = rf.Circuit.Port(freq, name='port1', z0=z0)
port2 = rf.Circuit.Port(freq, name='port2', z0=LC_elements[-1, 0])
if first_element == "series":
Ls = [0]
Cs = [0]
Lp = [0]
Cp = [0]
countL = 1
countC = 1
for k in range(1, n + 1):
if k % 2 != 0:
Ls.append(tl_media.inductor(LC_elements[k,0], name = f"Ls{countL}"))
Cs.append(tl_media.capacitor(LC_elements[k,1], name = f"Cs{countL}"))
countL +=1
else:
Lp.append(tl_media.inductor(LC_elements[k,0], name = f"Lp{countC}"))
Cp.append(tl_media.capacitor(LC_elements[k,1], name = f"Cp{countC}"))
countC += 1
cnx = [[(port1, 0), (Ls[1], 0)]]
if n % 2 != 0:
for k in range(1, n//2 + 1):
cnx.append([(Ls[k], 1), (Cs[k], 0)])
cnx.append([(Cs[k], 1), (Lp[k], 0), (Cp[k], 0), (Ls[k+1], 0)])
cnx.append([(Ls[n//2 + 1], 1),(Cs[n//2 + 1], 0)])
cnx.append([(Cs[n//2 + 1], 1), (port2, 0)])
else:
for k in range(1, n//2):
cnx.append([(Ls[k], 1), (Cs[k], 0)])
cnx.append([(Cs[k], 1), (Lp[k], 0), (Cp[k], 0), (Ls[k+1], 0)])
cnx.append([(Ls[n//2], 1), (Cs[n//2], 0)])
cnx.append([ (Cs[n//2], 1), (Lp[n//2], 0), (Cp[n//2], 0), (port2, 0)])
gnd_cnx = [(gnd, 0)]
for k in range(1, n//2 + 1):
gnd_cnx.append((Lp[k], 1))
gnd_cnx.append((Cp[k], 1))
cnx.append(gnd_cnx)
elif first_element == "shunt":
Ls = [0]
Cs = [0]
Lp = [0]
Cp = [0]
countL = 1
countC = 1
for k in range(1, n + 1):
if k % 2 != 0:
Lp.append(tl_media.inductor(LC_elements[k,0], name = f"Lp{countC}"))
Cp.append(tl_media.capacitor(LC_elements[k,1], name = f"Cp{countC}"))
countC += 1
else:
Ls.append(tl_media.inductor(LC_elements[k,0], name = f"Ls{countL}"))
Cs.append(tl_media.capacitor(LC_elements[k,1], name = f"Cs{countL}"))
countL +=1
cnx = [[(port1, 0), (Lp[1], 0), (Cp[1], 0), (Ls[1], 0)]]
gnd_cnx = [(gnd, 0)]
if n % 2 != 0:
for k in range(1, n//2):
cnx.append([(Ls[k], 1), (Cs[k], 0)])
cnx.append([(Cs[k], 1), (Lp[k+1], 0), (Cp[k+1], 0), (Ls[k+1], 0)])
cnx.append([(Ls[n//2], 1),(Cs[n//2],0)])
cnx.append([(Cs[n//2], 1), (Lp[n//2 + 1], 0), (Cp[n//2 + 1], 0), (port2, 0)])
for k in range(1, n//2 + 2):
gnd_cnx.append((Lp[k], 1))
gnd_cnx.append((Cp[k], 1))
else:
for k in range(1, n//2):
cnx.append([(Ls[k], 1), (Cs[k], 0)])
cnx.append([(Cs[k], 1), (Lp[k+1], 0), (Cp[k+1], 0), (Ls[k+1], 0)])
cnx.append([(Ls[n//2], 1), (Cs[n//2], 0)])
cnx.append([(Cs[n//2], 1), (port2, 0)])
for k in range(1, n//2 + 1):
gnd_cnx.append((Lp[k], 1))
gnd_cnx.append((Cp[k], 1))
cnx.append(gnd_cnx)
return rf.Circuit(cnx)
|
ではフィルタを合成してみよう。5次のバタワースとチェビシェフの比較をしてみる。
チェビシェフのほうが急峻だがリップルが入っているのが見える。素子のつながりは
« 高周波・RFニュース 2024年7月30日 Gartner/QorvoのEVのバッテリマネジメントシステム(BMS)解説、Qualcommのスマートグラスインタビュー、6GとISAC解説、Tachyon NetworksとPerasoの60GHz FWA、電気設計のためのAIツール、Wi-Fi 7とプライベート5Gは共存するか?など | トップページ | 高周波・RFニュース 2024年7月31日 Qorvo、Skyworksの決算発表、QualcommがSnapdragon 4s Gen 2を発表、u-bloxの測位ソリューションがNVIDIAに採用、MarvellがStructera CXLを発表、IEEE IMS2024の論文集が公開、TDKのAI新会社 »
「パソコン・インターネット」カテゴリの記事
- PythonでFDTD法で電磁界シミュレーションできるopenEMSを使う(1)例題にあるマイクロストリップラインのノッチフィルタ(スタブ)を動かして電磁界分布を動画で見てみる。CSXCADでモデルは確認できるし、ParaViewで電磁界分布が見られる。Sパラメータも計算できる。(2025.05.14)
- ユニクロとAkamaiのコラボTシャツに書かれているコードを解読してみる。base64でデコードするとbashのシェルスクリプトが出てきて実行すると♥PEACE♥FOR♥ALL♥FOR♥ALL♥PEACE♥FOR♥ALL♥という文字が色付きで正弦波で流れた。(2025.05.01)
- Google Gemini 2.5 Pro experimentalに高周波で使われるSパラメータのTouchstoneファイルを読み込んでプロットするC#コードを書いてもらうと570行のコードができて動いた。ファイルの拡張子snpのnでポート数を判別するが人間を信じないのでデータ数えて確認するのに笑った。(2025.04.21)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2025年5月16日 BAWフィルタのAkoustisがSpace Xの子会社に売却へ、DuPontがPyraluxなどのエレクトロニクス部門をスピンオフさせQnityという名前に、Microwave Journal5月号でローデ・シュワルツが最新スペアナ解説、GSAが5G Advancedレポート発行(2025.05.16)
- 高周波・RFニュース 2025年5月15日 2025 104th ARFTG のプロシーディング公開、R&SがRF Testing Innovations Forum開催、IEEE Journal of Microwaves5月号発行、Microwave Journal5月特別号は宇宙特集、QorvoがMatter用SoC 3種発売、MediaTekが5G FWA用T930発売(2025.05.15)
- 高周波・RFニュース 2025年5月14日 TDKが8A流せる積層チップビーズを発表、Samsungが5.8㎜の薄さのGalaxy 25 Edge発表、InfineonがマルチセンステクノロジーのPSOC 4100T Plus発表、u-bloxがPointPerfect Global発表、下院委員会が3GHzと6GHzをオークションから除外(2025.05.14)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2025年5月16日 BAWフィルタのAkoustisがSpace Xの子会社に売却へ、DuPontがPyraluxなどのエレクトロニクス部門をスピンオフさせQnityという名前に、Microwave Journal5月号でローデ・シュワルツが最新スペアナ解説、GSAが5G Advancedレポート発行(2025.05.16)
- 高周波・RFニュース 2025年5月15日 2025 104th ARFTG のプロシーディング公開、R&SがRF Testing Innovations Forum開催、IEEE Journal of Microwaves5月号発行、Microwave Journal5月特別号は宇宙特集、QorvoがMatter用SoC 3種発売、MediaTekが5G FWA用T930発売(2025.05.15)
- 高周波・RFニュース 2025年5月14日 TDKが8A流せる積層チップビーズを発表、Samsungが5.8㎜の薄さのGalaxy 25 Edge発表、InfineonがマルチセンステクノロジーのPSOC 4100T Plus発表、u-bloxがPointPerfect Global発表、下院委員会が3GHzと6GHzをオークションから除外(2025.05.14)
« 高周波・RFニュース 2024年7月30日 Gartner/QorvoのEVのバッテリマネジメントシステム(BMS)解説、Qualcommのスマートグラスインタビュー、6GとISAC解説、Tachyon NetworksとPerasoの60GHz FWA、電気設計のためのAIツール、Wi-Fi 7とプライベート5Gは共存するか?など | トップページ | 高周波・RFニュース 2024年7月31日 Qorvo、Skyworksの決算発表、QualcommがSnapdragon 4s Gen 2を発表、u-bloxの測位ソリューションがNVIDIAに採用、MarvellがStructera CXLを発表、IEEE IMS2024の論文集が公開、TDKのAI新会社 »
コメント