インピーダンス測定とカーブフィッティング(2)

root5

さて、私のダイポールアンテナのインピーダンスを測定してみましょう。この図では、基準信号が赤色で、アンテナに加わる信号が黄色で表示されています。もしも、ダイポールアンテナのインピーダンスが正確に50オームであれば、2つの信号は同じになるはずです。

% head -15 owondata.txt
Save Time: 2016-09-11 13:27:26
Units:(mV)
                           CH1            CH2
Frequency:           7.026 MHz      7.042 MHz
Period:               0.142 uS       0.142 uS
SP:                   0.001 uS       0.001 uS
PK-PK:                 4.080 V        3.200 V

1              0.000                  1760.00        1560.00
2              0.001                  1760.00        1560.00
3              0.001                  1720.00        1560.00
4              0.002                  1720.00        1560.00

オシロスコープ、OWON PDS 5022S、から得られたテキストファイルは、ROOTのプログラムで処理される前に、AWKの1行プログラムで加工されます。

% cat owondata.txt | awk 'NR>8 {print $1, $3}' >owondata_ch1.txt
% cat owondata.txt | awk 'NR>8 {print $1, $4}' >owondata_ch2.txt
// file name = mytest5.cc
{
  TGraph *g = new TGraph("owondata_ch1.dat");
  g->SetMarkerStyle( 20 );
  g->SetMarkerSize( 0.5 );
  g->Draw("AP");
  TF1 *f1 = new TF1("f1", "[0]*sin([1]*x+[2])+[3]"); 
  f1->SetParameter(0, 2000.0);
  f1->SetParameter(1, 0.022);
  f1->SetParameter(2, 0.0);
  f1->SetParameter(3, 0.0);
  f1->SetLineColor(kRed);
  g->Fit(f1);

  TGraph *h = new TGraph("owondata_ch2.dat");
  h->SetMarkerStyle( 24 );
  h->SetMarkerSize( 0.5 );
  h->Draw("P");
  TF1 *f2 = new TF1("f2", "[0]*sin([1]*x+[2])+[3]");
  f2->SetParameter(0, 2000.0);
  f2->SetParameter(1, 0.022);
  f2->SetParameter(2, 0.0);
  f2->SetParameter(3, 0.0);
  f2->SetLineColor(kYellow);
  h->Fit(f2);
}

root4

% root mytest5.cc

****************************************
Minimizer is Minuit / Migrad
Chi2                      =       536853
NDf                       =          996
Edm                       =  7.63442e-09
NCalls                    =          148
p0                        =      2001.67   +/-   1.04511     
p1                        =    0.0220756   +/-   1.82267e-06 
p2                        =      2.03624   +/-   0.00102561  
p3                        =     -12.2567   +/-   0.749788    

****************************************
Minimizer is Minuit / Migrad
Chi2                      =       459226
NDf                       =          996
Edm                       =  8.91283e-08
NCalls                    =          128
p0                        =      1558.13   +/-   0.960465    
p1                        =    0.0220847   +/-   2.15852e-06 
p2                        =      1.50439   +/-   0.00124773  
p3                        =     -14.2113   +/-   0.68435     

パラメータp0とp2が、振幅と位相です。従って、振幅の比は1558.13/2001.67=0.778415、位相差は1.50439-2.03624=-0.531850[rad]=-30.4728[deg]です。

インピーダンス測定とカーブフィッティング

root3

あなたは被試験装置(DUT)、例えばあなたのアンテナ、のインピーダンスをそのデバイスに加えた正弦波の振幅と位相を観測することにより測定することができます。もちろん、測定は何らかの基準に対して行われるので、実際的にはあなたは2つの信号を同時に観測することになります。

owon7MHz20mOpen

例えばこの図では、あなたは赤色の信号を基準にして黄色の信号の振幅と位相を測定しようと思います。

詳細な議論については、私の頁Antennaを参照して下さい。

実際の測定は色々な方法で行うことができます。例えば、位相差を測定するために2つのゼロクロスポイント間でカーソルを手で動かすとか。ここでは、ROOTが備えるカーブフィッティング機能を用いた時にどうなるかを試してみようとしています。

短いC言語のプログラムを用いてテスト用のデータ・セットが生成されます。図では、黒色の丸と白色の丸とで表わされていて、赤色と黄色の曲線が得られた結果です。

% root -x mytest4.cc

****************************************
Minimizer is Minuit / Migrad
Chi2                      =  2.09673e-08
NDf                       =           47
Edm                       =   4.1926e-08
NCalls                    =          121
p0                        =      1.00001   +/-   4.08054e-06 
p1                        =     0.100001   +/-   3.45297e-07 
p2                        =      6.48313   +/-   8.9754e-06  

****************************************
Minimizer is Minuit / Migrad
Chi2                      =   9.1854e-10
NDf                       =           47
Edm                       =  1.83714e-09
NCalls                    =           70
p0                        =     0.500002   +/-   8.8495e-07  
p1                        =          0.1   +/-   1.29983e-07 
p2                        =      3.13999   +/-   3.40443e-06 
root [1] 

The parameters p0, p1, and p2 are the amplitude, the frequency, and the phase.

