私はMatlab udp()オブジェクトを使って計測器からバイナリデータを読み込んでいます。udp()オブジェクトから任意の長さのバイナリデータを整列する
私は、任意の長さのデータ型を読み取るためのサポートの明らかな欠如に驚いています。どのようにして24ビット整数を読み取るのですか?または24ビット浮動小数点?これらは計測では奇妙なことではなく、ドキュメントには8/16/32/64データタイプしか見つかりませんでした。
私はMatlab udp()オブジェクトを使って計測器からバイナリデータを読み込んでいます。udp()オブジェクトから任意の長さのバイナリデータを整列する
私は、任意の長さのデータ型を読み取るためのサポートの明らかな欠如に驚いています。どのようにして24ビット整数を読み取るのですか?または24ビット浮動小数点?これらは計測では奇妙なことではなく、ドキュメントには8/16/32/64データタイプしか見つかりませんでした。
あなたは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
実装は夫婦、あなたが試すことができ、それほどきれいではありません、回避策があります。このキャスティングをサポートしていないことを見て。
は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
タイプに戻す必要があります。
あまり面白くないオプションは、上記の基本方法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');
は、私はあなたが記述行動を期待し、それを使用するコードの計画を書いたが、私は後者は> =をサポートしていないと、ファイル/関数fread()およびUDP /のfread()の異なる実装を参照してくださいキャスティングステートメント。私は過負荷で迷子になっていますか?代わりに別のフリーダ関数を取得する必要がありますか? – 0xF2
違いがあるかもしれませんが、MATLABのどのバージョンを使用していますか?もう一度見てみましょう。 – informaton
私はR2016bを使用しています。ありがとう! – 0xF2