NI製品ディスカッション

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

バイナリデータ保存の際のエラー

お世話になっております。

 

LabVIEWで実験条件をバイナリで書き込み、MATLABでバイナリファイルを読み込もうとしています。

MATLABで今後、2次元FFTなどをしたり解析をする予定です。

MATLABで読み込んだ場合、4列目に実験条件や日時を追加できればいいなと考えています。

 

また、256×256×3(x,y,xのデータ)×2バイト=393kBで、バイナリファイルを保存することができました。

ありがとうございます。

 

1列目がyのデータ、2列目がxのデータ、3列目がz(トンネル電流)のデータになっているはずなので、1,2列目は0~255までの数値が入っているはずです。(zは適当な波形を入力しているので問題ありません)

しかし、MATLABでバイナリファイルを開いたところ、1,2列目のデータがおかしいようです。(以下添付)

何が原因かわかりますでしょうか。

 

よろしくお願いいたします。

matlab画像.png

0 件の賞賛
メッセージ21/34
106件の閲覧回数

4列目ということは、実験条件はポイント毎に違うのですか?

 

バイナリデータファイルをLabVIEW(サンプルVIの「ファイル確認」部分のコード)で読み込むとどうですか?
正常に読めるならMATLABのほうの読み込み失敗です。
サンプルVIでは、XYZデータを符号付き16ビット整数のビッグエンディアンとして書き込みます。

0 件の賞賛
メッセージ22/34
97件の閲覧回数

お返事ありがとうございます。

 

>>4列目ということは、実験条件はポイント毎に違うのですか?

 

私の説明がわかりにくくて申し訳ございません。実験条件は全ポイントで同じです。4列目でも5列目でもどこでもよいのですが、バイナリファイルを読み込んだ時に空いてるマスに、保存した日時、xy freq、x amp、y ampを文字として残したいという意図です。

実験条件改ざんを防止するために、このようにしようと思ったのですが、難しいのでしょうか。

 

>>バイナリデータファイルをLabVIEW(サンプルVIの「ファイル確認」部分のコード)で読み込むとどうですか?

 

正常に読み込めました。ただ、これらの数値をMATLABで読み込んで解析します。

そうなると、LabVIEWの「ファイル確認」でデータを見たときに、これらをctrl+Aで全選択して、エクセルなどに張り付け、そのエクセルをMATLABで読み込んで解析をするといった方向になるのでしょうか。

 

よろしくお願いいたします。

0 件の賞賛
メッセージ23/34
94件の閲覧回数

以下ご承知でしたらすみませんが・・・

 

「空いているマス」という考え方がデータストリームには合いません。

どんなファイルも内容はU8の1次元配列と考えられます。どのバイト(ビット)が何を表しているか決まっていれば元のデータと同じに組み直せます。

マスにデータが埋まっているのは次元を指定して並べ直したからですよね。さらにその1マスのデータも解釈の仕方よっては元と違う値に復調されてしまいます(いまここ)。


実験条件がXYZデータの途中に混じっていたら、その位置とデータ形式がわかっていないと抽出できません。面倒なので単純なバイナリファイルではたいてい先頭か最後に置きます。

 

MATLABでも指定位置から何バイトかを取り出したり、データの解釈方法を変えられるはずです。低水準バイナリデータのインポート、などで調べてみてください。

仮にバイト順の相違だけであれば、サンプルVIの「バイナリファイルに書き込む」と「バイナリファイルから読み取る」関数の「バイト順序」入力を「little-endian」にすることで解決できるかもしれません。

0 件の賞賛
メッセージ24/34
84件の閲覧回数

お返事ありがとうございます。

「低水準バイナリデータのインポート」など、調査したいと思います。

 

加えて2つ質問させてください。

1つ目

現在は、256×256×3(x,y,z(トンネル電流))の数だけデータを保存しており、保存ボタンを押した瞬間から65536データとり、止まるようになっています。

ここで、ボタンを押してから、初めてx,yがともに0になった瞬間から保存をはじめ、65536データに達したら止まるようにすることはできますでしょうか。(最後のデータのx,yはともに255であるはず)

このようにすれば、x,yのデータがなくてもzのデータの数でx,yの位置がわかるようになり、x,yを保存していた時よりもファイルサイズを小さくできると考えています。

 

2つ目

現在は256×256の範囲の原子像の画像を作っています。

それを512×512pixelに変更し、今までのようにデータを保存します(512×512=262144)。

