So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

TBS1052B + octave 3.6.4 ( + Vine linux 6.3 ) [Linux]

便利だけど、個人的には使わないんだろうなぁと思っていた octave。
これまた個人的には買わないだろうなぁと思っていたデジタルオシロ Tektronix TBS1052B を買っちゃったので、測定データをパソコンに取り込んで周波数分析するために octaveを使ってみた。
データの読み込み、FFT自体は意外と簡単に出来たのだが、GUI連携とグラフで少してこずったのでメモする。
要点は下記。
(1)octave のスクリプトに値を渡すためには --eval オプションを使う。
   (zenity で取得したファイル名を --eval オプションで octave に渡した)
(2)用が済むまで octave は終了させない。--persist オプションを使う。
   (Octave の plot コマンドで表示させたグラフは octave の終了と同時に消える。)

経緯
USBにあるデータを呼び出す際、ファイル名をコマンドラインでいちいち指定するのがめんどいので zenity を使うことにし、取得したファイル名を octave のスクリプトに渡す方法をググってみたのだが、ずばりの情報がなく、argv変数とか試してみたけどうまくいかなかった。
仕方なくHelp を眺めていてこのオプションがあることに気がついた。
最初から Help を見ればよかったんだよな。でも英語なんだよ。おれ英語わかんねぇし・・・
plot できない(おそらく一瞬で消えちゃう)件はちょっとあせった。
端末から octave を起動してコマンドを対話式で操作するとちゃんとグラフを表示してくれるのに、同じ手順のスクリプトファイルを作って呼び出す形で実行するとグラフを表示してくれない。orz
なんで plot が機能しないんだろうと、plot の不具合についていろいろ調べたけど判らず、あきらめモードでしばらく試行錯誤していてやっと plot が悪いんじゃないって気づきました。
「おそらく plot コマンドを実行したあとすぐにプロセスが終了して、それと同時にグラフの表示が消えてしまう。
 plot は正常に機能していて一瞬表示されているのかもしれないが私の目には見えないのだろうな。きっと」
これに気がつくまではあせりましたよ。情報も少ないし。
ということで、--persist オプションで octave を終了させずにスクリプトを終了させることで手を打ちました。
あまり美しいやり方ではないような気はしますが、後で値の確認とかもできるのでこれはこれでいいかと・・・

表示例

Screenshot-TBS1052B.png

zenity を使った octave 起動スクリプト

 #!/bin/sh
# TBS 1052B のデータを FFT して表示
csvfile=$(zenity --file-selection --title "TBS 1052B FFT Analysis" --text "send CSV file ")
/usr/bin/octave --eval 'filename="'$csvfile'"' --persist  /home/hoge/fuga/octfft.m

TBS1052B のデータをFFTするスクリプト octfft.m

 # TBS1052B の CSV データを FFT してグラフ表示
  TBS1052Bdata=dlmread( filename ,',');
  Timeseri=[TBS1052Bdata(:,4) TBS1052Bdata(:,5)];
  TBS1052Binfo=textread( filename, '%s')

# 情報

    sourcech=strsplit(TBS1052Binfo{[22]},",")
    verut   =strsplit(TBS1052Binfo{[26]},",")
    verscl  =strsplit(TBS1052Binfo{[30]},",")
    veroff  =strsplit(TBS1052Binfo{[34]},",")
    horut   =strsplit(TBS1052Binfo{[38]},",")
    horscl  =strsplit(TBS1052Binfo{[42]},",")
    ptfmt   =strsplit(TBS1052Binfo{[46]},",")
    y0      =strsplit(TBS1052Binfo{[49]},",")
    prbatt  =strsplit(TBS1052Binfo{[53]},",")
    mdlnum  =strsplit(TBS1052Binfo{[57]},",")
    selnum  =strsplit(TBS1052Binfo{[61]},",")
    firmver =strsplit(TBS1052Binfo{[65]},",")

    source_ch       =sourcech{[2]}
    vertical_unit   =verut{[2]}
    vertical_scale  =verscl{[2]}
    vertical_offset =veroff{[2]}
    horizontal_unit =horut{[2]}
    horizontal_scale=horscl{[2]}
    pt_fmt          =ptfmt{[2]}
    yzero           =y0{[2]}
    probe_atten     =prbatt{[2]}
    model_num       =mdlnum{[2]}
    serial_num      =selnum{[2]}
    firmware_ver    =firmver{[2]}


# サンプリング数(Record Length) 2列の1行目
  num_of_smpl=TBS1052Bdata(1,2)
# サンプリング周期(Sample Interval) 2列の2行目
  smpl_period=TBS1052Bdata(2,2)
# サンプリング長
  smpl_len=TBS1052Bdata(1,2)*TBS1052Bdata(2,2)
# FFT
  FFTcomplex=fft( Timeseri(:,2))/num_of_smpl ;
# ゼロシフト(直流分を周波数範囲の中央にもってくる)
  ZsFFTcomplex=fftshift( FFTcomplex ) ;
# 周波数軸設定
  Ax_freq=linspace(-num_of_smpl/2/(smpl_period*num_of_smpl), (num_of_smpl/2-1)/(smpl_period*num_of_smpl), num_of_smpl);
# 周波数軸を含むFFT行列
  AxFFTcomplex=[Ax_freq.' ZsFFTcomplex];
# 等価振幅と位相のFFT行列
  AxFFTamph=[  AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,1) abs( AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,2))*2 angle( AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,2))*360/(2*pi)];
#
subplot(3,1,1)
plot(Timeseri(:,1),Timeseri(:,2))
axis([min(Timeseri(:,1)), max(Timeseri(:,1)), -max(abs(Timeseri(:,2)))*1.1, max(abs(Timeseri(:,2)))*1.1])
title(filename)
ylabel(strcat( 'amp ','[',vertical_unit,']'))
xlabel(strcat( 'time ','[',horizontal_unit,']'))

subplot(3,1,2)
plot(AxFFTamph(:,1),AxFFTamph(:,2));
ylabel( strcat( 'amp ','[',vertical_unit,']'))
xlabel( strcat( 'freq ','[1/',horizontal_unit,']'))
axis([ min(AxFFTamph(:,1)), max(AxFFTamph(:,1))])
subplot(3,1,3)
gtestset=plot(AxFFTamph(:,1),AxFFTamph(:,3));
ylabel('phase [deg]')
xlabel( strcat( 'freq ','[1/',horizontal_unit,']'))
axis([ min(AxFFTamph(:,1)), max(AxFFTamph(:,1))   ,-180,180])
#bottom_title(strcat( 'number of smple :',sprintf("%d",num_of_smpl)),'sampling period:',sprintf("%e ",smpl_period),"sec")

GUIというのであれば、アイコンから起動したいですよね。
gnome だとランチャーにスクリプトのパスを設定すればいいのですが、直接 octfft.sh を指定しても動いてくれません。
どうも一旦端末を起動して、そこから octfft.sh を起動する必要があるようです。
そのためのスクリプトが下記。このスクリプトをランチャーで起動すればOK。

#!/bin/sh
# TBS 1052B のデータを FFT して表示

/usr/bin/gnome-terminal -e "/home/hoge/fuga/octfftz.sh"
まぁ、この程度ならわざわざスクリプト書かなくても、ランチャーのコマンドに直接入れてもいいでしょうけどね。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は180日以上新しい記事の更新がないブログに表示されております。