質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3743閲覧

wavファイル(4ch,24bit)の波形データの可視化がしたい その2

mas_555

総合スコア13

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/14 13:16

編集2020/01/14 13:18

実現したいこと

音波測定機器から吐き出した.wav形式の24bitの波形データをpythonで開き、波形のグラフを得たいです。
測定機に付属の波形編集ソフトでも波形は確認できますが、データ数が多いので、pythonでグラフ生成効率化を試みています。
waveデータを開くために、下記リンクを参考にしました。
参照
また、過去に以下のような質問をして、回答をいただいております。
過去の質問

困っていること

pythonでunpackしたwaveデータの値と、測定器付属の波形編集ソフトで確認できるwaveデータの値に差異があります。
センサーの感度や、A/Dコンバータの変換係数などは、取扱説明書から把握できており、
あとはpythonのwave値にそれらの係数を乗算するのみなのですが、pythonのwave値が付属ソフトの値とオーダーが2つくらい異なり、
正しい値になっていません。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import wave 4 5from struct import unpack 6 7fname = "../wav/souvenir.wav" 8fp = wave.open(fname, "r") 9 10nframe = fp.getnframes() 11nchan = fp.getnchannels() 12nbyte = fp.getsampwidth() 13fs = fp.getframerate() 14 15print("frame:{0}, " 16 "channel:{1}, " 17 "bytewidth:{2}, " 18 "fs:{3}".format(nframe, nchan, nbyte, fs)) 19 20buf = fp.readframes(nframe * nchan) 21fp.close() 22 23read_sec = 40 24read_sample = read_sec * nchan * fs 25print("read {0} second (= {1} frame)...".format(read_sec, 26 read_sample)) 27 28# 最下位bitに0を詰めてintにunpackすることで 29# 24bitの値を32bit intとして値を取り出す 30# (<iはリトルエンディアンのint値を仮定) 31unpacked_buf = [unpack("<i", 32 bytearray([0]) + buf[nbyte * i:nbyte * (i + 1)])[0] 33 for i in range(read_sample)] 34 35ndarr_buf = np.array(unpacked_buf) 36wav_1 = ndarr_buf[::4] 37wav_2 = ndarr_buf[1::4] 38wav_3 = ndarr_buf[2::4] 39wav_4 = ndarr_buf[3::4] #ここまでは理解できた。(前回答者の方々ありがとうございました)

試したこと・わからないこと

pythonの値は、付属波形編集ソフトの値の256倍である ということが、いろいろと検算するうちにわかりました。
256=2^8 であり、8bit という数字が関係しそうです。
上記のコードでは、24bitデータに0をくっつけて、32bitとしてunpackしています。
たぶんここが関係しているだろうということまでは予想しているのですが、256という数字が、数学的?にどういう理屈
で関係しているのかわかりません。
(32bit=32列の1と0の組み合わせだけど、そのうち8列は0を詰めただけだから、実質の表現する値は24bitのデータと同じなんじゃないの?とか
これを256で割ると正しい値になるものなの?などなど疑問が解決しません。)
正直何も考えずにpythonの値を256で割り算すれば欲しい値になるのですが、ここが理解できないとスッキリ次に進めそうにないので、
教えていただけると幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/01/14 14:17 編集

そもそも、WAVファイルのフォーマットがどういうものか調べてみようよ それがわかってない限り解決しませんぜ
mas_555

2020/01/15 13:26

waveファイルのフォーマットに関しては、説明書にデータ構造が記載してあったため、必要な情報を必要なchunkから抜き出し、説明書通りか一つずつ確認する ということを行いました。 過去の質問の解決には、もちろんwaveファイルデータ構造の理解が重要であると思いますが、本質問の解決のカギは、「2進数と10進数の関係性の理解」 にあり、waveファイルのフォーマットの理解 はそこまで直接的な解決ではないように思います。この考えは間違いでしょうか?
guest

回答1

0

ベストアンサー

雑な話をすると、下位8bitにゼロを詰めたということは8bit分左シフトしたようなものです。シフト演算するとずらしたbit数nに対して2^n倍になりますから、そうなるでしょう。

~~上位8bitを0にすればいいと思いますよ。~~←の方法は符合が反転する恐れがあるので問題があります(コメントのご指摘より)。

下位8bitにゼロを詰めてから256で割るのが一番簡単な(コードが書きやすい)処理方法になります。

投稿2020/01/14 13:21

編集2020/01/14 14:49
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magichan

2020/01/14 14:01 編集

上位8bitを0埋めすると符号が変わる可能性があるのでやめたほうが良いと思います。 単純に256で割る事をお勧めします。
hayataka2049

2020/01/14 14:03

ご指摘ありがとうございます。確かに……
mas_555

2020/01/15 13:15

シフト演算という言葉を調べ、検算してみて、なぜ256で割るといいのか、すっきりと理解できました。 http://kccn.konan-u.ac.jp/information/cs/cyber03/cy3_shc.htm 2進数、10進数などの理解ができていなかったため、非常に勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問