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

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

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

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

1bitの音源:(音量注意)
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b1.wav"][/audio]

2bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b2.wav"][/audio]

3bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b3.wav"][/audio]

4bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b4.wav"][/audio]

5bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b5.wav"][/audio]

6bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b6.wav"][/audio]

8bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b8.wav"][/audio]

12bit:
[audio wav="http://www.narimatsu.net/blog/wp-content/uploads/2017/05/sakura_biyori_b12.wav"]

変換プログラムは、こんな感じ
[python]
#!/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()
[/python]