· 

Pythonで回路計算(4)

2重モードフィルタ(Monolithic Crystal Filterとか)の等価回路を計算してSパラを出力しようと思います。2重モードフィルタの等価回路はこういうものです。

QucsStudioで計算すると、

こうなります。結果が50Ωからずれるようにちょっと定数をいじっています。

、、、計算できてるならscikit_rfで計算するひつようないやん。って思いますよね。その通りです。scikit_rfでやるモチベーションは興味だけです。

そこで、問題発生。scikit_rfでトランスを表現する方法がわからない。CとかLとかRはここみればふむふむなんだけど、トランスはない。では作る。トランスのSパラメータはここ(TDKさんの「Sパラメータによる電子部品の評価」)の9ページの左下に書いてある。この文書、自分でシミュレータやら作ってた時に参考にした文書で、まさに神。で、それによると、理想トランスのSパラメータは

\[ \begin{pmatrix} 0.5 & 0.5 & 0.5 & -0.5 \\ 0.5 & 0.5 & -0.5 & 0.5 \\ 0.5 & -0.5 & 0.5 & 0.5 \\ -0.5 & 0.5 & 0.5 & 0.5 \\ \end{pmatrix} \]

で、scikit_rfのNetworkオブジェクトを作って、計算する周波数範囲を設定して、全周波数に対してこの値を設定すればいいわけです。たぶん。で、とりあえずやってみる。

import numpy as np
import skrf as rf

freq = rf.Frequency(start=314.3, stop=315.7, unit='MHz', npoints=1001)
network_trans=rf.Network()
network_trans.frequency=freq
trans_s_base=np.array([[0.5,0.5,0.5,-0.5],[0.5,0.5,-0.5,0.5],[0.5,-0.5,0.5,0.5],[-0.5,0.5,0.5,0.5]])
trans_s=np.tile(trans_s_base,(freq.f.size,1,1))
network_trans.s=trans_s
print(network_trans.y)

すると、エラーが出ます。まぁ当然です。理想トランスのYパラメータは全要素が無限大(どっかにちょっと電圧かけると無限大の電流が全端子に流れるわけなので)です。まぁこれじゃわからんので、雑念を入れてざっくりでも計算してもらいます。

import numpy as np
import skrf as rf

freq = rf.Frequency(start=314.3, stop=315.7, unit='MHz', npoints=1001)
network_trans=rf.Network()
network_trans.frequency=freq
trans_s_base=np.array([[0.5,0.5,0.5,-0.5],[0.5,0.5,-0.5,0.5],[0.5,-0.5,0.5,0.5],[-0.5,0.5,0.5,0.5]])
trans_s_noise=np.eye(4)*1e-15
trans_s=np.tile(trans_s_base+trans_s_noise,(freq.f.size,1,1))
network_trans.s=trans_s
print(network_trans.y)

で、結果は周波数全域にわたり要素が

[[ 8.79609302e+12+0.j -8.79609302e+12+0.j -8.79609302e+12+0.j 8.79609302e+12+0.j]

  [-8.79609302e+12+0.j  8.79609302e+12+0.j  8.79609302e+12+0.j -8.79609302e+12+0.j]

  [-8.79609302e+12+0.j  8.79609302e+12+0.j  8.79609302e+12+0.j -8.79609302e+12+0.j]

  [ 8.79609302e+12+0.j -8.79609302e+12+0.j -8.79609302e+12+0.j  8.79609302e+12+0.j]]]

のYパラメータが出ました。回路的にあっているのか検証してみます。いらん?まぁ結果の考察も大事なので。参考資料によると、今回の回路はこうなっています。

で、Yパラメータとは

\[ \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \end{pmatrix} = \begin{pmatrix} Y_{11} & Y_{12} & Y_{13} & Y_{14} \\ Y_{21} & Y_{22} & Y_{23} & Y_{24} \\ Y_{31} & Y_{32} & Y_{33} & Y_{34} \\ Y_{41} & Y_{42} & Y_{43} & Y_{44} \end{pmatrix} \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \end{pmatrix} \]

ってことで、理想トランスのYパラメータの計算結果を入れると、

\[ \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \end{pmatrix} = \begin{pmatrix} \infty & -\infty & -\infty & \infty \\ -\infty & \infty & \infty & -\infty \\ -\infty & \infty & \infty & -\infty \\ \infty & -\infty & -\infty & \infty \end{pmatrix} \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \end{pmatrix} \]
で、$V_1\neq0, V_2=V_3=V_4=0$とすると、
\[ \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \end{pmatrix} = \begin{pmatrix} \infty \\ -\infty \\ -\infty \\ \infty \end{pmatrix} \]

端子1には正方向の無限大の電流

端子3には逆方向の無限大の電流

トランスは同じコアに対して同じ巻き方向で線を巻いていることにしているので(たぶん)、端子2にはコアの磁束を打ち消す方向に電流が流れることになります。なので、

端子2には逆方向の無限大の電流

端子4には正方向の無限大の電流

