読者です 読者をやめる 読者になる 読者になる

JP7FKFの備忘録

アマチュア無線(JP7FKF)をやっている.電子工作,機械工作,ものづくりが好き.

R言語を使ってSmith Chartにプロットする

ソフトウェア アマチュア無線

Smith Chartは美しい

高周波を扱っている人は一度は耳にしたことがあるだろう. このスミスチャートは,インピーダンスなどを特殊な関数によって描かれた平面上にプロットするものだ. スミスチャートを用いると,インピーダンスマッチングが容易になったり,一目でVSWRがどれくらいか分かったり,反射係数が分かったり,位相が何度ずれるか分かったり,Q値が分かったり…などなど,と,非常に便利なのだ. しかしながらこのスミスチャートの特殊性ゆえ,このグラフを美しく描画してくれるようなグラフソフトに出会うことが少ない.
そこで今回はおなじみのR言語を用いてこのスミスチャートを描いてみることにした.

さあ描こう.

色々と調べてみたら,Smith Chartの雛形を作製してくれている人を見つけた.
Plot Smith Chart in R - Stack Overflow
StackOverFlowは便利だ.このコードをありがたく頂戴してeditしてみる.

いろいろ試行錯誤した結果こんなものが生まれた.

#!/usr/bin/rscript --vanilla

#PDFに吐く場合
#filename='smith_chart.pdf'
#pdf(filename, 6, 6)

#入力するSパラメータファイルまでのパス
sp_filename = 'antenna.s2p'

# applies conformal map (z-1)/(z+1) to complex number z
cmap <- function(z) (z-1)/(z+1)

dd <- c(seq(-100, 100, 1), seq(-10, 10, 0.1), seq(-2, 2, 0.02))
dd <- round(dd, digits = 2) # fix roundoff errors
dd <- sort(unique(dd)) # remove duplicates

#こいつがSmithChartを描いてくれます.
smith_grid <- function (val, step) {
  # applies conformal map to lines having fixed real component
  r_grid <- outer(1i * dd[dd >= -val & dd <= val], seq(0, val, step), '+')
  r_grid <- cmap(r_grid)
  matlines(Re(r_grid), Im(r_grid), lwd = 0.5, col = 1, lty = 1)
  
  # applies conformal map to lines having fixed imaginary component
  x_grid <- outer(dd[dd >= 0 & dd <= val], 1i * seq(-val, val, step), '+')
  x_grid <- cmap(x_grid)
  matlines(Re(x_grid), Im(x_grid), lwd = 0.5, col = 1, lty = 1)
}

#観測データを読み込む,先頭が!の行はとばす
measure <- read.table(sp_filename,comment.char="!")
#必要な行だけ抜きだす.抜き出した後のデータはMagと角度(Deg)
measure <- measure[,c(2,3)]
#MagとDegから複素形式に変換.角度がradの場合は無論 /180*pi をしなくてよい.
cmp <- complex(mod=measure[,c(1)], arg=measure[,c(2)]/180*pi)

plot.new()
plot.window(c(-1, 1), c(-1, 1), asp = 1)

segments(-1, 0, 1, 0)
par(new=T)
theta <- seq(-pi, pi, length=100)
plot(cos(theta), sin(theta), type="l", asp=T, axes=FALSE, ann=FALSE)
smith_grid(50, 10)
smith_grid(10, 1)
smith_grid(3, 0.2)
smith_grid(0.6, 0.1)

#お好きな方を
matpoints(Re(cmp), Im(cmp), lwd = 1, col = 2, lty = 1,type = "o",pch=1, cex=0.2)
#matlines(Re(cmp), Im(cmp), lwd = 3, col = 2, lty = 1)

title(main="Smith Chart")

#dev.off()

実際にこれを使って適当なs2pファイルをプロットしてみた.
f:id:jp7fkf:20170208014016p:plain:w500
なかなかいい感じにプロットできていると思う. R言語はこういうプロットとかが自分の好きなようにできて便利だ. 他のグラフソフトにはいろいろ制約が出てきたりしてしまったりするけどRは自分がコードを書きさえすればだいたい自由にできる.ただ書くのがめんどくさいけど.
統計解析とかの機能がついていてくれるから,それも利用してさらにプロットしたいなんという時には非常に便利なんじゃないかと思う.ソフトェアが1つで済むし.

ということで,きちんとR言語を用いてSmith Chartをプロットすることができました.
ちょっと今回のSmithChartには不満があって,右端側のところの等リアクタンス線とか描画されていない部分が気になったりしている. 機会があれば直していきたいと思っている.

References

Keywords

  • Smith Chart
  • R Language
  • Plot
  • Graph
  • Draw