NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

ゼロクロス点抽出について

解決済み
解決策を見る

添付写真の①➁のY座標がゼロの点を以下のように抽出したいです。

 

 ・①であれば、x=2,3,4 が y=0ですが、抽出したいのは、x=3(x=2,3,4の平均値)

 ・➁であれば、x=6,7の間 が y=0ですが、抽出したいのは、x=6.5(x=6,7の平均値)

 

どのようにコードを書けばいいかご教授願いします。

 

 

0 件の賞賛
メッセージ1/5
2,547件の閲覧回数
解決策
トピック作成者sakana55が受理

平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。

 

どのようなアルゴリズムを作成したいのか具体的に行いたい処理手順はございますか?

色々な方法があると思いますが、自分が作成するとしたY値がゼロの場合とゼロを超える(1 > -1, -1 > 1など)場合で分けて処理して、あとでマージする方法にすると思います。

 

各条件(ゼロの場合とゼロを超える場合)で見つけたY値と同じ行のX値を2次元配列に貯めていき、すべてのY値を確認したら、貯めた2次元配列を行ごとに平均して1次元配列にします。最後に各条件の平均値を連結してソートすれば、ご希望の値になると思います。

 

思いつきでプロトタイプを作成してみました。あまりスマートな方法ではないと思いますが、シフトレジスタやケースストラクチャによる条件判断、平均関数など部分的にでも参照していただけると幸いです。

0 件の賞賛
メッセージ2/5
2,503件の閲覧回数

NI:上野様

 

早速ありがとうございました。

viの読解に時間が少し必要ですが、こちらを応用してみます。

 

またVisionAssistant上でコードを分岐させることはできますか?

例えば、フィルタを使用するときいくつかのパターンを平行して確認したいなと思う時がありまして。。。

0 件の賞賛
メッセージ3/5
2,494件の閲覧回数

VIが読みづらくて申し訳ないです。

値がゼロの場合は、部分配列置換関数でループ外で準備した2次元配列のX値を差し替えています。

ゼロが続く場合は、同じ行にX値を差し替えていき、続かない場合は次の行にしています。

続かない場合というのは、Yデータが0のX値を2次元配列に貯める条件として、前回のループでY値がゼロではない、且つ現在のループでゼロの場合を判断しています。

 

ゼロを飛び越える場合は、Forループの下半分でおこなっており、Y値に対して符号関数で、プラス値を1、ゼロを0、マイナス値を-1を返すことで、前回のループと現在のループを比較して同じ値ではなく、ゼロではない場合のX値を貯めるようにしています。

ゼロが12個以上続くようなら、配列初期化関数の入力値を増やさないとうまく処理されません。

 

 

なお、追加のご質問に対する回答ですが、Vision AssistantにはIF文のようなコード分岐機能はありませんので、そのような分岐が必要な場合はコード生成してLabVIEW側で作成する必要がございます。

 

 

0 件の賞賛
メッセージ4/5
2,490件の閲覧回数

NI 上野様

 

承知しました。

ご教授いただいた内容でトライしてみます。

 

追加質問のご回答もありがとうございました。

メッセージ5/5
2,477件の閲覧回数