« 高周波・RFニュース 2024年7月24日 Qualcommの6G TCO削減解説、iFixitのゲームカートリッジに息を吹きかけると効果あるか?SamsungのGalaxy Z Fold6, Flip6の内部構造解説,GSAウェビナー アジア太平洋地域の5G,Wi-Fi 8におけるミリ波,MACOMの55GHzまでのLNA | トップページ | 高周波・RFニュース 2024年7月25日 Vishayの車載向け70GHz薄膜チップ抵抗、Google,Volvoが6G人材募集中、MatsingとKeysightの5G/6G動画、TT-Mobileに対してAT&TとVerisonの5Gは低速、太陽誘電のスマホ向け積層メタル系パワーインダクタ »

2024年7月24日 (水)

Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(2) Circuit機能を使ってL,CをつなげていってLPF(ローパスフィルタ)を合成してSパラメータを得る。チェビシェフとバタワースを比較したり素子の繋がりを図示したり。

さて先日は素子の値を求める関数を作った。

Pythonの高周波ライブラリscikit-rfを使ってマイクロ波LCフィルタ合成をする(1)プロトタイプLPF(チェビシェフ、バタワース)の素子の値を計算する関数をMatthai, Young & JonesのMicrowave Filters, Impedance-matching networks, and coupling structureを基に作る。 

今回はその値を持つL,Cをつなげて実際のフィルタを作ってみる。scikit-rfのCircuit機能を使う。

https://scikit-rf.readthedocs.io/en/latest/tutorials/Circuit.html

作った関数のコードはこちら。