保存したデータのx軸で0から255までのデータ(x軸でいうと正の方向に動いているときのデータ)と255から0までのデータ(負の方向に動いているときのデータ)で分けて、256×256の画像を2枚表示させることはできますでしょうか。y方向でいうと、yが偶数の時、奇数の時でそれぞれ分けて、256×256pixelの画像にしたいです。

イメージでは、「ファイル確認」で保存したファイルの中身を見ていましたが、その「ファイル確認」を押したときに2枚の画像も一緒に表示されるといったことを考えています。(「ファイル確認」とは別の新しいボタンを押して表示するというのも考えている)

 

長くなりましたが、私の考えていることは可能なのでしょうか。

よろしくお願いいたします。

0 件の賞賛
メッセージ25/34
67件の閲覧回数

プログラムなので如何様にもできます。


1つ目((X,Y)=(0,0)から保存開始)

「ファイル保存」ボタンがONになったら、(X,Y)=(0,0)を待って保存を始めればよいでしょう。
(X,Y)=(0,0)が「付加配列2」の途中に見つかった場合は、(0,0)より前を捨てる必要があります。

 

2つ目(2Dデシメーション)

512×512の面積は256×256の4倍(256×256画像4枚分)です。イメージを整理し直してください。

Xの奇数と偶数、Yの奇数と偶数の組み合わせは4通りあるので、それぞれの組み合わせで4枚の画像に振り分けるのではないですか?

 

奇数と偶数の判別には「商&余り」関数を使います。値を2で割った余りが0ならば偶数です。

0 件の賞賛
メッセージ26/34
61件の閲覧回数

お返事ありがとうございます。

 

>>「ファイル保存」ボタンがONになったら、(X,Y)=(0,0)を待って保存を始めればよいでしょう。

先日頂いたプログラムでいうと、どの個所を変更すればよいでしょうか。

お手数をおかけしますが、アドバイスいただけると幸いです。

 

>>512×512の面積は256×256の4倍(256×256画像4枚分)です。イメージを整理し直してください。

申し訳ございません。正しくは、256(x)×512(y)でした。

イメージを添付します(添付した画像の図はすべて正方形ですが、左の図は256×512なので縦に長くなります)。

x方向に増加していくとき(トレース側)、x方向に減少していくとき(リトレース)でそれぞれで、データを合わせて2枚の画像を作りたいです。256×256の画像をトレース・リトレースに分けてしまうと、それぞれ128ラインしかなく、256×128の画像が2枚できてしまうので、256×512の範囲でデータをとろうと思っています。

トレースはyが偶数、リトレースはyが奇数になるので、「商&余り」関数を使いたいと思います。

具体的にはどこに入れればよいのでしょうか。

 

よろしくお願いいたします。

すべてをダウンロード
0 件の賞賛
メッセージ27/34
46件の閲覧回数

このプログラム構造のままだと、こんな感じでしょうか(添付VI)。

 

256×512のデータはそのまま書き込んで、読み込み時に2枚に分ければいいのではないですか?

やってみてうまくいかなければまたご質問ください。

0 件の賞賛
メッセージ28/34
36件の閲覧回数

お世話になっております。

 

x,y=(0 0)判定のプログラムは、正常に動きました。ありがとうございます。

x,y=(0 0)判定をしたのちに、z(トンネル電流)のみのデータを保存したいです。

x,y=(0 0)で保存を開始しているので、x,yのデータがなくてもzのデータ数でx,yの位置がわかります。(x,yはファイルサイズ削減のため保存しない。)

 

また、トレース・リトレースの画像を作る際に、yの値が奇数or偶数で判断しようと考えておりましたが、x,yのデータを保存しないのでその方法は使えないと考えています。

保存したファイルから256データずつ振り分けるにはどのようにしたらよいのでしょうか。

よろしくお願いいたします。

 

 

0 件の賞賛
メッセージ29/34
29件の閲覧回数

配列から指定の行や列または要素を取り出すのは「指標配列」関数を使えばできます。

 

ファイルはすべてU8の1次元配列と思って差し支えありません。データタイプは解釈の違いです。

添付した「バイナリファイルの説明.vi」を実行してデータを比べてみてください。

1次元配列を2次元に並べ直すのは「配列次元変更」関数でできますが、同じことを「バイナリファイルから読み取る」関数に行と列のサイズを与えてやらせることもできます。

 

Z値だけの256×512配列から1行ずつ取り出して処理するのはForループが良いでしょう。

奇数行だけを反転(インデックスは0から始まるので最初が偶数です)しながら振り分けて2次元に組み上げればOKです。

配列の操作はLabVIEWのキモなのでぜひマスターしてください。

すべてをダウンロード
0 件の賞賛
メッセージ30/34
14件の閲覧回数