10-03-2016 03:38 AM
初めての投稿になります。
現在、大学の研究で磁気センサなどで計測した信号をノイズ除去のために加算平均を行うプログラム
を作ろうとしています。具体的には、DAQのPFIO端子にファンクションジェネレータのトリガ信号
を入力して、トリガの立ち上がり(または、立下り)からai0に入力された電圧を読みだしてトリガの立
ち上がりから次の立ち上がりまでのai0の電圧を指定された加算回数で足して割るというプログラム
を作りたいのですが自身のLabVIEWに対する知識不足のため、どのように作ればいいのか分かりません。
私の質問自体がわかりにくいかもしれませんが、どうか皆様アドバイスなど頂ければ幸いです。
解決済! 解決策の投稿を見る。
10-04-2016 12:26 AM
投稿を拝見いたしました。
何点か確認させていただきたいことがありまずが、よろしいでしょうか。
1.電圧集録、およびその開始・停止トリガをDAQで行っているという理解でよろしいでしょうか。
2.DAQから得られるデータは、数値データでしょうか、もしくは数値配列でしょうか。
3.開始~停止トリガを複数回繰り返して、それらすべてを加算して平均を出すということでしょうか。
Whileループにシフトレジスタを持たせて、ループで反復した回数分だけ加算させることで、出来るかなと考えておりますが
上記内容に関してもお伺いできればと思います。
10-04-2016 07:58 AM
S.Shinoharaさま
早速のご返答ありがとうございます。まず、
1.電圧集録、およびその開始・停止トリガをDAQで行っているという理解でよろしいでしょうか。
電圧集録です。そしてDAQアシスタントのトリガの開始トリガのデジタルエッジで行おうと思っています。
停止トリガについてはすみません、よく分からないのですがDAQアシスタントにある機能なのでしょうか?
2.DAQから得られるデータは、数値データでしょうか、もしくは数値配列でしょうか。
こちらは、ダイナミックデータから変換するの結果データタイプのことでしょうか?
まだ、ブロックダイアグラムでプログラムを作る段階ではなく、フローチャート的にどのように設計すれば
いいのだろう?レベルなので決めていません。
3.開始~停止トリガを複数回繰り返して、それらすべてを加算して平均を出すということでしょうか。
はい、その通りです。実験回路的には、ファンクションジェネレータのトリガ信号をDAQのPFI0に入力し、バースト波
電流を測定対象に流して、それによって測定対象に発生する電圧信号をDAQのaioに入力するような回路構成になります。
なので、まずトリガが立ち上がってバースト波電流を測定対象に流した瞬間にai0の電圧を読み込んで、次の立ち上がり(次のバースト波電流を流す)までの信号を加算して平均を出すことで目的とする信号以外のノイズを減らせるプログラムを作りたい
と考えています。
最近LabVIEWを始めたようなど素人なのでイメージの共有が難しいかもしれませんがどうかよろしくお願いします。
10-04-2016
10:09 AM
- 最終編集日:
03-27-2025
02:09 PM
、編集者:
Content Cleaner
これからどんどんカスタマイズして使っていくのであれば、LabVIEWヘルプにあるサンプルを検索からサンプルファインダを立ち上げ、
ハードウェア入出力->DAQmx->アナログ入力->電圧-連続入力
を使ったほうが良いと思います。
DAQアシスタントと同様、データ集録とログはこのプログラムでできます。
フローチャート的にどのように設計すればいいのだろう?レベルの人にはこのブロックダイアグラムがDAQによるデータ集録の基本の流れの勉強になると思います。NI-DAQmx入門などのWebリソースも参考にしてください。
トリガに関しては、開始トリガと基準トリガを使用して集録のスタート/ストップを外部トリガソースで制御する方法が参考になるでしょう。
また、このサンプルプログラムではデータのログがTDMS形式でしかできません。(TDMS形式がわからない場合はNI TDMSファイル形式を読んでください)
テキスト形式でログを残したければ、ファイル書き込みのサンプルプログラムなどを参考にして自分で作るか、それが難しければアドインを使用してExcelで読み込んでcsvなどで保存しなおす必要があります。
平均の計算については、集録データ量がそれほど膨大でないのであれば、リアルタイムで平均を計算して平均値のログをとるよりは、一通りデータ集録を終えた後に、ログファイルを処理するプログラムを別で書くのが良いと思います。あとで別の解析を行うこともできますので、生データを残しておくのは重要です。
データ量が膨大な場合など、どうしてもリアルタイムで平均を計算したいのであれば、S. Shinohara様がおっしゃったようにシフトレジスタを使用する方法などがありますが、最近LabVIEWをはじめたのであれば、シフトレジスタと言われてもわからないと思うので、まずはそのあたりを勉強したほうが良いでしょう。
無料で使える学習用リソースはいくつかあります。
大学図書館にLabVIEW入門書がおいてある場合がありますので、探してみてください。
また、トリガのところでリンクを張ったように、Google検索で出てくるNIのWebページは個別の問題解決に有用です。
また、ナツ様の大学(または研究室)の契約状況によっては、オンライントレーニングも無料で受けられます。英語ですが、字幕が出せて一時停止もできるので、英語が苦手でもそれほど問題はありません。
以上、ご存知の情報もいくつかあると思いますが、参考になれば幸いです。
10-06-2016 07:36 AM
Merly様、S.Shinohara様
返信が遅くなり大変申し訳ありません。Merly様やS.Shinohara様のアドバイスを受け、載せて頂いたURLに飛んで開始トリガと基準トリガの併用の勉強させて頂いたり、シフトレジスタでのやり方を学習していました。そこで、いろいろ学習していくうちに、ふとこのやり方で加算平均できるのでは?と思ったことがあります。
それは、PFI0にトリガ信号を、aioにバーストで周波数20kHz,spaceが2000の信号を入力したとき、信号の周期は50μsでspaceが2000なので、次の立ち上がりまで100ms(50μs×2000)になります。
しかし、このすべてのデータを取る必要はなく、トリガが立ち上がってからaioのアナログ入力を開始し、1050μsだけの波形データを毎度加算していけばいいというプログラムを作るとき、DAQアシスタントの設定をNサンプルにして、サンプリングレートを100KS、読み取るサンプル数を105にすれば、1050μsの波形データは計測できると思います。
このままだとDAQはトリガの立ち上がりからアナログ入力を開始して1050μsで計測をやめてしまうと思うのですが、このDAQアシスタントにwhileループをかけてやることでこの計測作業を毎回行わせて、加算をとることは可能でしょうか?
何卒アドバイスなどを頂けると幸いです。
10-06-2016
11:29 PM
- 最終編集日:
03-27-2025
02:09 PM
、編集者:
Content Cleaner
できそうな気はしますが、もし作成したVIがあれば添付して投稿していただけないでしょうか?
そちらのほうがより具体的なアドバイスができると思います。
また、DAQアシスタントをwhileループに含める際にはループ内でDAQmx Express VIを使用するも参考にしてください。
10-07-2016 06:46 AM
Merly様
返信ありがとうございます。
おっしゃる通りVIをある程度作成してから相談をしたほうがよさそうなので、VIを完成まではできるか分かりませんが、できるところまで出来次第、また質問させて頂こうと思います。ご迷惑をおかけしますが、何卒よろしくお願いします。
10-11-2016 06:12 AM
Merly様
今まで様々な参考資料やアドバイスを頂きありがとうございました。
波形をトリガの立ち上がりから加算平均するVIを無事作成することができました。もし、またさらなる改良を加えていく過程で不明な点が出てしまった場合は何卒よろしきお願いします。本当にありがとうございました。
10-11-2016 07:27 AM
お役に立てたようで何よりです。
参考までに、作成したVIを投稿していただくことは可能でしょうか?
今後同様の問題で悩む方がいたときの助けになると思います。
10-11-2016 08:21 AM
Merly様
すみません、先ほどできたと格好つけておきながらこんなことを言うのは恥ずかしいのですが、先ほどまでは出来たと先走っていたのですが実はうまくできていないことが分かりました。そのVIについて添付します。
VIのプロトタイプを作成したときに用いた信号は普通のsin波で100Hz、そしてDAQアシスタントの設定を100KS、読み取るサンプル数11にして実行していました。このときはFGの信号を試しにそのまま入力していたので、ノイズもない状態です。しかし、加算前と加算後の波形がしっかりでていたため、無事加算ができたものと早とちりしてしまいました。実際に配線に表示器を出して調べてみると、最初のケースストラクチャでi=0のときに最初の信号がそのままケース内を抜けていき、Forループのシフトレジスタに入ってケースストラクチャに再び戻って来るところまでは信号を確認できるのですが、TRUEの中の割る2を行う場所では信号を確認できませんでした。なので、加算前も加算後も同一の波形を出しているだけの状態になっているのですが何故なのでしょうか?
DAQアシスタントをNサンプルにしてDAQアシスタントごとForループをかけているのですが、やはりDAQはループ回数分集録してくれず、一度だけしか集録を行ってくれないということなのでしょうか?
また、すぐに聞いてしまって申し訳ありませんがどうかアドバイスをお願いします。