前回作った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でこうなります。いいとこ来てます。
伝送特性もいい感じです。
今回は超簡単でしたが、もっとかったるいマッチングのときはどうしたらいいのか?手じゃやってらんねっス。
いや、やってらんねーことなんて日常茶飯事です。日々レベルアップとスキルの獲得を目指して、敵と戦うだけです。できればメタルスライムと。
コメントをお書きください