· 

Pythonで回路計算(7)

50Ωではない終端インピーダンスにマッチングさせてみます。

結果がどうなるかわからんので、できるだけ自由度を増やすためにこんな感じで行きます。

こんな感じで75+75jΩを狙います。

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

def Calc_Network(FIL1,C11,C21,L11,L12,L21,L22,gnd,port1,port2):
    cnx = [
        [(port1, 0), (L11, 0), (C11, 0)],
        [(C11, 1), (L12, 0), (FIL1, 0)],
        [(FIL1, 1), (L21, 0), (C21, 0)],
        [(C21, 1), (L22, 0), (port2, 0)],
        [(gnd, 0), (L11, 1), (L12, 1), (L21, 1), (L22, 1)]
    ]
    cir = rf.Circuit(cnx)
    ntw = cir.network
    return ntw

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

freq=FIL1.frequency
tl_media = rf.DefinedGammaZ0(freq, z0=50)
gnd = rf.Circuit.Ground(freq, name='gnd')
port1 = rf.Circuit.Port(freq, name='port1', z0=75+75j)
port2 = rf.Circuit.Port(freq, name='port2', z0=50)

C11_def=9e-12
C21_def=9e-12
L11_def=100e-9
L12_def=25e-9
L21_def=25e-9
L22_def=100e-9
x0=(C11_def,C21_def,L11_def,L12_def,L21_def,L22_def)

f_range_lower=314.9e6
f_range_upper=315.1e6
vswr_max=1.5

def matching_network(C11_val,C21_val,L11_val,L12_val,L21_val,L22_val):
    C11 = tl_media.capacitor(C11_val, name='C11')
    C21 = tl_media.capacitor(C21_val, name='C21')
    L11 = tl_media.inductor(L11_val, name='L11')
    L12 = tl_media.inductor(L12_val, name='L12')
    L21 = tl_media.inductor(L21_val, name='L21')
    L22 = tl_media.inductor(L22_val, name='L22')
    ntw=Calc_Network(FIL1,C11,C21,L11,L12,L21,L22,gnd,port1,port2)
    return ntw

def get_err(x):
    ntw=matching_network(*x)
    irange=np.where((ntw.f>=f_range_lower)&(ntw.f<=f_range_upper))
    vswr1=ntw.s_vswr[irange,0,0]
    vswr2=ntw.s_vswr[irange,1,1]
    tgt=np.ones_like(vswr1)*vswr_max
    eval1=vswr1-tgt
    eval2=vswr2-tgt
    err1=np.where(eval1<0,0,eval1)
    err2=np.where(eval2<0,0,eval2)
    return (np.sum(err1)+np.sum(err2))

res=scipy.optimize.fmin(get_err,x0)
print(res)
res=scipy.optimize.fmin(get_err,res)
print(res)
res=scipy.optimize.fmin(get_err,res)
print(res)

#ntw=matching_network(*x0)
ntw=matching_network(*res)

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()

で、こうなって、

 

Optimization terminated successfully.

         Current function value: 157.968149

         Iterations: 160

         Function evaluations: 258

[1.06392215e-11 6.59865874e-12 8.94574966e-08 4.62103156e-08

 2.47733446e-08 9.53137448e-08]

Optimization terminated successfully.

         Current function value: 157.600254

         Iterations: 122

         Function evaluations: 205

[7.40327019e-12 6.61206826e-12 7.65055342e-08 4.20194397e-08

 2.60987319e-08 1.18529212e-07]

Optimization terminated successfully.

         Current function value: 157.600254

         Iterations: 46

         Function evaluations: 89

[7.40327019e-12 6.61206826e-12 7.65055342e-08 4.20194397e-08

 2.60987319e-08 1.18529212e-07]

こうなる。フィルタの通過帯域はできているようですが、VSWRはイマイチ。はたしていいとこ来ているんでしょうか、、、?結果のNetworkを50Ω終端で見てみると、

確かにS11において、75+75jΩより虚部が小さめなところに集まっている状態なので、きっとうまくやってくれたってことでしょう。トポロジとして限界ってことなのか、そもそものデバイスが対称なので限界ってことなのか、、、まぁこんな無茶なリクエストにもそれなりに応えてくれたってことで、、、

もやっとするけど、こんなもんでしょ。