伝送特性測定シミュレーションの基礎 (6) - プログラム例 (5)

1. ネットワークアナライザ

ケーブルのような対称(始端と終端を逆にしても特性が変わらない)回路では S11 = S22, S21 = S12 ですから、 S11 と S21 を計算すればよいのですが、

  S11 = (Zin1 - Zs) / (Zin + Zs)
  S21 = 2 * V2 / E1
ですから、既に説明した伝送線路の入力インピーダンスと 伝送特性の計算で間に合います。

ネットワークアナライザを使うときの 最も重要な注意点は反射波と透過波の解釈TDRや分布定数理論のそれとはまったく違うことです。

TDR分布定数理論に於ける反射波は 伝搬する電磁波の反射そのものですが、 ネットワークアナライザS11は 電源から試料に入射した反射波だけでなく、 それが試料終端に進んで、そこで反射した電磁波や、 それがまた試料始端で反射して試料終端で反射し、再度試料始端に戻るという、 無限の入射波と反射波の合計です。 回路的にはネットワークアナライザは 無限の時間が経過したあとの交流理論の世界、 TDRは有限時間の過渡現象理論の世界になります。

同様にS21も無限の時間が経過した後の、 透過波と反射波の合計ですから、 ネットワークアナライザのS パラメータでは 透過波と反射波が分離できません。 この点の誤解はインタネットや宣伝試料、実務書に至るまで、 実に広く存在していますので、 手痛い失敗をしないように注意してください。

こういった誤解を解くためにも、 シミュレーションは有効な手段となります。

2. プログラム例

以下、システムインピーダンス 50 Ωのネットワークアナライザに 3C-2V程度の同軸ケーブルを接続したときの シミュレーションプログラム例です。

ネットワークアナライザの場合も測定機の校正面と試料端接続部分の

などに起因する誤差が大きな影響を与えますが、 これらの誤差要因をプログラムに組み込む方法は これまでの説明と同じです。 手っ取り早く実験したいかたには ネットワークアナライザ シミュレーションを用意してあります。

また、実務では S11S21からケーブルの二次定数を求めるプログラムを書いたり することも多いです。

