2017-07-26 15 views
2

私はMatlab udp()オブジェクトを使って計測器からバイナリデータを読み込んでいます。udp()オブジェクトから任意の長さのバイナリデータを整列する

私は、任意の長さのデータ型を読み取るためのサポートの明らかな欠如に驚いています。どのようにして24ビット整数を読み取るのですか?または24ビット浮動小数点?これらは計測では奇妙なことではなく、ドキュメントには8/16/32/64データタイプしか見つかりませんでした。

答えて

2

あなたはhelp freadを試してみましたか?ドキュメントは、浮動小数点の仕様が変わるので、これは、またはしない場合があり、状況のために働くことができるので、Nは1と64

fid = udp(<your parameters here>); % use fopen to open the stream. 
... 
A = fread(fid,1,'bit24=>int32'); % stream 24 bits to a 32 bit integer. 
B = fread(fid,1,'ubit24=>uint32'); % stream 24 bits to a 32 bit unsigned integer. 

の間の値であるbitNを使用して、一度に64ビットまで読み取るサポートを示しています。

C = fread(fid,1,'bit24=>float32'); % transcode 24bits to 32 bit float (MATLAB spec) 

UPDATE

udp/fread実装は夫婦、あなたが試すことができ、それほどきれいではありません、回避策があります。このキャスティングをサポートしていないことを見て。

  1. は3の倍数でucharデータを読み込み、その後、直接そのバイトオフセットを掛け。たとえば:

    % First determine number of bytes on the stream and make sure you 
    % have at 3 or more bytes to read so you can calculate thirdOfBytesExpected. 
    
    [anMx3result, packetCount] = fread(fid,[thirdOfBytesExpected,3]); 
    unsigned20bitInt = anMx3result*(2.^(0:8:16))'; 
    

    正確には、unsigned20bitIntは実際にここにMATLAB doubleとして格納されています。したがって、別の場所に書き込む必要がある場合は、それを元にした個別のucharタイプに戻す必要があります。

  2. あまり面白くないオプションは、上記の基本方法freadを使用できるように、中間ステップとしてバイナリファイル形式にデータをストリーミングするオーバーヘッドを食べることです。理想的な解決策ではありませんが、何かが必要な場合は、おそらく検討する価値があります。

    % your original code for opening the udp handle 
    
    .... 
    
    tmpFid = fopen('tmp.bin','rw'); 
    [ucharVec, bytesRead] = fread(udpFid,bytesExpected,'uchar=>uchar'); 
    bytesWritten = fwrite(tmpFid,ucharVec,'uchar'); 
    
    % Do some quality control on bytes read vs written ... 
    
    fseek(tmpFid,-bytesWritten,'cof'); 
    % in theory you should be able to just go to the beginning 
    % of the file each time like this fseek(tmpFid, 0, 'bof'); 
    % provided you also reset to the beginning prior writing or after reading 
    
    % Read in the data as described originally 
    num24ByteIntsToRead = bytesWritten/3; 
    A = fread(tmpFid,num24BytsIntsToRead,'bit24=>int32'); 
    
+0

は、私はあなたが記述行動を期待し、それを使用するコードの計画を書いたが、私は後者は> =をサポートしていないと、ファイル/関数fread()およびUDP /のfread()の異なる実装を参照してくださいキャスティングステートメント。私は過負荷で迷子になっていますか?代わりに別のフリーダ関数を取得する必要がありますか? – 0xF2

+0

違いがあるかもしれませんが、MATLABのどのバージョンを使用していますか?もう一度見てみましょう。 – informaton

+0

私はR2016bを使用しています。ありがとう! – 0xF2

関連する問題