// file name = mytest4.cc
{
  TGraph *g = new TGraph("myfile4a.dat");
  g->SetMarkerStyle( 20 );
  g->SetMarkerSize( 1.0 );
  g->Draw("AP");
  TF1 *f1 = new TF1("f1", "[0]*sin([1]*x+[2])");
  f1->SetParameter(0, 0.25);
  f1->SetParameter(1, 0.11);
  f1->SetParameter(2, 3.14+0.2);
  g->Fit(f1);
  
  TGraph *h = new TGraph("myfile4b.dat");
  h->SetMarkerStyle( 24 );
  h->SetMarkerSize( 1.0 );
  h->Draw("P"); 
  TF1 *f2 = new TF1("f2", "[0]*sin([1]*x+[2])");
  f2->SetParameter(0, 0.25);
  f2->SetParameter(1, 0.11);
  f2->SetParameter(2, 3.14+0.2);
  h->Fit(f2);
}

バグキー(6)

root

ドット周期は時間の経過で変化するかと思ったのですが、何かを言うためにはもっと観察が必要です。

// file name = mytest.cc
{
  TCanvas *c = new TCanvas( "test" );
  TH1 *frame = c->DrawFrame( 0.0, 0.0, 11.0, 1200.0 );
  frame->GetXaxis()->SetTitle("time");
  frame->GetYaxis()->SetTitle("Duration");
  double x[11] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
  double y[11] = { 1034, 883, 1028, 889, 1003, 923, 1053, 871, 1024, 901, 1048};
  TGraph *g = new TGraph( 11, x, y );
  g->SetMarkerStyle( 20 );
  g->SetMarkerColor(  4 );
  g->SetMarkerSize (  2 );
  g->Draw( "P" );
  TF1 *f1 = new TF1( "f1", "[0]*x+[1]" );
  gStyle -> SetOptFit(1111);
  g->Fit (f1);
}
% root -x mytest.cc
   -------------------------------------------------------------------------
  | Welcome to ROOT 6.06/08                             http://root.cern.ch |
  |                                            (c) 1995-2016, The ROOT Team |
  | Built for macosx64                                                      |
  | From heads/v6-06-00-patches@v6-06-06-30-g3bae07b, Sep 01 2016, 14:28:05 |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q'              |
   -------------------------------------------------------------------------

root [0] 
Processing mytest.cc...

****************************************
Minimizer is Minuit / Migrad
Chi2                      =      55135.1
NDf                       =            9
Edm                       =  2.85319e-19
NCalls                    =           32
p0                        =      1.30909   +/-   7.46271     
p1                        =      962.273   +/-   44.15       
root [1] 

Bug Keys (5)

bugkey10

今、6個の短点を送出しています。赤色のトレースは、短点の接点から得られた信号で、黄色のトレースは、FPGA内の簡単なデバウンス回路からのものです。

同じデバイスの中に、マークとスペースの長さを測定する回路を含ませることは容易です。

bugkey9

上の図に含まれる数値を読み取れば、あなたはRの短いスクリプトを書くことができます。

% R
> dat_v=c(1034, 883, 1028, 889, 1003, 923, 1053, 871, 1024, 901, 1048)
> barplot(dat_v, col=c("blue", "green"))

bugkey11

青色の棒はマーク(low)の長さに、緑色の棒はスペース(high)の長さに対応します。あなたは、マークとスペースとの比が1.0ではなく、さらなる調整が必要であることに、直ちに気が付きます。

バグキー (4) 汚れた信号

dirty1

dirty2

もし、あなたのバグキーが機械的に適切に維持されていないと、あなたは上の図に示すような汚れた信号を容易に得てしまいます。

あなたは波形を観測しなくても、何かが変だと気がつきます。なぜならば、このような場合には、例えばサイドトーンが非常に不快に聴こえるからです。

dirty3

短点の接点を少しクリーニングすると、多少良くなった信号を得られますが、マークとスペースの比率が正しくありません。何故ならば、途中でギャップを決めるスクリューを触ってしまったからです。

dirty4

ようやく、波形がそれらしくなりました。しかし、私はこのようなことを再現性良く行う方法を未だ知りません。

http://www.vibroplex.com/techdocs/original_bug_adjustments.pdf

バグキー (3)

bugkey6

現在のバウンスを除去する論理は完全からはほど遠いのですが、次のステップに進みましょう。

SignalTap IIを用いてキャプチャされた信号は、例えば、CSVファイルにエクスポートすることができます。従って、あなたはデータを種々の方法で加工することができます。

bugkey7

この波形は連続するドットの最初の8個(最後は不完全ですが)を示しています。

bugkey8

マークとスペースの長さがバーグラフとして表されています。1,000という値は、50mSに対応することに注意して下さい。

バグキー (2)

bugkey3

もし、あなたのバグキーをFPGAの入力ポートに繋ぐと、上の図に示したような信号を観測することができます。(図をクリックすると拡大されます。)

あなたは緑色の円で示したように、立ち上がり縁では必ずしもコンタクト・バウンスが無いことに気が付くでしょう。しかし、それを常に期待することは出来ません。また黄色の円で示したように、時々は比較的長時間のバウンスが起こることにも注意して下さい。

bugkey4

このようなバウンスを遅延をもたらすこと無く排除するために、簡単なロジックが用いられています。OUT_KEYという信号を見て下さい。

バグキー

blueracer2

当然のことながら、私たちは皆バグキーが好きです。しかしながら、この道具はその機械的な性質からくる困難さも備えています。

bugkey1

コンタクトのところで観測した、短点を3つ送出しているときの波形です。

bugkey2

最初の短点を、時間軸で5倍拡大したものです。

たくさんの回路が関与するので、あなたがサイドトーンとして聴くもの、あるいは、相手が受信機を通して聴くものは、このような波形のみからは正確に推定することは出来ません。しかし、疑いもなく重要なファクターの1つではあります。