質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

2回答

2846閲覧

MATLAB 観測データの処理

Tannnnnnnnnnn

総合スコア24

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2016/11/08 13:40

matlab初心者の者です。
生データ(観測データ)をmatlabに読み込み、グラフを作成したいのですが
エラーが出てしまいます。プログラムの添削をお願いします。
この観測データのフォーマットは「Licel Raw Data Format」(http://licel.com/raw_data_format.html)です。


file = unzip(106906); %解凍
fid = fopen(file); %ファイルを開く

tline1 = fgetl(fid); %header3行読み込み
tline2 = fgetl(fid);
tline3 = fgetl(fid);

dateset=tline2(25:26); %dateset数

for i=1:1:dateset
d = fgetl(fid);
n = d(32:37); %date数(the number of shots)
D = fread(fid,n,'long'); %date
plot(D)
end

fclose(fid);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

引用したいので新しい回答枠で。
MATLABが扱えるデータの形式は、
標準ファイル形式
であり、
インポートとエクスポートでサポートされるファイル形式
は基本的にテキスト形式。
開示されたデータを見ると16進数のデータ。
データの形式変換を行わないと読めません。
しかしながら貴殿のソースからバイナリ ファイルからのデータの読み込みの記載がある事を考慮して、その部分に内容に問題があるのではと。
なお指定されたデータは(日本語にしてみた)

Licel生データフォーマット

Licelロゴ
2最後の文字がどこにあるか\ noindentヘッダ行(ASCII形式)は、80文字の長さを有しています<CRLF>。ヘッダー行は、バイナリ形式のデータが続いています。最初のヘッダ行は、ファイル名が含まれています、

その文字で始まります。
世紀の年を示す2桁の数字
月(16進1桁)、
日(小数点以下2桁)、
時間(10進数、1日24時間、2桁)、
ピリオド(。)、
分(小数点以下2桁)、
秒(小数点以下2桁)、
秒の最初の小数点以下2桁(10進数、2桁)。
2番目のヘッダー行には、システムに関する情報が含まれています:
測定部位(8文字)、
測定開始時刻(日/月/年は、hh:mm:ssの)、
測定終了(日/月/年は、hh:mm:ssの)、
海抜高度(4桁(メートル))、
経度(を含む4桁の数字( - 記号)小数点以下のグレードのための1桁。)
緯度(を含む4桁の数字( - 記号)小数点以下のグレードのための1桁。)。
天頂角(度で2桁)
第三のヘッダ行で
タイプ1のレーザのレーザショットの数(整数7桁)、
1型レーザ(整数5桁)の繰り返し率、
2型レーザのレーザショット数(整数7桁)、
2型レーザー(整数5桁)の繰り返し率
そして、次のデータセット(整数2桁)の番号が与えられています。
3型レーザのレーザショット数(整数7桁)、
タイプ3のレーザの繰り返し率(整数5桁)
データ・セットに固有のヘッダ行が含まれています。

データが(アクティブセット1/0)。非アクティブなデータセットが書き込まれません。
光子計数Iアナログ(1/0)
レーザーの種類(1/2)
データポイントの番号(5桁)
人数、個数、総数 1
PM(V)の高電圧(ボルトで4桁の数字)
ビン幅(メートル単位で小数点記号(。)および小数点以下を含む4桁)
nm単位の波長(nm)、5桁の数字はピリオド(。)
偏光状態0 - なしのp - 並列秒 - 垂直
0 0 (後方互換性)
ビンシフト、全体数(プライマリビン、整数は、2桁の数字を切り捨て 00 サポートまたはゼロではない場合)
ビンシフトの小数点以下の桁(3桁、 000サポートされているか、ゼロでない場合)
ADCのビット数(2桁)
ショット数(6桁)
弁別レベルまたはADC(1桁の期間のデータ範囲4/3の数字)
デバイスidentificator(BT=アナログデータセット、BC=光子計数は、数は16進数で過渡現象記録装置のアドレスです)
ヘッダ行が続いている<CRLF>とによって分離された32ビット・データ・セット<CRLF>。データセットは、アナログ信号の場合、ショット数、さらにビット数およびデータ範囲を使用して物理単位と量に変換することができます。この手順で実行されます。

投稿2016/11/08 14:51

編集2016/11/08 15:00
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/11/08 15:01

今、開示されたデータを分析してます。
Tannnnnnnnnnn

2016/11/08 15:01

そうなのですね。初歩的なことを間違えていました。。 この16進数のデータを一文字ずつテキスト形式に変換するプログラムに通して、新しいファイルを作成し、インポートしてグラフを作るという理解で合っているでしょうか。
Tannnnnnnnnnn

2016/11/08 15:02

ありがとうございます。本当に助かります。
MasahikoHirata

2016/11/08 15:21

’この16進数のデータを一文字ずつテキスト形式に変換する’いえいえ、固定長フォーマットですから。生データのフォーマットに準じて、データを数字データに復元しないと。多くの計測器は計測に注力するため、データ変換とかを軽くするものが多いですから。
MasahikoHirata

2016/11/08 15:25

ですから前回の質問にも、’テキスト形式に変換’するツールの回答を致しました。それにしてもデータがフォーマット通りでないような気が。’ and the 32 bit data sets which are separated by a <CRLF>. ’ これヘッダーだけだよなぁ。
Tannnnnnnnnnn

2016/11/08 15:25

申し訳ございません。 「固定長フォーマットですから。生データのフォーマットに準じて、データを数字データに復元しないと」 が理解できないのですが、 具体的にどんなプログラムを書けばよいのでしょうか..。
Tannnnnnnnnnn

2016/11/08 15:29

そうだったのですね。マトラボ上でプログラムを書いて'テキスト形式に変換'するのはむずかしいのでしょうか.
MasahikoHirata

2016/11/08 15:35

まずマニュアルにもあるように32ビットデータ(バイナリ―なら4バイト)をLSBとMSBを意識して(エンディアンの問題。恐らくリトルエンディアン)32ビット整数に復元。これがヘッダーだけ?<CR/LF>=(0x0d,x0A)で分けられている(文字で言ったら改行コード)。貴殿の3行のデータにはないのとコード的に2進数(文字としては16進数)のデータと思われる部分と、文字列として’160906’と’1690110.525294’ と’1690110.52’と思わる部分が見れる。今、フォーマットと整合できるかやってる。
MasahikoHirata

2016/11/08 15:36

”マトラボ上でプログラムを書いて'テキスト形式に変換'するのは”、’VB.NET’とか’C++'とか’C#'ならたやすいが。
MasahikoHirata

2016/11/08 15:49

’160906/e16903110.525294’とか文字だろうなぁ。。 ’D = fread(fid,n,'long');’が正しいとしたら、32ビットデータの位置が合わない。。
MasahikoHirata

2016/11/08 15:50

’dateset=tline2(25:26);’の25:26の指定はどこからそのように?
MasahikoHirata

2016/11/08 15:56

あっずれるのは’0 0 (backward compatibility)’かぁ。。
MasahikoHirata

2016/11/08 15:59

だんだん見えてきたので、明日にでも変換の方法を開示します。
Tannnnnnnnnnn

2016/11/08 15:59

理解が追いつかず、すみません。 3行目の'and the number of the following data sets (integer 2 digits) are given.'です。 3行目の最初から文字数を数えて、25,26文字目がadtesetに当たると思いました。
Tannnnnnnnnnn

2016/11/08 16:02

明日の朝までに変換方法を作らなければならないので...自分でやり続けます。 明日変換方法の開示よろしくお願い致します。
MasahikoHirata

2016/11/08 16:14

’3行目の'and the number of the following data sets (integer 2 digits) are given.'です’ それ、’tline2’ではなくて’tline3'ですね。
MasahikoHirata

2016/11/08 16:16

断片を送られたデータの、 data set active (1/0). Non-active data sets will not be written. photon counting I Analog (1/0) laser type (1/2) number of data points (5 digits) the number 1 High voltage of the PM (V) (four digits in Volt) bin width (in meters four digits including decimal separator (.) and decimal places) wavelength (nm) in nm, five digits followed by a period (.) polarization status 0 - none p - parallel s - perpendicular 0 0 (backward compatibility) bin shift, whole-number (primary bins, integer rounded down, 2 digits, 00 if not supported or zero) decimal places of the bin shift (3 digits, 000 if not supported or zero) the number of bits of the ADC (2 digits) the number of shots (6 digits) discriminator level or data range of the ADC (one digit period 4/3 digits) device identificator (BT = analog dataset, BC = photon counting, the number is the address of the transient recorder as a hexadecimal number) の数字が分かれば、一気に教えます。
Tannnnnnnnnnn

2016/11/08 16:22

いちいち質問で申し訳ないですが、 データの一行目、 50 4B 03 04 14 00 00 00 08 00 9B 56 21 49 85 7B を2進数に変換した値ということでしょうか。
MasahikoHirata

2016/11/08 16:41

はい。 long型であると仮定して解説します。 50 4b 03 04は10進数にすると各桁は50=16*5+0,4b=4*16+11(b),03=0*16+3,04=16*0+4となります。 LSB(下の桁が左側がLittle Endian)が一般的なので、これと仮定して(16*5+0)+256*(4*16+11)+65536*(0*16+3)+16777216*(16*0+4)=67324752が'50 4B 03 04'の32ビット(long)の値、次の14 00 00 00は単純に16*1+4で20、’08 00 9B 56'は1452998664だけど、00 00 がパディング(桁合わせ)と考えると’00 00 08 00'ならば524288です。こんな感じで変換。
MasahikoHirata

2016/11/08 16:48

でも計測値であるからfloatの可能性も。その時は二進数の仮数部と指数部及び最適化があるので簡単には計算はできません。ちょうど仮数部12に指数が10の23乗で12e+23のような表現になりますが、16進の場合は符号1ビット指数部8ビット、仮数部23ビットって感じになるのでVBやC++の型変換の力を借りないと。
Tannnnnnnnnnn

2016/11/08 16:50

ありがとうございます。考え方がわかりました。 頑張ってプログラムにしたいと思います。
Tannnnnnnnnnn

2016/11/08 16:51

なるほど.....努力はします。
MasahikoHirata

2016/11/08 16:52

無理にとは言いませんが、断片の実データがあれば、完璧です。
MasahikoHirata

2016/11/08 16:54

それとNKNKさんのようにMATLABを使用する側の人間ですから(本職は化学系で合成がメイン)でコンピュータは本業ではないのです。(意外がられますが)だから本件は非常に興味ありますのでご遠慮なく。
Tannnnnnnnnnn

2016/11/08 16:58

そんなにお詳しいのに、とても意外です。 ありがとうございます。 実データとは3行だけではなく、データ全てという事でしょうか。
MasahikoHirata

2016/11/08 17:00

いえいえ3行あれば大丈夫と思います。
MasahikoHirata

2016/11/08 17:01

問題はfloatがあるかどうか。(おそらく仕様をみるとfloat?)あっfloat=浮動小数点の数値です。
MasahikoHirata

2016/11/08 17:03

それと解説している間にもlinuxのubuntuの回答してベストアンサーだってさ。残業の合成の合間で回答中。
Tannnnnnnnnnn

2016/11/08 17:06

すみません、ちょっと待ってください 泣
Tannnnnnnnnnn

2016/11/08 17:13

504B03041400000008009B562149857B ⇒ 1010000010010110000001100000100000101000000000000000000000000000000100000000000100110110101011000100001010010011000010101111011
MasahikoHirata

2016/11/08 17:20

あららら、意図しない結果ですね。(バイナリ―?) 実数字かと思ったが。 それと16進と一致もしないし。仮に2進数なら5=1001だし。これを単純に2進数として解釈するとA0 96 06。。。
Tannnnnnnnnnn

2016/11/08 17:25

すみません、基礎知識が抜け落ち過ぎていて。申し訳ないです。
MasahikoHirata

2016/11/08 17:27

他に’140000000’はfloatで’2’。ヒントになりますか?
MasahikoHirata

2016/11/08 17:29

こうやって探っていって元データから実データにしないと。力仕事はミスが起きますよ。
MasahikoHirata

2016/11/08 17:31

すみません、しばし仕事になります。
Tannnnnnnnnnn

2016/11/08 17:35

14000000⇒6.46235e-27 08009B56⇒3.87012e-34 2149857B⇒6.82781e-19 140000000はfloatで2ですか...基礎知識が無さ過ぎてわかりません。情けないです
Tannnnnnnnnnn

2016/11/08 20:35

簡単な言葉で整理したいのですが、 ヘッダーはテキスト形式で表記してあるから問題なし。 データ部は中身見てみたら16進数で表記されてあった。 ⇒16進数をテキスト形式に変換しないといけない ここで言うテキスト形式とはなんですか? 16進数をテキスト形式に変換するコマンドがマトラボにありそうですが、見つかりません。
MasahikoHirata

2016/11/09 10:02

正直な話、4行目からのデータと整合性を検証して一致しないので困惑しております。
WathMorks

2016/11/09 22:17

チャット化している
guest

0

フォーマットがMATLABの読める形式になってますか?
3行目以降のデータの破片があれば分かりますが。

投稿2016/11/08 14:01

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tannnnnnnnnnn

2016/11/08 14:13

ご回答ありがとうございます。 「3行目以降のデータの破片」とは、 例えば9/6の観測データファイル 160906.zip の中身の情報ということでしょうか。
MasahikoHirata

2016/11/08 14:26

開示に問題があれば、1行の抜粋だけでも。
Tannnnnnnnnnn

2016/11/08 14:40

50 4B 03 04 14 00 00 00 08 00 9B 56 21 49 85 7B D0 18 9B 16 00 00 3A 22 00 00 16 00 00 00 31 36 30 39 30 36 2F 65 31 36 39 30 31 31 30 2E 35 32 35 32 39 34 AD 97 05 74 15 D7 B7 C6 2F 7C 41 4B 28 09 04 87 04 92 60 85 90 04 82 6B 0A C5 DD 25 38 C5 A5 38 85 E2 2E 29 94 E2 B4 14 28 45 8A 6B A1 40 8B 93 3B 93 04 2F 96 99 9B E0 EE B4 58 78
Tannnnnnnnnnn

2016/11/08 14:41

すみません。こちらでお願いします。3行分です。 50 4B 03 04 14 00 00 00 08 00 9B 56 21 49 85 7B D0 18 9B 16 00 00 3A 22 00 00 16 00 00 00 31 36 30 39 30 36 2F 65 31 36 39 30 31 31 30 2E 35 32
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問