音楽の再生には何bit必要?

ESP32のDACに音を出力する場合、8bitというのはどんなもんなんだろう。 bit数が足りないために音声が、まともに聞こえないというのでは困るなぁと思い、実験してみた。

pythonのwavライブラリを使うとwavファイルの操作ができる。これを使って、wavファイルのデータを指定したbit数まで落とすプログラムを作成した。処理に結構時間が、かかるので10秒だけ出力する。

結果、私のPCの再生環境では8bitと12bitの聞き分けができないことが判明。8bitからbit数を落として行ってもホワイトノイズが増えていくだけで、あまり問題無く聞ける。1bitだとノイズがかなり大きいが、それでも曲は判別可能。予想外の結果だった。

変換した結果を以下に示す。元の曲は魔王魂さんのフリー歌もの素材「桜日和」

1bitの音源:(音量注意)


2bit:

3bit:

4bit:

5bit:

6bit:

8bit:

12bit:

変換プログラムは、こんな感じ

#!/usr/bin/python3
import sys,wave,struct
usage = "Usage:%s input.wav output.wav n" % sys.argv[0]
if len(sys.argv) != 4 :
    print(usage)
    sys.exit(1)
in_file, out_file, bits_str = sys.argv[1:]

w = wave.open(in_file)
dst = wave.open(out_file,'wb')
bits_count = int(bits_str)

mask = 0
for i in range(bits_count):
    mask |= 0x8000 >> i

framerate = w.getframerate()
dst.setnchannels(2)
dst.setsampwidth(2)
dst.setframerate(framerate)

n = min(w.getnframes(), framerate * 10)
data = w.readframes(n)

for i in range(n):
    v0,v1 = struct.unpack_from('HH',data,i*4)
    dst.writeframes(struct.pack('HH', v0 & mask, v1 & mask))
dst.close()
w.close()

Leave a Reply

メールアドレスが公開されることはありません。