実現したいこと
音波測定機器から吐き出した.wav形式の波形データをpythonで開き、波形のグラフを得たいです。
やったこと
下記リンク「waveモジュールで24bitの音声ファイルを読みたい」項を参考にしながら、ファイルを開いてデータの形式を確認するところまではいきました。
参考リンク
測定データの形式
・チャンネル数:4ch(4つのセンサーから波形データを同時に測定している)
・サンプル幅:3(つまり24bitデータ?)
・フレームレート:51200
・データ数:任意
教えていただきたいこと
4ch 24bitのデータから、4つの波形データのグラフを得たいのですが、データの構造がよくわからなく、下記の部分で手が止まっております。
■ いろいろ調べてみましたが下記の文章がよく理解できませんでした。おそらくバイナリファイル?機械語?のような話を理解していた方がよいのでしょうか?素人にもわかるような説明もしくは参考文献などご教示いただけますでしょうか。(「特に3byteずつ読み込む 0を詰める」の意味がわからない)
24bit音源の場合はfrombufferで24bitが指定できないため自力で読む必要があります。ここでは下記のコードのようにstructモジュールのunpackを用いて3byteずつ読み込みつつ、0を詰めてint32としてunpackすることで24bit音源の読み込みを実現しています。
■ その他コード中のわからなかった部分をコメントで記述しました。質問要旨がまとまっておらず申し訳ありませんが、
教えていただけますと幸いです。
python
1buf = fp.readframes(nframe * nchan) # ←なぜチャンネル数をかけているのでしょうか? 2 fp.close() 3 4 read_sec = 40 5 read_sample = read_sec * nchan * fs # ←なぜチャンネル数をかけているのでしょうか? 6 print("read {0} second (= {1} frame)...".format(read_sec, 7 read_sample)) 8 unpacked_buf = [unpack("<i", 9 bytearray([0]) + buf[nbyte * i:nbyte * (i + 1)])[0] 10 for i in range(read_sample)] 11 12 # ndarray化 13 ndarr_buf = np.array(unpacked_buf) 14 15 # -1.0〜1.0に正規化 ←正規化とは何のためにするのでしょうか? 16 float_buf = np.where(ndarr_buf > 0, 17 ndarr_buf / (2.0 ** 31 - 1), 18 ndarr_buf / (2.0 ** 31)) 19 20 # interleaveを解く(ステレオ音源の場合) 21 wav_l = float_buf[::2] # ステレオ(2ch)なので2つデータを取得しているのは理解しました。しかしなぜ一つのデータからステップでスライスしているのでしょうか? 22 wav_r = float_buf[1::2] # どのようなデータ構造をしているか、4chの場合はどのようにすべきか教えていただけますでしょうか 23 time = np.arange(np.alen(wav_l)) / fs
質問の要旨がまとまっておらず申し訳ありません。
素人質問で申し訳ありませんが、教えていただけると嬉しいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/10 09:27 編集
2020/01/10 10:06
2020/01/10 12:55