多段伝送線路の反射特性

モジュールのインポート

import numpy as np
from scipy.special import comb
import matplotlib.pyplot as plt
import csv
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])

ユーザ関数

縱続接続した$N$段の伝送線路の反射・透過係数を計算する関数は,
def mstl(z,tth): # 縱続接続したN段線路の反射・透過係数の計算
    n = len(z)-2
    vp1 = 1.0
    vm1 = 0.0
    for j in range(n,-1,-1):
        zi = z[j]/z[j+1]
        zp = 1.0+zi
        zm = 1.0-zi
        ep = np.exp(1j*tth*(j!=0))
        em = 1.0/ep
        vm = ep * (zm*vp1 + zp*vm1)/2.0
        vp = em * (zp*vp1 + zm*vm1)/2.0
        vp1 = vp
        vm1 = vm
    t = 1.0/vp/np.sqrt(z[n+1])
    r = vm/vp
    return r,t # 反射係数,透過係数(ルート電力)
複素係数から絶対値,デジベル[dB],偏角[deg]の計算は,
def dbdeg(z):
    q = 180.0/np.pi
    amp = np.abs(z)
    db = 20.0*np.log10(amp)
    deg = np.angle(z)*q
    return amp,db,deg
フォーマットで整頓した数表の出力は,
def table(sh,sv,h,v,f):
    print(f"{sh:>6s}",end=' ')
    nh = len(h)
    nv = len(v)
    [print(f"{h[j]:6.3f}",end=' ') for j in range(nh)]
    print('')
    print(f"{sv:>6s}",end=' ')
    print('')
    for i in range(nv):
        print(f'{v[i]:6.3f}',end=' ')
        [print(f"{f[i,j]:6.3f}",end=' ') for j in range(nh)]
        print('')
    return

csvファイルの読み込み

1/4波長(中心周波数)の線路を縦続接続して構成した3段伝送線路の各段の特性インピーダンスをcsvファイルから読み込む.
with open('binomial_transformer_z_n_3.csv') as file:
    reader = csv.reader(file, quoting=csv.QUOTE_NONNUMERIC)
    sst = [row for row in reader]
zzt = np.array(sst)
zz = np.transpose(zzt)
n0 = zz.shape[0]
n1 = zz.shape[1]
n0,n1
(5, 5)
終端の負荷の規格化負荷インピーダンスは$Z_L/Z_0=1.5, 2, 3, 4, 6$であり,読み込んだ数値を出力すると,
n_zl_case = n0
n = n1-2
zl_case = np.empty(0)
zl_case = np.append(zl_case,zzt[n+1,:])
table("ZL/Z0","n",zl_case,range(0,n+2,1),zzt)
ZL/Z0  1.500  2.000  3.000  4.000  6.000 
    n 
0.000  1.000  1.000  1.000  1.000  1.000 
1.000  1.052  1.091  1.147  1.189  1.251 
2.000  1.225  1.414  1.732  2.000  2.449 
3.000  1.426  1.834  2.615  3.364  4.796 
4.000  1.500  2.000  3.000  4.000  6.000
3段伝送線路の反射係数を計算して,
el = np.pi/2.0
f_min, f_max, n_f = 0.0, 2.0, 501 # 規格化周波数
ff = np.linspace(f_min, f_max, n_f)
tth = el*ff
tt = np.empty((0,n_f))
rr = np.empty((0,n_f))
for i in range(n_zl_case): # 段数は同じ,ZL/Z0が違うケース
    r,t= mstl(zz[i,:],tth) # 多段伝送線路の特性計算
    rr = np.append(rr, [r], axis=0)  
    tt = np.append(tt, [t], axis=0)   
