Scikit-RFを使ったRF回路解析と設計1 伝送線路と同軸ケーブル

RF

Scikit-rf(以下、skrf)というPythonのRF回路解析・設計用モジュールがある。
高周波回路解析に必要な機能はだいたい備わっている。Touchstoneファイル (.sNp)を読み込んでSパラメータをスミスチャート上に表示したり、Mediaライブラリには同軸線路やマイクロストリップ、導波管などの代表的な伝送線路が標準搭載されており、自前でそれらのコンポーネントをCUIで組み立て回路特性を調べることができる。
 今回はskrfを使ったRF回路解析の初回ということでMediaライブラリに標準搭載されている同軸線路クラスを使ってその使い方と解析の流れを一通り解説する。

伝送線路について

高周波回路を設計する上で欠かせないのが伝送線路である。電気回路では電流I、電圧Vが使われる一方で、電波伝搬はマクスウェル方程式により記述されるがその際には電界E、磁界Hが使われる。伝送線路はいわばそれらの中間的な役割を担っている。波長に対して伝送長が長い回路では回路内の位相の変化が無視できなくなる。伝送線路は単位長さあたりの位相変化(伝送線路パラメータの位相定数βにあたる)を扱うことができるため波長が短くなる高周波回路においてはほぼ必須のコンポーネントである。目安としては、回路の長さが伝搬する最大信号波長の20分の1以上の時は伝送線路を使うことが望ましいとされる。

伝送線路の特性を表すパラメータは特性インピーダンスZ_0 [Ohm](伝搬する電界と磁界の比)と伝搬定数\gamma (= \alpha + j\beta) [1/m] (実部は減衰定数、虚部は位相定数)の2つであり、これらは電信方程式内で記述される伝送線路の等価回路における単位長さあたりのR,L,G,Cを用いて以下のように表される。

\begin{eqnarray} Z_0 &=& \sqrt{\frac{R + j\omega L}{G + j\omega C}} \\ \gamma &=& \sqrt{(R + j\omega L)(G + j\omega C)} \end{eqnarray}

このRLGCは、電界と磁界が伝搬方向に直交するTEM波において、RLは導体由来であり、Rは導体損失、Lは導体周りのインダクタンスを意味している。一方で、GCは誘電体由来でありGは誘電体損失(\tan \delta)、Cは誘電体間のキャパシタンスを意味する。同軸線路や平衡平板など簡単な構造においてはその断面構造と静電磁界理論(ガウスの法則やアンペールの法則など)により静電界・静磁界分布を解析的に解くことができる。つまりR,L,G,Cを構造から直接求めることが可能である←→特性インピーダンスZ_0と伝搬定数\gammaが解析的に求まる。例として、同軸線路の解析解を以下に示す。

\begin{eqnarray} R &=& \frac{R_{s}}{2 \pi} (\frac{1}{a} + \frac{1}{b})\\ L &=& \frac{\mu}{2\pi} \log{b/a}\\ G &=& \frac{2 \pi \omega \epsilon”}{\log{b/a}}\\ C &=& \frac{2 \pi \epsilon’}{\log{b/a}} \end{eqnarray}

Z_0, \gamma (RLGC)と伝送線路の物理長が分かれば伝送線路の特性を得ることができ、回路内に組み込むことができる。例えば、伝送線路のABCDパラメータは以下のように定義される。

\begin{eqnarray} \begin{bmatrix} %pmatrix, bmatrix. vmatrix V_{\mathrm{in}} \\ I_{\mathrm{in}} \\ \end{bmatrix} &=& \begin{bmatrix} %pmatrix, bmatrix. vmatrix A & B \\ C & D \\ \end{bmatrix} \begin{bmatrix} %pmatrix, bmatrix. vmatrix V_{\mathrm{out}} \\ I_{\mathrm{out}} \\ \end{bmatrix} \\ \begin{bmatrix} %pmatrix, bmatrix. vmatrix A & B \\ C & D \\ \end{bmatrix} &=& \begin{bmatrix} %pmatrix, bmatrix. vmatrix \cosh{(\gamma l)} & Z_0 \sinh{(\gamma l)} \\ \frac{\sinh{\gamma l}}{Z_0} & \cosh{\gamma l } \end{bmatrix} \end{eqnarray}

