c99 サンプル プログラム

c99 以降では複素数が使えるようになって、 FreeBSD-10 の clang, gcc のいずれも使えますので、 c の複素数を使ったサンプルプログラムを用意してみました。 複素数が使えない c90 以前の c に比べて、読み書きの労力が格段に減ります。

Zin(), Trans() ではケーブルの特性インピーダンスを純抵抗と仮定していますので、 高周波でないと使えません。 低い周波数領域で使う場合は、複素数に書き換えてください。

FFT の使いかたは フーリエ変換と線形システムの基礎などを見てください。

-- ケーブルの入力インピーダンス --

負荷インピーダンス Zt で終端したケーブルの入力インピーダンスを求める

COMPLEX Zin(COMPLEX Zt, double Z0, double Vr, double alpha, double len, doublef)
  Zin = ケーブルの入力インピーダンス (&Ohm;)
  Zt = ケーブルの終端インピーダンス (&Ohm;)
  Z0 = ケーブルの特性インピーダンス (&Ohm;)
  alpha = ケーブルの減衰定数 (neper/m)
  beta = ケーブルの位相定数 (rad/m)
  len = ケーブルの長さ (m)
  f = 周波数 (Hz)

-- ケーブルのシステム関数 --

信号源インピーダンス Zs、負荷インピーダンス Zr に接続したケーブルの出力電圧/入力電圧を求める

COMPLEX Trans(COMPLEX Zs, COMPLEX Zr, double Z0, double Vr, double alpha, double len, double f)
  Trans = ケーブルのシステム関数 (出力電圧/入力電圧)
  Zr = ケーブルの終端インピーダンス (&Ohm;)
  Z0 = ケーブルの特性インピーダンス (&Ohm;)
  alpha = ケーブルの減衰定数 (neper/m)
  beta = ケーブルの位相定数 (rad/m)
  len = ケーブルの長さ (m)
  f = 周波数 (Hz)

-- ケーブルの S パラメータを求める --

ケーブルの2次特性から S11 を求める

COMPLEX S11(double Zs, double Z0, double Vr, double alpha, double len, double f)
  S11 = S-parameter
  Zs = VNA のシステムインピーダンス (&Ohm;) .. 通常 50.0
  Z0 = ケーブルの特性インピーダンス (&Ohm;)
  Vr = ケーブルの速度係数 (0 < Vr <= 1.0)
  alpha = ケーブルの減衰定数 (neper/m)
  beta = ケーブルの位相定数 (rad/m)
  len = ケーブルの長さ (m)
  f = 周波数 (Hz)

ケーブルの2次特性から S21 を求める

COMPLEX S21(double Zs, double Z0, double Vr, double alpha, double len, double f)
  S21 = S-parameter
  Zs = VNA のシステムインピーダンス (&Ohm;) .. 通常 50.0
  Z0 = ケーブルの特性インピーダンス (&Ohm;)
  Vr = ケーブルの速度係数 (0 < Vr <= 1.0)
  alpha = ケーブルの減衰定数 (neper/m)
  beta = ケーブルの位相定数 (rad/m)
  len = ケーブルの長さ (m)
  f = 周波数 (Hz)

-- VNA で得られた S パラメータからケーブルの2次特性を求める

  ケーブルの特性インピーダンスを求める

COMPLEX S2Z(COMPLEX S11, COMPLEX S21, double Zs)
  S2Z = ケーブルの特性インピーダンス
  S11 = S-parameter
  S21 = S-parameter
  Zs = VNA のシステムインピーダンス (&Ohm;) .. 通常 50.0

  ケーブルの伝搬定数を求める

COMPLEX S2G(COMPLEX S11, COMPLEX S21, double Zs)
  S2G = ケーブルの伝搬定数
  S11 = S-parameter
  S21 = S-parameter
  Zs = VNA のシステムインピーダンス (&Ohm;) .. 通常 50.0

-- FFT ---

void FFT(COMPLEX *z, int n, int inv)
  z[] = 時系列あるいは周波数データの配列です。
	時系列データの虚部は 0、周波数データは複素数です。
  n = データ数 (2^N, N= 0, 1, 2, 3, ...)
  inv = 0: フーリエ変換, 1: 逆フーリエ変換

c サンプル プログラム

平林浩一 2018-12