t_amp, t_db, t_deg = dbdeg(tt) # 関数
r_amp, r_db, r_deg = dbdeg(rr) # 関数
反射係数を表として出力すると,
deln = n_f//10
r_ampt = np.transpose(r_amp)
print("R")
table("ZL/Z0","f/f0",zl_case,ff[::deln],r_ampt[::deln,:]) # 数表の作成
R
 ZL/Z0  1.500  2.000  3.000  4.000  6.000 
  f/f0 
 0.000  0.200  0.333  0.500  0.600  0.714 
 0.200  0.173  0.291  0.445  0.542  0.660 
 0.400  0.107  0.184  0.293  0.370  0.478 
 0.600  0.041  0.072  0.117  0.153  0.207 
 0.800  0.006  0.011  0.018  0.024  0.033 
 1.000  0.000  0.000  0.000  0.000  0.000 
 1.200  0.006  0.011  0.018  0.024  0.033 
 1.400  0.041  0.072  0.117  0.153  0.207 
 1.600  0.107  0.184  0.293  0.370  0.478 
 1.800  0.173  0.291  0.445  0.542  0.660 
 2.000  0.200  0.333  0.500  0.600  0.714 
デシベル値では,
r_dbt = np.transpose(r_db)
print("R [dB]")
table("ZL/Z0","f/f0",zl_case,ff[::deln],r_dbt[::deln,:]) # 数表の作成
R [dB]
 ZL/Z0  1.500  2.000  3.000  4.000  6.000 
  f/f0 
 0.000 -13.979 -9.542 -6.021 -4.437 -2.923 
 0.200 -15.241 -10.721 -7.033 -5.313 -3.606 
 0.400 -19.372 -14.695 -10.663 -8.630 -6.419 
 0.600 -27.646 -22.870 -18.605 -16.334 -13.678 
 0.800 -44.351 -39.482 -35.011 -32.545 -29.557 
 1.000 -325.850 -323.906 -375.954 -323.174 -317.331 
 1.200 -44.351 -39.482 -35.011 -32.545 -29.557 
 1.400 -27.646 -22.870 -18.605 -16.334 -13.678 
 1.600 -19.372 -14.695 -10.663 -8.630 -6.419 
 1.800 -15.241 -10.721 -7.033 -5.313 -3.606 
 2.000 -13.979 -9.542 -6.021 -4.437 -2.923 

プロット

プロットに使用するカラーマップインスタンスを生成して,
cm_g = plt.get_cmap("Greys")
cm_r = plt.get_cmap("Reds")
cm_b = plt.get_cmap("Blues")
cm_o = plt.get_cmap("Oranges")
cm_s = plt.get_cmap("Spectral")
プロットして,
fig = plt.figure() # グラフ領域の作成
plt.text( 1.62, 0.03, f"$N=${n:.0f}", fontsize=14)
plt.text( 0.85, 0.275, f"$Z_L/Z_0$", fontsize=14)
plt.grid(color = "gray", linestyle="--")
plt.minorticks_on()
plt.xlim(0.2, 1.8) # x軸範囲の設定
plt.xticks(np.arange(0.2, 2.0, step=0.2))
plt.ylim(0, 0.3) # y軸範囲の設定
plt.yticks(np.arange(0, 0.4, step=0.1))
plt.xlabel("$f/ f_0$") # x軸のラベル設定
plt.ylabel("$|\Gamma|$") # y軸のラベル設定
plt.plot(ff, r_amp[0,:], color=cm_g(0.55), label=f"{zz[0][n+1]:.1f}", linestyle="--")
plt.plot(ff, r_amp[1,:], color=cm_r(0.55), label=f"{zz[1][n+1]:.1f}", linestyle="--")
plt.plot(ff, r_amp[2,:], color=cm_b(0.60), label=f"{zz[2][n+1]:.1f}", linestyle="--")
plt.plot(ff, r_amp[3,:], color=cm_o(0.50), label=f"{zz[3][n+1]:.1f}", linestyle="--")
plt.plot(ff, r_amp[4,:], color=cm_s(0.75), label=f"{zz[4][n+1]:.1f}", linestyle="--")

plt.legend(ncol=2, loc='upper right', fancybox=False, frameon = True)
fig.savefig('p3_tlt_s11_binomial_n3.pdf')
plt.show()