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新会社 »
「パソコン・インターネット」カテゴリの記事
- RF Weekly Digest (Gemini 3 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2026/2/1-2026/2/8(2026.02.08)
- Google Antigravityで、いつも見ている高周波関連サイト数十をスクレイピングしてローカルLLM(OllamaのQwen3:8b)で1週間分まとめてもらうRF Weekly Digestを作ってもらった。モデルはGemini 3 Proで。Google AI StudioのBuildで作ったものよりはちょっと劣るか。(2026.02.10)
- RF Weekly Digest (Gemini 3 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2026/1/25-2026/2/1(2026.02.01)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2026年2月13日 GSMAが農村部の通信改善には1GHz以下が必要とレポート、Skyworksがクロックバッファのラインアップ拡充、YageoがWi-Fi 7向けグランド非依存アンテナ発表、SamsungがHBM4量産など(2026.02.13)
- 高周波・RFニュース 2026年2月12日 IEEE Antenna and Propagation Magazineに量子アニーリングの記事、AI-Drivenワイヤレスサミットが3月末に開催、3GPPのCT, SA WG会議がインドのゴア州で開催中、Infineon GaN Insights 2026(2026.02.12)
- 高周波・RFニュース 2026年2月11日 IEEE Microwave Magazineは女性研究者特集、Emerson/NIの2026年通信業界トレンドのホワイトペーパー、アンリツが6G FR3対応の測定器発表、GSAの2月度NTNレポートなど(2026.02.11)
- RF Weekly Digest (Gemini 3 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2026/2/1-2026/2/8(2026.02.08)
- Google Antigravityで、いつも見ている高周波関連サイト数十をスクレイピングしてローカルLLM(OllamaのQwen3:8b)で1週間分まとめてもらうRF Weekly Digestを作ってもらった。モデルはGemini 3 Proで。Google AI StudioのBuildで作ったものよりはちょっと劣るか。(2026.02.10)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年2月13日 GSMAが農村部の通信改善には1GHz以下が必要とレポート、Skyworksがクロックバッファのラインアップ拡充、YageoがWi-Fi 7向けグランド非依存アンテナ発表、SamsungがHBM4量産など(2026.02.13)
- 高周波・RFニュース 2026年2月12日 IEEE Antenna and Propagation Magazineに量子アニーリングの記事、AI-Drivenワイヤレスサミットが3月末に開催、3GPPのCT, SA WG会議がインドのゴア州で開催中、Infineon GaN Insights 2026(2026.02.12)
- 高周波・RFニュース 2026年2月11日 IEEE Microwave Magazineは女性研究者特集、Emerson/NIの2026年通信業界トレンドのホワイトペーパー、アンリツが6G FR3対応の測定器発表、GSAの2月度NTNレポートなど(2026.02.11)
- RF Weekly Digest (Gemini 3 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2026/2/1-2026/2/8(2026.02.08)
- Google Antigravityで、いつも見ている高周波関連サイト数十をスクレイピングしてローカルLLM(OllamaのQwen3:8b)で1週間分まとめてもらうRF Weekly Digestを作ってもらった。モデルはGemini 3 Proで。Google AI StudioのBuildで作ったものよりはちょっと劣るか。(2026.02.10)
« 高周波・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新会社 »




コメント