2025年1月25日土曜日

win format

winformat
https://wwweic.eri.u-tokyo.ac.jp/WIN/man.ja/winformat.html

win file
├1秒目
│├─ブロックサイズ(4B)
│└─秒ブロック(可変長)
│    ├─秒ヘッダー(6B)
│    ├─第1チャネルブロック(1秒分)
│    │  ├─チャネルヘッダー(4B)
│    │  │  ├─チャネル番号 (2B)
│    │  │  ├─サンプルサイズ情報(0.5B=4bit)
│    │  │  └─サンプリングレート(1.5B=12bit)
│    │  └─データブロック 1チャネル・1秒分(可変長)
│    │       ├─先頭サンプル(4B)
│    │       └─差分(または生値) x (サンプリングレート-1)個
│    ├─・・・・
│    └─最終チャネルブロック(1秒分)
├2秒目
├・・・・
└最終秒


●ディスク/テープ上の win フォーマット
[ ブロックサイズ(4B) | 秒ブロック(可変長) ]
 ブロックサイズ(4B) | 秒ブロック(可変長) ]
     ... (秒数分だけ繰り返し) ...

●ブロックサイズ(4Byte)
ex.
1バイト目: 0x00
2バイト目: 0x00
3バイト目: 0x0B
4バイト目: 0xD4

big-endian として無符号整数に変換
val = int.from_bytes(b'\x00\x00\x0b\xd4', byteorder='big')
0x00000BD4 (16進数) = 3028 (10進数) 

0BD4 = 11 × 16^2 + 13 × 16^1 + 4 × 16^0
= 11 × 256 + 13 × 16 + 4 × 1
= 2816 + 208 + 4
= 3028
(3028-4)Byteが秒ブロック長

●秒ブロック
[ 秒ヘッダー(6B)| 第1チャネルブロック(1秒分) | ... | 最終チャネルブロック(1秒分) ]

●秒ヘッダー(6Byte)のBCD(Binary Coded Decimal)形式
ex.
項目 バイト数 BCD格納
1B 0x20 → 「20」 (2020年)
1B 0x10 → 「10」
1B 0x31 → 「31」
1B 0x13 → 「13」
1B 0x59 → 「59」
1B 0x08 → 「08」

●チャネルブロック(1秒分)
[ チャネルヘッダー(4B) | データブロック 1チャネル・1秒分(可変長) ]

●チャンネルヘッダー
[ チャネル番号 (2B) | サンプルサイズ情報(0.5B=4bit) | サンプリングレート(Hz)(1.5B=12bit)]

サンプルサイズ情報 サンプルサイズ(B) 差分or生値
0 0.5 差分値
1 1 差分値
2 2 差分値
3 3 差分値
4 4 差分値
5 4 生値

sample_size_info = (last2 >> 12) & 0x0F  # 上位4bit
sampling_rate    =  last2        & 0x0FFF # 下位12bit

(last2 >> 12) & 0x0F
まず last2 を右に12bitシフトして、最上位4bitを右端へ持ってくる。
& 0x0F で、その4ビットだけを取り出す (残りは 0)。
16進数:0x0F、10進数: 15、2進数: 0000 1111

last2 & 0x0FFF
0x0FFF は下位12ビットが1、それより上位4bitが0のパターン (16進定数)。
これで、last2 の下位12bitだけを取り出す。

●データブロック
[ 先頭サンプル(4B) | 差分(または生値) x (サンプリングレート-1)個 ]
すべて2の補数表示。
int.from_bytes(b, 'big', signed=True) とすることで、バイト列 b は「ビッグエンディアンの符号付き2の補数値」として解釈され、Python の整数 (int) に変換される。


0 件のコメント:

コメントを投稿