代表的な伝送線路の1つであるマイクロストリップ線路についても静電磁界分布が理論的に解析されているので断面構造のパラメータより特性インピーダンスを求めることができる。ライン幅W、誘電体厚h、導体厚tから求めることができる。(式は省略)


しかし、マイクロストリップ線路においては上部と下部で比誘電率\epsilon_rが異なっており、高い周波数ではこの非平衡構造により電界、磁界の伝送方向成分が発生するため、伝搬モードがPure TEMではなくなる。このような伝搬モードはquasi-TEMと呼ばれており、誘電体の比誘電率(Relative permittivity)\epsilon_{\mathrm{r}}ではなく上部の空気を見込んだ見かけ上の比誘電率(Effective relative permittivity) \epsilon_{\mathrm{eff}}が使われる。また、より高い周波数では高次モードとしてTE、TMモードも発生する。(それぞれカットオフ周波数をもつ)

他の伝送線路、例えばコプレーナ線路やグラウンド付きコプレーナ線路、スロット線路等々あるが、断面構造が複雑なものに関してはTEM波の解析であっても、解析解(analytical)には限界があり有限要素法(FEM)などを使って電磁界を数値解析的(numerical)に解くのが常。

skrfのMediaクラスを使って同軸線路構造を定義する

さて、先述した通り、skrfにはMediaライブラリがあり、ここでは同軸線路用のクラスがすでに用意されているのでそれを用いて同軸ケーブルをskrf内で設計してみる。同軸線路のクラスは以下のように定義されている。(APIはこちら

class skrf.media.coaxial.Coaxial(frequency=None, z0=None, Dint=0.00081, Dout=0.005, epsilon_r=1, tan_delta=0, sigma=1e+99, *args, **kwargs)

引数は先頭から、周波数、ポートインピーダンス、内径、外径、誘電体の比誘電率\epsilon_{r}、誘電体の誘電体損\tan \delta、導体の導電率\sigma、となっている。ある同軸ケーブルの実際の規格を参考に定義してみる。(RG-402U semirigid coaxial cable)

import skrf as rf
from skrf.media import Coaxial

frequency = rf.Frequency(0.1,10,110,'ghz') # 0.1 - 10 GHzまでの周波数を定義する。
coaxial = Coaxial(frequency, Dint = 0.91e-3, Dout = 3.1e-3, epsilon_r = 2.1, tan_delta = 0.0004, sigma = 5.8e7)

これでcoaxialという名前の同軸ケーブルのクラスが定義できた。定義したmediaクラスには役に立つインスタンスとメソッドが用意されている。(詳しくはAPIを参照)

せっかくなので定義した同軸ケーブルの特性インピーダンスと伝搬定数を見てみよう。Coaxial.Z0とCoaxial.gammaでndarray型の特性インピーダンスの周波数特性と伝搬定数の周波数特性がそれぞれ得られる。これらのグラフを以下に示す。(TL Parameter = Transmission line parameter)

さて、特性インピーダンスは標準インピーダンスである50オームに非常に近い値が得られた。実際には誘電体自体もその分散性により比誘電率が周波数特性を持つほか、より高い周波数で高次伝搬モードも発生するのであくまで分散無しPure TEMモードにおける値であることは留意されるべきである。

実際の物理長を持つ同軸伝送線路を定義し、Sパラメータを調べる

前項ではmediaクラスを使って同軸線路構造を定義したが、これは断面構造パラメータを入力して特性インピーダンスや伝搬定数といったTLパラメータを得られたにすぎない。実際の物理長を持つ伝送線路を定義するにはlineメソッドを使う必要がある。ここでは、例として先ほど定義した同軸ケーブルクラスにより30cmの物理長を持つ伝送線路を作ってみる。

d = 30e-2 
coaxialLine_30cm = coaxial.line(d, unit='m', z0=50, embed=True)

以上により実際の物理長30 cmの長さを持つ同軸ケーブルを作ることができた。lineメソッドが返すのはmediaクラスではなくNetworkクラスでありTouchstoneと同様、RF回路内の1つの伝送線路コンポーネントとして扱えるようになる。最後の2つの引数z0 = 50, embed = Trueにより、ソースインピーダンスとロードインピーダンスがそれぞれ50オームの2端子回路となっている。Networkクラスには回路のSパラメータをプロットするメソッドがあるため、それを用いて今回作った同軸ケーブルのSパラメータを以下に描画する。

10 GHzでだいたい0.3 dBという結果が得られたがこれはあくまで理論値である。まず、リターンロス(反射係数)は-35 dBと反射がほとんどないためロスの0.3 dBは純抵抗成分によるものである。伝送線路の等価回路ではRとG、伝播定数\gamma (=\alpha +j\beta)ではその実部である減衰定数\alphaが伝送線路の損失を表す。この減衰定数は

\begin{eqnarray} \alpha_{\mathrm{total}} = \alpha_{\mathrm{c}} + \alpha_{\mathrm{d}} + \alpha_{\mathrm{r}} \end{eqnarray}

とそれぞれ導体損(conductor loss)、誘電体損(dielectric loss)、放射損(radiation loss)の成分に分解できる。このうち、放射については静電磁界モデルには含まれていないため今回は考慮されておらず、導体損と誘電体損のみである。同軸ケーブルの場合は、内導体と外導体で理想的な閉回路を構築しているため放射損はないものとみなせる、しかし、マイクロストリップ線路などは側面のフリンジ効果により放射が起こる。(それでも低周波領域ではほとんど無視できる)。また、高次モードが発生するとその分も損失に寄与する。これらは有限要素法などを用いた三次元電磁界解析でより厳密に計算することができる。実測においてはこれに加えて実世界のノイズや測定系のインピーダンスミスマッチ部分や不連続部分における放射がさらに損失に寄与する。(キャリブレーションが大事な理由の1つ)

なので、skrfに限らずシミュレーションを行う際は、どのような仮定で、また、考慮されていないどんなパラメータがあるのかを吟味せずに結果を得られてもそれが本当に何を表しているのかわからないため注意が必要である。

今回はskrfを用いた高周波回路解析のさわり部分ということでmediaクラスを使って同軸ケーブルの伝送線路パラメータやSパラメータを求めた。次回は同様にマイクロストリップ線路をmediaクラスを使って定義し、簡単なBPFフィルタなどをskrfを使って設計してみる。

最後に、今回のPythonのコードを載せて終わる。

import skrf as rf
from skrf.media import Coaxial
import matplotlib.pyplot as plt
frequency = rf.Frequency(0.1,10,110,'ghz') #0.1 - 10 GHz 110pt で解析周波数を定義する
coaxial = Coaxial(frequency, Dint = 0.91e-3, Dout = 3.1e-3, \
                  epsilon_r = 2.1, tan_delta = 0.0004, sigma = 5.8e7)
#先頭から、周波数、ポートインピーダンス、内径、外径、誘電体の比誘電率、誘電体の誘電体損、導体の導電率

d = 30e-2 # 30 cm
coaxialLine_30cm = coaxial.line(d, unit='m', z0=50, embed=True) #30 cm 同軸ケーブルのNetworkクラスを定義する。



"""
グラフの描画
"""
fig = plt.figure(figsize=(8,12))
ax_Z0 = fig.add_subplot(211)
ax_alpha = fig.add_subplot(212)
ax_beta = ax_alpha.twinx()
ax_Z0.plot(coaxial.frequency.f,np.abs(coaxial.Z0),color = 'blue')
ax_alpha.plot(coaxial.frequency.f,coaxial.gamma.real,color = 'red')
ax_beta.plot(coaxial.frequency.f,coaxial.gamma.imag,color = 'blue')

ax_Z0.set_ylim(50.6,50.8)
ax_Z0.set_ylabel('Characteristic Impedance [Ohm]')
ax_alpha.set_ylabel('Attenuation Constant [1/m]',color='red')
ax_beta.set_ylabel('Phase Constant [1/m]',color='blue')
ax_alpha.set_xlabel('Frequency [Hz]')
ax_Z0.set_xlabel('Frequency [Hz]')
ax_Z0.set_title('TL Parameters of the Coaxial Cable',fontsize = 16)


fig_S = plt.figure()
ax_S11 = fig_S.add_subplot(111)
ax_S21 = ax_S11.twinx()
coaxialLine_30cm.s11.plot_s_db(ax = ax_S11,color = 'blue')
coaxialLine_30cm.s21.plot_s_db(ax = ax_S21,color = 'red')
ax_S11.set_ylabel('Return Loss [dB]',color ='blue')
ax_S21.set_ylabel('Loss [dB]',color = 'red')
ax_S11.legend().remove()
ax_S21.legend().remove()
ax_S11.set_title('S-parameter of the defined Coaxial Cable')

終わり


コメント

タイトルとURLをコピーしました