teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

エンディアン変換の補足を追加

2017/05/15 23:44

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -22,4 +22,37 @@
22
22
  wav.setsampwidth(2) # 16bit
23
23
  wav.setframerate(16000) # 16k
24
24
  wav.writeframes(data)
25
- ```
25
+ ```
26
+
27
+ ---
28
+
29
+ #### エンディアン変換の補足
30
+
31
+ 行っていることは
32
+ 「バイト配列(バイナリデータ)」→「Int型のリスト(実データ)」→「バイト配列」
33
+ です。
34
+
35
+ 順番に説明しますと、
36
+
37
+ まず第1ステップとして ``struct.unpack()`` にてバイナリデータを実データに変換します。
38
+ その際にどのようなフォーマットで変換するかは第一引数にて指定します。
39
+ 今回の場合は
40
+ - ビックエンディアン(__'>'__)
41
+ - 1つデータは2Byte(__'h'__)
42
+
43
+ なので ``">##h"`` としております。(ここで **##**には変換するデータ数が入りますので、``format()`` を使用して、もとのバイナリ長の1/2の値を入れております。)
44
+
45
+ > ここで変換されたデータは実データとなりますので、信号処理や波形表示などを行う場合はこの**lst** を使うことができます。(一般的には **lst**はLR交互のデータなので、更に ``l,r=lst[0::2],lst[1::2]`` などとしてLRを分離して使用することになります。)
46
+
47
+ で、次のステップとして ``struct.pack()`` にて再度、Int配列をバイナリデータに変換しております。
48
+ ここも同様にフォーマット指定が必要な為、
49
+ - リトルエンディアン(__'<'__ :省略可能)
50
+ - 1つデータは2Byte(__'h'__)
51
+
52
+ の ``"##h"`` を指定しております。(**##**には変換するデータ数を入れる必要がありますので、``format()`` を使用して、実データのサイズを入れております。)
53
+
54
+ structパッケージの詳細に関しては、公式ドキュメントを見てください。
55
+
56
+ [https://docs.python.jp/3/library/struct.html
57
+ ](https://docs.python.jp/3/library/struct.html)
58
+ 以上です。