2項整合変成器の設計

モジュールのインポート

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'])

ユーザ関数

数表の作成(フォーマットで整頓した出力)ため,
def table(sh,sv,h,v,f):
    print(f"{sh:>6s}",end=' ')
    nh = len(h)
    nv = len(v)
    [print(f"{h[j]:6.4f}",end=' ') for j in range(nh)]
    print('')
    print(f"{sv:>6s}",end=' ')
    print('')
    for i in range(nv):
        print(f'{v[i]:6.4f}',end=' ')
        [print(f"{f[i,j]:6.4f}",end=' ') for j in range(nh)]
        print('')
    return
電磁界の複素係数から絶対値,デジベル[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
2項整合変成器の定数を計算するため,
def binomial_transformer_const(n):
    ccb = np.empty(0)
    for i in range(n+1):
        cb = comb(n, i, exact=True)# exact=Trueで戻り値が"inf"になるのを回避できる.
        ccb = np.append(ccb, cb)
    n2n = 2.0**(-n)
    aa = ccb*n2n/2.0
    print("aa=",aa)   
    m = 0
    mm = np.empty(0)
    for i in range(n):
        m = m+ccb[i]
        mm = np.append(mm, m)
    mm = mm*n2n
    print("mm=",mm)
    return mm, aa
2項整合変成器の比帯域は,
def binomial_transformer_bandwidth(n,z,gm):
    zln = np.log(z)
    p = (2.0*gm/zln)**(1.0/n)
    acp = np.arccos(p)
    df = 2.0-4.0/np.pi*acp
    return df
2項整合変成器の設計は,
def binomial_transformer(z,mm):
    zn = z**mm
    return zn

2項整合変成器の特性インピーダンス

まず,出力する値の精度を指定して,
np.set_printoptions(precision=4)
設計する多段線路の段数 $N$ を設定して,
n = 2 # 設計する多段線路の段数
nn = np.arange(1,n+1,1)
print("nn=",nn)
nn= [1 2]
規格化負荷インピーダンス $Z_L$ は,
zz = np.array([1.5, 2.0, 3.0, 4.0, 6.0])
n_zz = len(zz)
print("zz=",zz)
zz= [1.5 2.  3.  4.  6. ]
比帯域を定義するため,$\Gamma_m$を設定すると,
# gm = 0.05
# gm_db = 20.0*np.log10(gm)
gm_db = -20.0 # 比帯域を定義する値
gm = 10.0**(gm_db/20.0)
print("gm=",gm,f"{gm_db:.2f}","[dB]")
gm= 0.1 -20.00 [dB]
2項変成器の定数,比帯域,特性インピーダンス $Z_n/Z_0$ を求めて,
mm, aa = binomial_transformer_const(n) # 2項変成器の定数の計算
ddf = np.empty(0)
zzn = np.empty((0,n))
for z in zz:
    df = binomial_transformer_bandwidth(n,z,gm) # 2項変成器の比帯域
    ddf = np.append(ddf, df)
    zn = binomial_transformer(z,mm) # 2項変成器
    zzn = np.append(zzn, [zn], axis=0)
aa= [0.125 0.25  0.125]
mm= [0.25 0.75]
設計した特性インピーダンス $Z_n/Z_0$ を出力すると,
zznt = np.transpose(zzn)
nn2 = np.arange(0,n+2,1)
zznt2 = np.empty((0,n_zz))
zznt2 = np.append(zznt2, [np.ones(n_zz)], axis=0)
zznt2 = np.append(zznt2, zznt, axis=0)
zznt2 = np.append(zznt2, [zz], axis=0)
print("Zn/Z0")
table("ZL/Z0","n",zz,nn2,zznt2)
Zn/Z0
 ZL/Z0 1.5000 2.0000 3.0000 4.0000 6.0000 
     n 
0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.1067 1.1892 1.3161 1.4142 1.5651 
2.0000 1.3554 1.6818 2.2795 2.8284 3.8337 
3.0000 1.5000 2.0000 3.0000 4.0000 6.0000
設計した特性インピーダンス $Z_n/Z_0$ をcsvファイルに書き出して,
with open('p3_tlt_binomial_matching_transformer2.csv', 'w', encoding='utf-8', newline='') as file:
    csv.writer(file).writerows(zznt2)

設計した2項整合変成器の周波数特性

反射係数の周波数特性を計算して,
f_min, f_max, n_f = 0.0, 2.5, 201
f = np.linspace(f_min, f_max, n_f)
th = np.pi/2.0*f
ggn = np.empty((0,n+1))
gg = np.empty((0,n_f))
for z in zz:
    zln = np.log(z)
    gn = aa*zln
    cth = np.cos(th)
    g = np.abs(0.5*zln*cth**n)
    ggn= np.append(ggn, [gn], axis=0)
    gg= np.append(gg, [g], axis=0)  
gg_amp, gg_db, gg_deg = dbdeg(gg)
比帯域は,
print("ddf=",ddf)
ddf= [0.9914 0.722  0.5613 0.4961 0.4337]
反射係数 $\Gamma$ の周波数特性を部分的に出力すると,
ggt = np.transpose(gg)
print("Gamma")
table("ZL/Z0","f/f0",zz,f[::10],ggt[::10,:])
Gamma
 ZL/Z0 1.5000 2.0000 3.0000 4.0000 6.0000 
  f/f0 
0.0000 0.2027 0.3466 0.5493 0.6931 0.8959 
0.1250 0.1950 0.3334 0.5284 0.6668 0.8618 
0.2500 0.1730 0.2958 0.4689 0.5916 0.7647 
0.3750 0.1402 0.2396 0.3798 0.4792 0.6194 
0.5000 0.1014 0.1733 0.2747 0.3466 0.4479 
0.6250 0.0626 0.1070 0.1695 0.2139 0.2765 
0.7500 0.0297 0.0508 0.0804 0.1015 0.1312 
0.8750 0.0077 0.0132 0.0209 0.0264 0.0341 
1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 
1.1250 0.0077 0.0132 0.0209 0.0264 0.0341 
1.2500 0.0297 0.0508 0.0804 0.1015 0.1312 
1.3750 0.0626 0.1070 0.1695 0.2139 0.2765 
1.5000 0.1014 0.1733 0.2747 0.3466 0.4479 
1.6250 0.1402 0.2396 0.3798 0.4792 0.6194 
1.7500 0.1730 0.2958 0.4689 0.5916 0.7647 
1.8750 0.1950 0.3334 0.5284 0.6668 0.8618 
2.0000 0.2027 0.3466 0.5493 0.6931 0.8959 
2.1250 0.1950 0.3334 0.5284 0.6668 0.8618 
2.2500 0.1730 0.2958 0.4689 0.5916 0.7647 
2.3750 0.1402 0.2396 0.3798 0.4792 0.6194 
2.5000 0.1014 0.1733 0.2747 0.3466 0.4479
反射係数の大きさ$|\Gamma|$,そのデシベル値をプロットして,
fig = plt.figure(figsize=(6*2, 4*2)) # グラフ領域の作成
plt.subplot(2, 2, 1) # 左上側の図
plt.text( 1.75, 0.04, f"$N=${n:.0f}", fontsize=14)
plt.text( 0.6, 0.9, f"$Z_L/Z_0$", fontsize=14)
plt.grid(color = "gray", linestyle="--")
plt.minorticks_on()
plt.xlim(0.0, 2.0) # x軸範囲の設定
plt.xticks(np.arange(0.0, 2.5, step=0.5))
plt.ylim(0.0, 1.0) # y軸範囲の設定
plt.yticks(np.arange(0, 1.2, step=0.2))
plt.xlabel("$f/ f_0$") # x軸のラベル設定
plt.ylabel("$|\Gamma|$") # y軸のラベル設定
plt.plot(f, gg[0,:], label=f"{zz[0]:.1f}", linestyle=(0, (1, 0)) )
plt.plot(f, gg[1,:], label=f"{zz[1]:.1f}", linestyle=(0, (2, 2)) )
plt.plot(f, gg[2,:], label=f"{zz[2]:.1f}", linestyle=(0, (6, 2)) )
plt.plot(f, gg[3,:], label=f"{zz[3]:.1f}", linestyle=(0, (6, 1.5, 1.5, 1.5)) )
plt.plot(f, gg[4,:], label=f"{zz[4]:.1f}", linestyle=(0, (6, 1, 1, 1, 1, 1)) )
plt.legend(ncol=2, loc='upper right', fancybox=False, frameon = True)

plt.subplot(2, 2, 2) # 右上の図
plt.text( 1.75, -38.5, f"$N=${n:.0f}",fontsize=14)
plt.text( 0.6, -4.0, f"$Z_L/Z_0$",fontsize=14)
plt.grid(color = "gray", linestyle="--")
plt.minorticks_on()
plt.xlim(0.0, 2.0) # x軸範囲の設定
plt.xticks(np.arange(0.0, 2.5, step=0.5))
plt.ylim(-40, 0) # y軸範囲の設定
plt.yticks(np.arange(-40, 10, step=10))
plt.xlabel("$f/ f_0$") # x軸のラベル設定
plt.ylabel("$|\Gamma|$ [dB]") # y軸のラベル設定
plt.plot(f, gg_db[0,:], label=f"{zz[0]:.1f}", linestyle=(0, (1, 0)) )
plt.plot(f, gg_db[1,:], label=f"{zz[1]:.1f}", linestyle=(0, (2, 2)) )
plt.plot(f, gg_db[2,:], label=f"{zz[2]:.1f}", linestyle=(0, (6, 2)) )
plt.plot(f, gg_db[3,:], label=f"{zz[3]:.1f}", linestyle=(0, (6, 1.5, 1.5, 1.5)) )
plt.plot(f, gg_db[4,:], label=f"{zz[4]:.1f}", linestyle=(0, (6, 1, 1, 1, 1, 1)) )

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

同様にして,段数を増やして $N=3,4,5$ を計算し,プロットすると次のようになる.