RubyとJavascriptでグラフを描く【その2】[追記]
【計画最終目標】
□シリアルデータのリアルタイム描画
【計画の中期目標】
□csvデータのJavascriptによるグラフ描画
【直近の課題】
データ処理:Ruby
□シリアル通信機器からのデータ受信・csvへ保存
描画処理:Javascript
■csvデータの読み込み
□異なるデータサイズへの対応
□描画方法の変更
※□は未完、■は完了項目
続きを読むシリアル通信の基本
といっても簡単なもので、【記事1】をやります。
【記事1】
出来ました(笑)
試しにteratermでも見てみると
こんな感じです。
これを使ってRubyとJavascriptでグラフを描く【その1】 - Kuroyagi飼育日誌
にてシリアルデータ送信機器として使いたいと思います。
Gitのお勉強【その1】
RubyとJavascriptでグラフを描く【その1】
会社でシリアル通信で受けたデータをリアルタイムで表示するプログラムをよく作ります。普段はVisual CやMatlabで作るのですが、先輩がRubyとJavascriptで作っているのを見て便利そうだったのでお勉強します。
先ずはrubyでのデータ処理やらリアルタイムと欲張らずにjavascriptでcsvファイルからデータを読み込んでグラフにするといった簡単な処理をやってみます。
そこで参考にしたのが以下の【記事1】です。
【記事1】
これは単純明快で直ぐに動きます!とても分かりやすく、複雑なことも書いてないので初心者には大変ありがたい解説です。
2分くらいで準備完了です!描けました!
ただし、詳しい知識は皆無です…ajax、javascriptのデータ処理などここから学んでいきたいと思います。
基本的にjsの描画処理、Rubyでデータの送受信、測定系の模擬簡易モデルについて抑えればいいと思いますので、以降は以下を課題としたいと思います。
・列数、行数を自在に操作
・プロット形式を棒グラフから他のにする
【Ruby】
・外部装置からのシリアルデータ読み込み
【周辺】
・シリアルデータを送信する機器を作る(ArduinoかRaspberry Piがお手軽だと思う)
また、そろそろGitをちゃんと使えるようにした方がよさそうなため、追加課題としてGitの実践練習も行います。
週末やること
やることリスト
■投資
経済指標まとめ
トランプ大統領の演説動画確認
3dプリンタ業界確認
再生医療市場調査
ビットコインの技術動向調査
前期投資計画確認
■技術
AD変換回路を使ったRaspberry Piのセンサ信号読み込み
LTsipiceを使えるようにする(LDのAPC回路シミュレート)
小規模発注システムの市場調査(Webアプリ開発向け)
Interfaceを読みつつ画像認識による物仕分けモデル計画確認
JavaScriptによるリアルタイムデータ表示スクリプト作成
MatlabでTektronicsのオシロスコープからUSBで信号取り込む方法確認
サーボ制御の基本を勉強
PDとアンプを組み合わせた光検出回路の基礎を勉強
スペクトラムアナライザの基本を勉強
USB機器の通信基礎の勉強
arduinoとPCのシリアル通信
温度計設計検討
フィードバック制御の復習と実験系の検討
■その他の学び
レアジョブ
ロシア語
バイオリン
キーボード
硬筆
デッサン
■日常
部屋の掃除
観葉植物探し
会社用ニットの長袖かベスト探し
カジュアル用白シャツ探し
ダニエルボブの鞄でいいものがないか探す
香水探し
音読
macのノート購入検討
Matlabによる信号処理【フィルタの作り方】
DSP(Digital Signal Processing)でフィルタを使う訳ですが、今の知識だとFIRとIIRどちらを選べばいいのかわからないのでお勉強します。
【記事1】のNI様のところに分かりやすく書いてあります。
【記事1】
IIRフィルタとFIRフィルタ - DIAdem 2012ヘルプ - National Instruments
とりあえず、今後の基準は以下の通りと考えておきます。
■IIR
メリット: 係数が少ない/計算ボリュームが小さい
デメリット: 非線形位相応答
得意とする情報: 振幅
■FIR
メリット: 非線形位相応答
デメリット: 係数が多い
得意とする情報: 位相
こんなところです。
Matlabのドキュメンテーションに【記事2】があるので、基本的には記事にそって進めていきます。
【記事2】
jp.mathworks.com
まずは信号を設定します。信号はMatlabのサンプルデータとして用意されているchirpを使います。信号は以下の通りです。
さて、フィルタを作ります。
blo = fir1(34,0.48,chebwin(35,30));
がフィルタの係数を生成する関数です。fir1はウィンドウを指定してフィルタの係数を生成する関数で、引数の最後にはウィンドウを定義するchebwinがいます。この辺はひとまずwindow関数が選べますよという程度にとどめておきます。
続いてフィルタを適用するためにfilter関数に処理したいデータとフィルタの係数セットを渡します。
すると時間波形は以下の通りとなります。
大きな信号が消えました。ぱっと見で変化は分かりますが、より分かりやすくするために周波数スペクトルを見てみましょう。
上段がフィルタ無しの生データ、下段がフィルタを適用した後の信号です。2000Hz以上の主ピークたちがごっそりいなくなっています。
これでフィルタが適用できていることがよく分かります。
ここで一歩戻って今回どんなフィルタを作ったのか見てみましょう。freqz関数でフィルタ係数の特性を見ることが出来ます。先ほど作ったbloを見てみると…
freqz(blo,1)
どこにも2000Hzとは書いてません。正規化周波数で書かれています。ただし、ここで言う正規化周波数は書籍などでよく見るサンプリング周波数を1とする正規化周波数ではなく、ナイキスト周波数を1としています。それで正規化周波数の単位には2 rad/Samplingではなく rad/Samplingと書かれているのですね。
サンプリング周波数は8192Hzであることから、その半分である4096Hzを1とするとfir関数で引数としていた0.48は1966Hzに相当します。この1966Hzがローパスフィルタの周波数となっているわけですね。
さて、大体【記事2】の内容が分かってきたところでフィルタを自由自在に作る方法に移っていきます。
ここで使うのがFDA(Filter Design and Analisit) toolです。これはフィルタの形状を見ながらちょちょいとフィルタを作るには便利なツールです。
先ずは、ここまでで扱ってきたchirpデータの周波数スペクトルを見直してみます。
バンドパスフィルタで主ピークの両端を削るようなフィルタを作ってみましょう。となるとバンドパスフィルタの周波数を2700~3500Hzにします。
こんな感じの画面が出てきますので、以下のように設定します。細かい数値は適当です。
エクスポートしてワークスペースに係数ベクトルをNumとして出力します。これを先のbloの代わりに代入してあげればバンドパスフィルタとして処理されるはずです。
ただ、メインのスクリプトがclear allで変数を都度リセットするようにしているので、都度Numを生成してくれるように作成したフィルタをmファイルとして出力しておきます。Matlabコードを生成を選ぶとmファイルを作ってくれます。
% All frequency values are in Hz. Fs = 8192; % Sampling Frequency Fstop1 = 2500; % First Stopband Frequency Fpass1 = 2700; % First Passband Frequency Fpass2 = 3500; % Second Passband Frequency Fstop2 = 3700; % Second Stopband Frequency Dstop1 = 0.001; % First Stopband Attenuation Dpass = 0.057501127785; % Passband Ripple Dstop2 = 0.0001; % Second Stopband Attenuation dens = 20; % Density Factor % Calculate the order from the parameters using FIRPMORD. [N, Fo, Ao, W] = firpmord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 1 ... 0], [Dstop1 Dpass Dstop2]); % Calculate the coefficients using the FIRPM function. bpf = firpm(N, Fo, Ao, W, {dens}); Hd = dfilt.dffir(b);
ここで、Fsはスクリプト内で共通なので削除しておいて、生成されたフィルタ係数をfreqzで見てみましょう。
ちゃんと出来てますね。それでは先のbloの代わりにbpfを使いましょう。先ずは時間波形を見てみます。
これだけだと生データと大きくは変わらないですね。続いて生データとBPF処理後の周波数スペクトルです。
上段が生データ、下段がBPF後の周波数スペクトルです。
ちゃんと設計したとおり2500以下は-60dB、3700以上は-80dBになるようになっています。以上、Matlabにおけるフィルタ設計の基本でした。
結局FIRとIIRはまだどっちを選べばいいか聞かれたら答えられません。追々分かったら書いていきたいと思います。