よし、原理にあった結果だとわかりました。

ここからが本番です。しんどい。

ということで、一気にやったのがこちらになります。(いつも通りコメント皆無)

import numpy as np
import skrf as rf
import matplotlib.pyplot as plt

freq = rf.Frequency(start=314, stop=316, unit='MHz', npoints=1001)

TR1=rf.Network()
TR1.frequency=freq
trans_s_base=np.array([[0.5,0.5,0.5,-0.5],[0.5,0.5,-0.5,0.5],[0.5,-0.5,0.5,0.5],[-0.5,0.5,0.5,0.5]])
trans_s=np.tile(trans_s_base,(freq.f.size,1,1))
TR1.s=trans_s
TR1.name='TR1'#これがないと怒られる

tl_media = rf.DefinedGammaZ0(freq, z0=50)
C1 = tl_media.capacitor(2e-15, name='C1')
C2 = tl_media.capacitor(2e-15, name='C2')
R1 = tl_media.resistor(10, name='R1')
R2 = tl_media.resistor(10, name='R2')
L1 = tl_media.inductor(127.5e-6, name='L1')
L2 = tl_media.inductor(127.8e-6, name='L2')
C3 = tl_media.capacitor(1e-12, name='C3')
C4 = tl_media.capacitor(4e-12, name='C4')
C5 = tl_media.capacitor(4e-12, name='C5')
gnd = rf.Circuit.Ground(freq, name='gnd')
port1 = rf.Circuit.Port(freq, name='port1', z0=50)
port2 = rf.Circuit.Port(freq, name='port2', z0=50)

cnx = [
    [(port1, 0), (L1, 0), (L2, 0), (C3, 0), (C4, 0)],
    [(L1, 1), (C1, 0)],
    [(C1, 1), (R1, 0)],
    [(L2, 1), (C2, 0)],
    [(C2, 1), (R2, 0)],
    [(R2, 1), (TR1, 2)],
    [(port2, 0), (R1, 1), (TR1, 1), (C3, 1), (C5, 0)],
    [(gnd, 0), (C4, 1), (C5, 1), (TR1, 0), (TR1, 3)]
]
cir = rf.Circuit(cnx)
cir.plot_graph(network_labels=True, network_fontsize=15,
               port_labels=True, port_fontsize=15,
              edge_labels=True, edge_fontsize=10)
ntw = cir.network

ntw.write_touchstone('out')

fig=plt.figure()

ax1=fig.add_subplot(2,2,1)
ntw.plot_s_smith(ax=ax1,m=0, n=0, lw=2)

ax2_1=fig.add_subplot(2,2,2)
ax2_2=ax2_1.twinx()
ntw.plot_s_db(ax=ax2_1,m=1, n=0, lw=2, show_legend=False)
ntw.plot_s_vswr(ax=ax2_2,m=0, n=0, lw=2, show_legend=False, color='orangered')
ax2_2.set_ylim(1,6)
handler1, label1 = ax2_1.get_legend_handles_labels()
handler2, label2 = ax2_2.get_legend_handles_labels()
ax2_1.legend(handler1 + handler2, label1 + label2, loc=2, borderaxespad=0.)

ax3=fig.add_subplot(2,2,3)
ntw.plot_s_db(ax=ax3,m=0, n=1, lw=2)

ax4=fig.add_subplot(2,2,4)
ntw.plot_s_smith(ax=ax4,m=1, n=1, lw=2)

fig.tight_layout()
plt.show()

で、

QucsStudioと同じ結果が得られたようです。トランスのSパラへの雑念の追加はいらないようです(純粋にYパラにするとエラーになるんでしょう、きっと)。

39行目のおまじないにより、今回はこんなのも出ます。

これで、回路網記述に間違いがないかをチェックしろってことなんだろうけど、あまり役に立ちそうにないなぁ、、、

44行目でTaouchStone形式でファイルに書き出しています。ネットワークには外部ポートが2つあるので、拡張子は勝手に「s2p」になります。

で中身は

!Created with skrf (http://scikit-rf.org).
# MHz S RI R 50.0 
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
314.0 0.5236694874995232 -0.8409128121399311 0.11136470559027543 0.06969650212934998 0.11136470559027573 0.06969650212934989 0.5236694874994059 -0.8409128121397398
314.002 0.5234834153883764 -0.8410395553307285 0.11130075599127513 0.06962358696768937 0.11130075599127469 0.06962358696768992 0.5234834153883511 -0.8410395553306876
314.004 0.5232965105603404 -0.8411668075663261 0.11123637205905557 0.06955031618856548 0.11123637205905548 0.06955031618856573 0.5232965105602277 -0.8411668075661424
314.006 0.5231087671097074 -0.8412945719358549 0.11117154993743299 0.06947668733979173 0.11117154993743307 0.06947668733979262 0.5231087671097892 -0.8412945719359886
...略

となっています。うまくいったようです。

ところで、人生の幸福度は47~48歳が最低らしいです。間違いない!