いまひとつ、うまくやりたいことに到達しないんですがそれは自己の「ボキャブラリのなさ」ということなんでしょう、きっと
ピークを見つけるのに、scipyを利用する方法があるようです。前も調べたことがあるのだが、わかりにくいなぁ。低いピーク(谷)を見つけるのにargrelmin 、山を見つけるのに argrelmax 。引数のorderは、検出する範囲を指定するみたい。しかし、sパラのデータはログで掃引しているので下の方と上の方とでピークの位置をきちっと判定できない。ログでも判定できたらいいのにね、でもどういうアルゴリズムになるのか想像できないですけどね。
from matplotlib import pyplot as plt import matplotlib import skrf as rf from skrf import NetworkSet import numpy as np from scipy import signal tsDir = 'data/'; ntwk1 = rf.Network(tsDir+u'cable.s1p'); rf.stylely(style_file='skrf2.mplstyle'); fig=plt.figure(); ax=plt.subplot(1,1,1); ntwk1.plot_s_db(label="Cable"); s_leng=np.size(ntwk1.f); s_data=np.zeros((s_leng,2)); s_data[:,0]=ntwk1.f[:]; s_data[:,1]=ntwk1.s_db[:,0,0]; pk = signal.argrelmin(s_data[:,1],order=10); plt.plot(s_data[pk,0],s_data[pk,1],"ro");
表示結果はこれ(argrelmin)。うまくできている方じゃないですか。argrelminの戻り値はピークインデックスのtupleになっています。配列とタプルの違いが今ひとつ分かっていないので恐縮なのですが、s_data[pk,0]とすると、インデックスで拾い集められたピークの集合体として扱われるようです。
ピークに印つけたらその値(この場合は、周波数)を表示したくなりますよね、、、Excelでいうデータラベル。これがなかなか見つけられなかった、というかわからなかった。plot.textでテキスト表示する方法を使った。
pks=np.array(pk[0]); for i in range(np.size(pk)): plt.text( s_data[pks[i],0],s_data[pks[i],1],format(s_data[pks[i],0],'.3e') ); # plt.text( s_data[pk[i],0],s_data[pk[i],1],format(s_data[pk[i],0],'.3e') );
コメントアウトしている方では
TypeError: unsupported format string passed to numpy.ndarray.__format__
のエラーが出てしまう。何が違うのだろう。
重なっちゃって見えないー。うーむ。周波数軸を狭めてみよう
これはUSBケーブルをVNAで測定したS11なのですが、ある一定の周波数間隔でピークが連なるように観測され、必ずしも一定ではないが、だいたい56MHzぐらいの周期。。これってケーブル長さと関係しているのでしょうか。別の話として、TomoさんのTwitterにこんなことが書いてあった。
校正したVNAに50cmの同軸ケーブルをつなぎました s11には190MHz間隔でびよんびよんが出てきました ここでびよんびよんはλ/2ごとに出てくるので、ケーブル中の電磁波速度を2x10^8m/sとすると、0.5mと計算できました
つまりこれは、λ/2で定在波が立つということも言えるわけなんでしょうか。電磁波速度は比誘電率の平方根に反比例するのでしたっけ。
速度 v=C/√(εr)
すると、同軸ケーブルの比誘電率は1.22あたりということなんでしょうか・・・
別で測定したUSBケーブルの誘電率はおおよそ2ぐらいだったので、電磁波速度は2.12e8m/sで、これから、56MHzを考慮すると
2.12e8/56MHz=3.79m だから、λ/2=1.89m
おー〜!。あってる!だいたい1.8mのUSBケーブルだったから
コメントを追加