def LPF_synthesis(n, fc, fstart, fstop, points, z0=50.0, first_element="series", type = "Chebyshev", ripple = 0.1):
    """
    LPFを合成し、scikit-rfのCircuitとして返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[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_LPF(n, fc, z0, first_element, type, ripple)
    tl_media = rf.DefinedGammaZ0(freq, z0=LC_elements[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])

    if first_element == "series":
        L = [0]
        C = [0]
        countL = 1
        countC = 1
        for k in range(1, n + 1):
            if k % 2 != 0:
                L.append(tl_media.inductor(LC_elements[k], name = f"L{countL}"))
                countL +=1
            else:
                C.append(tl_media.capacitor(LC_elements[k], name = f"C{countC}"))
                countC += 1
        cnx = [[(port1, 0), (L[1],  0)]]
        if n % 2 != 0:
            for k in range(1, n//2 + 1):
                cnx.append([(L[k], 1), (C[k], 0), (L[k+1], 0)])
            cnx.append([(L[n//2 + 1], 1), (port2, 0)])
        else:
            for k in range(1, n//2):
                cnx.append([(L[k], 1), (C[k], 0), (L[k+1], 0)])
            cnx.append([(L[n//2], 1), (C[n//2], 0), (port2, 0)])
        gnd_cnx = [(gnd, 0)]
        for k in range(1, n//2 + 1):
            gnd_cnx.append((C[k],1))
        cnx.append(gnd_cnx)
    elif first_element == "shunt":
        L = [0]
        C = [0]
        countL = 1
        countC = 1
        for k in range(1, n + 1):
            if k % 2 != 0:
                C.append(tl_media.capacitor(LC_elements[k], name = f"C{countC}"))
                countC +=1
            else:
                L.append(tl_media.inductor(LC_elements[k], name = f"L{countL}"))
                countL += 1
        cnx = [[(port1, 0), (C[1],  0), (L[1], 0)]]
        gnd_cnx = [(gnd, 0)]
        if n % 2 != 0:
            for k in range(1, n//2):
                cnx.append([(L[k], 1), (C[k+1], 0), (L[k+1], 0)])
            cnx.append([(L[n//2], 1), (C[n//2 + 1], 0), (port2, 0)])
            for k in range(1, n//2 + 2):
                gnd_cnx.append((C[k],1))
        else:
            for k in range(1, n//2):
                cnx.append([(L[k], 1), (C[k+1], 0), (L[k+1], 0)])
            cnx.append([(L[n//2], 1), (port2, 0)])
            for k in range(1, n//2 + 1):
                gnd_cnx.append((C[k], 1))
        cnx.append(gnd_cnx)
    return rf.Circuit(cnx)

  LPFを合成し、scikit-rfのCircuitとして返す関数
    n : フィルタの次数(チェビシェフの場合、偶数だと負荷のインピーダンスが50Ωになりません)
    fc : カットオフ周波数[GHz]
    fstart : 開始周波数[GHz]
    fstop : 終了周波数[GHz]
    points : 周波数点数
    z0 : 信号源の特性インピーダンス
    first_element : 最初にシリーズのLが来る場合"series", 最初にシャントのCが来る場合"shunt"
    type : チェビシェフの場合"Chebyshev", バタワースの場合 "Butterworth"
    ripple : チェビシェフの場合のリップルの大きさをdBで表したもの
となっている。

ではやってみよう。まずは9次のチェビシェフフィルタ(リップル0.5dB)と9次のバタワースフィルタを比較する。

lpf_chebyshev = LPF_synthesis(9, fc=5, fstart=1, fstop=20, points=1001, ripple=0.5)
lpf_butterworth = LPF_synthesis(9, fc=5, fstart=1, fstop=20, points=1001, type="Butterworth")
lpf_chebyshev.name = "9th order Chebyshev"
lpf_butterworth.name = "9th order Butterworth"
fig = plt.figure(figsize=(10,7))
lpf_chebyshev.network.plot_s_db(m=1, n=0, logx=True)
lpf_chebyshev.network.plot_s_db(m=0, n=0, logx=True)
lpf_butterworth.network.plot_s_db(m=1, n=0, logx=True)
lpf_butterworth.network.plot_s_db(m=0, n=0, logx=True)
plt.ylim(-80, 5)
plt.ylabel("S parameter[dB]")
実行結果はこうなって、チェビシェフの方が急峻だがリップルが入っているのがわかる。
Lpfsynth01
回路のつながりは以下で確認できる。
lpf_chebyshev.plot_graph(network_labels=True,port_labels=True, edge_labels=True)
Lpfsynth02
分かりにくいがちゃんと想定通り繋がっている。次はバンドパスフィルタ(BPF)かな。

« 高周波・RFニュース 2024年7月24日 Qualcommの6G TCO削減解説、iFixitのゲームカートリッジに息を吹きかけると効果あるか?SamsungのGalaxy Z Fold6, Flip6の内部構造解説,GSAウェビナー アジア太平洋地域の5G,Wi-Fi 8におけるミリ波,MACOMの55GHzまでのLNA | トップページ | 高周波・RFニュース 2024年7月25日 Vishayの車載向け70GHz薄膜チップ抵抗、Google,Volvoが6G人材募集中、MatsingとKeysightの5G/6G動画、TT-Mobileに対してAT&TとVerisonの5Gは低速、太陽誘電のスマホ向け積層メタル系パワーインダクタ »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 高周波・RFニュース 2024年7月24日 Qualcommの6G TCO削減解説、iFixitのゲームカートリッジに息を吹きかけると効果あるか?SamsungのGalaxy Z Fold6, Flip6の内部構造解説,GSAウェビナー アジア太平洋地域の5G,Wi-Fi 8におけるミリ波,MACOMの55GHzまでのLNA | トップページ | 高周波・RFニュース 2024年7月25日 Vishayの車載向け70GHz薄膜チップ抵抗、Google,Volvoが6G人材募集中、MatsingとKeysightの5G/6G動画、TT-Mobileに対してAT&TとVerisonの5Gは低速、太陽誘電のスマホ向け積層メタル系パワーインダクタ »

最近の記事

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

最近のコメント

無料ブログはココログ
フォト