/usr/bin/awk '
BEGIN {
  _Z0 = 75.0		# 特性インピーダンス (Ω)
  _a = 1.373e-6		# 減衰定数 = _a * sqrt(f) + _b * f
  _b = 8.385e-12
  _v = 1/sqrt(2.3)	# 速度係数 (ポリエチレン絶縁)
  _R = 0.0914		# 直流抵抗 (Ω/m)
  _C = 69e-12		# キャパシタンス (F/m)
  l = 5			# 試料長 (m)
  PI = atan2(0, -1)
  Vr = _v
  rs = 50		# ネットワークアナライザのシステムインピーダンス (Ω)
  z0 = _Z0		# 試料の特性インピーダンス (Ω)
  for (i = 1; i <= 100; i += 0.5) {
	f = i * 1e6	# 周波数 (Hz)
	F[i] = f
	w = 2 * PI * f
	a = _a * sqrt(f) + _b * f
	b = w / (2.99792458e8 * Vr) + a
	S11(rs, z0, a, b, l)
	AbsS11[i] = Abs(x, y)
	ArgS11[i] = Arg(x, y)
	S12(rs, z0, a, b, l)
	AbsS21[i] = Abs(x, y)
	ArgS21[i] = Arg(x, y)
  }
  N = i
  exit 0
}
END {
  data = ".1 .45 .6 .90:.6 .95 .6 .90:.1 .45 .1 .40:.6 .95 .1 .40"
  split(data, v, ":")
  data = "abs(S11):arg(S11):Abs(S21):Arg(S21)"
  split(data, yl, ":")
  for (i = 1; i <= 4; i++) {
	print "v", v[i]
	print "x freq. MHz"
	print "y", yl[i]
	for (j = 1; j < N; j++) {
		if (i == 1)
			print F[j], AbsS11[j]
		else if (i == 2)
			print F[j], ArgS11[j]
		else if (i == 3)
			print F[j], AbsS21[j]
		else if (i == 4)
			print F[j], ArgS21[j]
	}
  }
  exit 0
}
# S11 = (Zt - Zs) / (Zt + Zs)
# Zs = z0 = 50 + j*0
function S11(rs, z0, x1, y1, l,  x2, y2) {
  Zin(z0, x1, y1, l, rs, 0)
  x2 = x; y2 = y
  Div(x2 - rs, y2, x2 + rs, y2)
}
# S21 = 2 * V2 / E1
function S12(rs, z0, x1, y1, l,  x2, y2, x3, y3) {
  V2(rs, 0, rs, 0, z0, x1, y1, l)
  x *= 2; y *= 2
}
function coef(z0, xs, ys, xt, yt,  z2) {
  z2 = z0 * z0
  Mul(xs, ys, xt, yt)
  x /= z2; y /= z2
  x += 1
  Div(z0 * x, z0 * y, xs + xt, ys + yt)
}
# V1 = ケーブル送端電圧
# γ = x1 * j*y1
function V1(rs, z0, x1, y1, l,  x2, y2) {
  Zin(z0, x1, y1, l, rs, 0)
  x2 = x; y2 = y
  Div(x2, y2, x2 + rs, y2)
}
# V2 = ケーブル受端電圧
# V2 = 1/2 * 1/(cosh(γ*l) + z0/(Zs+Zt)*(1+(Zs*Zt/z0^2))*sinh(γ*l))
# Zs = xs + j*ys, Zt = xt + j*yt
function V2(xs, ys, xt, yt, z0, x1, y1, l,  a, x2, y2, x3, y3) {
  Cosh(x1 * l, y1 * l)
  x2 = x; y2 = y
  Sinh(x1 * l, y1 * l)
  x3 = x; y3 = y
  coef(z0, xs, ys, xt, yt)
  Mul(x, y, x3, y3)
  Add(x, y, x2, y2)
  Div(1, 0, x, y)
  Mul(x, y, xt, yt)
  Div(x, y, xs + xt, ys + yt)
}
# Zin = (Zt/Z0 + tanh(γ*l) / (1 + (Zt/Z0)*tanh(γ*l)) * Z0
# γ = x1 * j*y1, Zt = x2 + j*y2
function Zin(z0, x1, y1, l, x2, y2,  x3, y3, x4, y4) {
  Tanh(x1 * l, y1 * l)
  x3 = x
  y3 = y
  Mul(x, y, x2 / z0, y2 / z0)
  x4 = x + 1
  y4 = y
  Add(x3, y3, x2 / z0, y2 / z0)
  Div(x, y, x4, y4)
  x *= z0
  y *= z0
}
# Zsc = Z0 * tanh((α + j * β) * l)
function Zsc(z0, x1, y1, l) {
  Tanh(x1 * l, y1 * l)
  x *= z0
  y *= z0
}
# Zoc = Z0 * coth((α + j * β) * l)
function Zoc(z0, x1, y1, l, w) {
  Tanh(x1 * l, y1 * l)
  Div(1, 0, x, y)
  x *= z0
  y *= z0
  error(z0, x1, y1, l, w)
#print " ", y
}
# complex functions
function Add(x1, y1, x2, y2) {
  x = x1 + x2
  y = y1 + y2
}
function Sub(x1, y1, x2, y2) {
  x = x1 - x2
  y = y1 - y2
}
function Mul(x1, y1, x2, y2) {
  x = x1 * x2 - y1 * y2
  y = x1 * y2 + y1 * x2
}
function Div(x1, y1, x2, y2,  r2) {
  r2 = x2 * x2 + y2 * y2
  x = (x1 * x2 + y1 * y2) / r2
  y = (y1 * x2 - x1 * y2) / r2
}
function Exp(x1, y1,  a) {
  a = exp(x1)
  x = a * cos(y1)
  y = a * sin(y1)
}
function Log(x1, y1) {
  x = 0.5 * log(x1 * x1 + y1 * y1)
  y = atan2(y1, x1)
}
function Sqrt(x1, y1,  r, w) {
  x = 0.5 * log(x1 * x1 + y1 * y1) * 0.5
  y = atan2(y1, x1) * 0.5
  a = exp(x)
  x = a * cos(y)
  y = a * sin(y)
}
function Pow(x1, y1, x2, y2,  x3, y3) {
  Log(x1, y1)
  x3 = x
  y3 = y
  Mul(x3, y3, x2, y2)
  Exp(x, y)
}
function Sin(x1, y1,  e, f) {
  e = exp(y1)
  f = 1 / e
  x = 0.5 * cos(x1) * (e - f)
  y = 0.5 * sin(x1) * (e + f)
}
function Cos(x1, y1,  e, f) {
  e = exp(y1)
  f = 1 / e
  x = 0.5 * cos(x1) * (f + e)
  y = 0.5 * sin(x1) * (f - e)
}
function Tan(x1, y1,  e, f, d) {
  e = exp(2 * y1)
  f = 1 / e
  d = cos(2 * x1) + 0.5 * (e + f)
  x = sin(2 * x1) / d
  y = 0.5 * (e - f) / d
}
function Sinh(x1, y1,  e, f) {
  e = exp(x1)
  f = 1 / e
  x = 0.5 * (e - f) * cos(y1)
  y = 0.5 * (e + f) * sin(y1)
}
function Cosh(x1, y1,  e, f) {
  e = exp(x1)
  f = 1 / e
  x = 0.5 * (e + f) * cos(y1)
  y = 0.5 * (e - f) * sin(y1)
}
function Tanh(x1, y1,  e, f, d) {
  e = exp(2 * x1)
  f = 1 / e
  d = 0.5 * (e + f) + cos(2 * y1)
  if (d == 0) {
	e = exp(x1)
	f = 1 / e
	x = 0
	y = (e + f) * sin(y1)
  }
  else {
	x = 0.5 * (e - f) / d
	y = sin(2 * y1) / d
  }
}
function Atanh(x1, y1) {
  Div(1 + x1, y1, 1 - x1, -y1)
  Log(x, y)
  x *= 0.5
  y *= 0.5
}
function Abs(x, y) {
  return sqrt(x * x + y * y)
}
function Arg(x, y) {
  return atan2(y, x)
}
'

3. 注

3.1. 注1-

平林浩一, 2016-05