09-01-2023 07:59 AM
このVIは何をするためのものでしょうか?どう動くことを想定していますか?
書き込みを行う前と後とは、何を(どのスイッチがONとかOFFとか)指しますか?
たとえば「配列」に入ってきたデータをファイルに書き込むサブVIですか?
「配列」は32行100列に収まるサイズですか?
09-01-2023 08:10 AM
VIと、そのVIをどう操作したら問題を再現できるかを教えていただけますか?
09-05-2023 05:14 AM
このVIは、32チャンネルから特定のチャンネル(この場合、5チャンネル)のデータ(配列)を表示し、さらにそれらのデータをエクセルに書き込むためのVIです。
このVIの現在の主な目的は、各チャンネルごとに取得した脳波データを波形チャートに表示することです。しかし、波形グラフに正しくプロットできていないため、その原因を特定するために、まず脳波データがどのように配列に格納されているのかを確認するために、エクセルファイルにデータを書き込み、視覚的に確認しようとしています。
"書き込みを行う前と後" という表現は、二重のケースストラクチャの中の内側のケースストラクチャの条件部分に関連しており、それに付随するスイッチがオンまたはオフになるタイミングを指しています。
配列のデータに関しては、計測が停止するまで無制限に入力されます。
最終的な目的としては、各チャンネルを毎秒sample2048でFFTをして波形グラフにプロットしたいです。
09-05-2023 05:40 AM
配列を取得する元のVIは、"Actiview" というソフトウェアから提供されています。ActiviewのVIと配列を取得し、書き込むためのVIを提供いたしますが、このサブVIは複数存在するため、正式なダウンロードサイトのURLを以下に示します。
[Activiewダウンロードサイト](https://www.biosemi.com/download.htm)
正式なサイトからダウンロードした場合、私が作成した "2hairetu_test.vi" を画像と同じディレクトリに配置することで、同様の環境を再現できます。
実際にこれを実行するには、おそらく「Bio-Semi A/D ボックス&バッテリーボックス、USB2 レシーバ、Active-Electrode(電極)」など、ハードウェアの実機を用意する必要があります。したがって、実際の実行はハードウェアの取得が必要であり、実現が難しいと考えられます。
09-05-2023 10:30 AM
VIのご共有、ありがとうございます。ハードウェアがないと実行ができない、とのことですが、
・実行時に入力している配列の表示器を作成(ワイヤー上で右クリック→作成→表示器)して実行
・表示された配列データをブロックダイアグラム上右クリックから「定数に変更」
とすることで、ハードウェアが無くても実行できる形にしてVIを作成することができます。ご検討下さい。
同じVIで実行結果が違う、ということは、渡されている配列データに原因があるのだと思います。入力されている配列データとこのVIがあれば、多くの人がVIを実行して様々な意見を出すことが可能です。(もっとも最近のディスカッションフォーラムはほとんど人がいないようですが)
このフォーラムは有志で成り立っています。「すぐ回答ができそう」な質問にはいろいろな意見が得られやすいですが、「わかりにくい質問」にはよほど時間に余裕があるか、人助けに熱意のある人でないと回答しないものと思われます。好奇心で覗いてみても、書かれている情報だけで問題が再現・理解できないと何もアクションを取らずに立ち去って行くでしょう。質問にテクニックが必要なのはStackOveflowなどでもよく言われることです。https://www.ranvis.com/articles/smart-questions.ja.html
あなたは以前、「書き込みを行う前だとデフォルトの-1の値を取り、波形チャートや書き込みが正しく行われず、書き込みを開始するときれいに波形が出て書き込みもうまくいく」と書きました。私は正直この文章を理解できていません。
・「何」が「デフォルトの-1の値」を取るのですか?
・「波形チャートや書き込みが正しく行われず」の「波形チャートが正しく行われず」とは何でしょう?
・「書き込みが正しく行われず」は何をもって「正しく行われていない」と判断されたのでしょう。期待される「正しい」結果はどのような結果でしょうか?
・「きれいに波形が出て」とは何をもって「きれい」なのでしょうか。(添付の図を見れば「なんとなく」分かりますが、「きれい」は主観的な表現です。技術的な質問は客観的な表現で行われるべきです。)
・「書き込みを行う前」であれば書き込みが行われていないので、「書き込みが正しく行われず」は当然の結果かと思うのですが、この2つの目的語は「出力しているExcelファイルに」という理解であっているでしょうか?それとも何か別々の物を指していますか?
細かい揚げ足を取られているように感じるかもしれません。「そんなの書いていることを読めばわかるだろ!くだらないことを聞いていないで自分の質問にさっさと答えてくれ!」と思うかもしれません。ただ私は細かい部分に引っかかりすぎて、ちょっと、正しく質問に答えられそうもないと思っています。(J.H.Watsonさんはこのような質問にも見事回答されていてさすがだな、といつも感服しております。)
なお、私の手元でもなんとか実行しようと、以下の様な5x100の乱数データを入力してみましたが、すべての実行において入力されたデータが「MonChart」に適切に追加・表示され、「5チャンネル分の100点のデータ」としてプロットされています。Excelファイルも”ブール2”をTrueにした場合のみ出力され、意図したとおりの出力内容になっているように見えます。
この結果とお手元の結果の何が違うのか、教えていただけると幸いです。
09-06-2023 04:07 AM
他人が作ったプログラムを解析するのはたいへんです。開発ツールに習熟しているならまだしも、同時に学びながらとなると難易度は最高レベルです。まずはLabVIEWにおけるデバッグ方法を知る必要があります。
添付されたVIには足りないVIがたくさんあって動作を推測することができません。また他所のファイルを無断で転載してはいけません(Webサイトからは最新版しかD/Lできなかったので、当該のVIがあってサポートが捗ったのは確かですが)。
TAKASUさんが書かれているようにワイヤのデータを制御器の初期値として固定するなどして、単独でも動かせるようなVIに抜き出すと良いです。
今回の目標である、1秒毎に2048ポイントのFFTをしたいのならば、わざわざファイルに書かなくてもダイアグラムでMon Chartへのワイヤにプローブを付けて、毎回どんな値とサイズの2D配列が渡されているか見るのが手っ取り早いです。
VIからわかることを以下に示すので、目標への道筋をつける際の参考にしてください。
Mon Chartグラフのプロパティを見ると、スィープチャート、スタックプロットではない、最大264プロット、Xスケールが0~8で乗数が0.0078125-->8/0.0078125=1024ポイント表示、Yスケールが0~6で乗数が1だとわかります。
またグラフ表示器のポップアップからわかるチャート履歴の長さが2049なので、最大2049ポイントのデータを蓄積しながら(2049を超えて追加されたら古いデータを捨てる)、最新の1024ポイントのデータをスィープ表示することがわかります。
FFTで周波数を判定するためには元データの時間情報が必要です。収録時のサンプリングレートと間引き数(Downsampleという名のVIがあるのが怪しい)からグラフに表示されているデータの時間間隔を割り出してください。
何秒でに2048ポイント溜まるか不明なので、1秒ごとにMon Chartの履歴データ(プロパティノードで取得し先頭の1ポイントを削除して2048ポイントにする)をFFTすればいいと思います。ただしレベルとDC成分に注意が必要です(理由を以下に述べます)。
波形チャートがスタックプロットなしで数本のトレースが1画面に描かれているところから、チャンネルデータの振幅を正規化して、等差のオフセットを加えてY軸レンジ(0~6)の間に並ぶように調整していると考えられます(おそらくDeciScreen.viあたりがやっている)。
従って、FFT前に元の値に戻す必要がある(レベル値が重要)のなら、正規化時の係数とオフセットを知る必要があります。周波数成分だけが重要ならば値を戻さず、FFT後にDC成分(指標0のデータ)を0に置き換えるだけでOKかと思います。