· 

Pythonで回路計算(5)

前回作った2重モードフィルタはわざと50Ωからずらしましたが、外部素子を追加して50Ωにマッチングさせていきます。

では、前回TouchStoneで保存したファイルを読み込みます。まず読み込んだ後の波形の補間をしてみます。波形の補間はしばしば必要になるテクニックです。市販のシミュレータでは勝手にやってくれるんだと思います。例えば実測データがStart=100MHz, Stop=1000MHz, nop=1601だったとして、これをStart=314MHz, Stop=316MHz, nop=1001に変換したいとか。ちなみにこの後のマッチングでは補間はしないのですが、、、まぁメモです。

import skrf as rf
import matplotlib.pyplot as plt

FIL1 = rf.Network('out.s2p')
FIL1.name='FIL1'
print(FIL1)

new_freq = rf.Frequency(314.0,316,1601,'MHz')
FIL1_new_freq=FIL1.interpolate(new_freq, kind = 'cubic')
FIL1_new_freq.name='FIL1_new_freq'
print(FIL1_new_freq)

fig=plt.figure()

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

ax2_1=fig.add_subplot(2,2,2)
ax2_2=ax2_1.twinx()
FIL1_new_freq.plot_s_db(ax=ax2_1,m=1, n=0, lw=2, show_legend=False)
FIL1_new_freq.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)
FIL1_new_freq.plot_s_db(ax=ax3,m=0, n=1, lw=2)

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

fig.tight_layout()
plt.show()

いちおう確認のためプロットまでさせたので長くなりました。

出力は

2-Port Network: 'FIL1',  314.0-316.0 MHz, 1001 pts, z0=[50.+0.j 50.+0.j]

2-Port Network: 'FIL1_new_freq',  314.0-316.0 MHz, 1601 pts, z0=[50.+0.j 50.+0.j]

 

となり、ポイント数が変更されていることがわかります。

プロットは前回と見た目は同じものが出ました(きっとポイント数は変わっているはず)。

 

おそらくkind='cubic'が3次スプライン補間ってことなんだろう。外挿はできませんでした。ちなみに、自分でシミュレータ作っていたときは、自ら考案した外接円近似ってやつを使ってました。計算が軽くて、まぁまぁいい感じになるし、(ある程度なら)外挿もできるので。

 

ではマッチングについて、まず、トポロジを考えます。幸い今回は対称な特性になっているので、S11だけ見てみます。

まず等コンダクタンス線に沿って反時計回りに回転して、その後、等レジスタンス線に沿って反時計回りに回すと行けそうです。こんな回路で。

トポロジ①とします。

 

また、等コンダクタンス線に沿って時計回りに回して(ほぼ回さなくてもよさそうだけど)、その後、等レジスタンス線に沿って時計回りに回すってのもありです。こんな回路で。

トポロジ②とします。

が、こっちはだいたいのフィルタ屋さんに嫌がられます。フィルタにDCがかかる可能性があるから。ちなみにスミスチャートの見方は、ここが良いと思います。Mr.Smithを使ったマッチングについてもわかりやすい記事があります。

ではトポロジ①で考えよー。ていうか雑に手作業で進めます。手作業のためのpythonコードはこちらです。ところで、重大な問題に気付いた。scikit_rfではs2pを読み込んで回路網につなごうとすると、この部品のGNDは強制的にnetworkのGNDに接続されるらしい。何か手を考えないといけない。いつか。

import skrf as rf
import matplotlib.pyplot as plt

FIL1 = rf.Network('out.s2p')
FIL1.name='FIL1'
print(FIL1)

freq=FIL1.frequency

C_val=1e-6
L_val=1e-3

tl_media = rf.DefinedGammaZ0(freq, z0=50)
C1 = tl_media.capacitor(C_val, name='C1')
C2 = tl_media.capacitor(C_val, name='C2')
L1 = tl_media.inductor(L_val, name='L1')
L2 = tl_media.inductor(L_val, name='L2')
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), (C1, 0)],
    [(C1, 1), (L1, 0), (FIL1, 0)],
    [(FIL1, 1), (L2, 0), (C2, 0)],
    [(port2, 0), (C2, 1)],
    [(gnd, 0), (L1, 1), (L2, 1)]
]
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

fig=plt.figure()
MKRs=['314.9MHz','315MHz','315.1MHz']
ax1=fig.add_subplot(1,1,1)
ntw.plot_s_smith(ax=ax1,m=0, n=0, lw=2)
for mkr in MKRs:
    ntw[mkr].plot_s_smith(ax=ax1,m=0, n=0,marker='o',markersize=2,label=mkr)
fig.tight_layout()
plt.show()

まずはC_val, L_valは回路に影響のない値(CもLもバカでっかくしておけば影響ありません)にしておきます。ではL_valをいじって回していきます。

L_val=25nHでこうなります。つぎで真ん中に寄せられそうです。

次はC_valをいじって回します。

C_val=9pFでこうなります。いいとこ来てます。

伝送特性もいい感じです。

今回は超簡単でしたが、もっとかったるいマッチングのときはどうしたらいいのか?手じゃやってらんねっス。

いや、やってらんねーことなんて日常茶飯事です。日々レベルアップとスキルの獲得を目指して、敵と戦うだけです。できればメタルスライムと。