2019年7月11日木曜日

整数PCMと浮動小数点floatの変換ナド

現在作成使用中の波形編集ソフト、wavcalc。
コンセプトとしては、
・簡単に波形が編集できる
・内部演算は32bitfloatで行う
この辺りである。

内部演算を32bitfloatで行うという事は、PCMデータはイチイチfloatに変換する必要があり、
そのやり方があやふやなまま運用してきていた。

ココにきて、そろそろリリースかという雰囲気になってきたので、あやふやなままではアカン
と思い、しっかりちゃんとやろうという気分で取り組んでみた。

ポイントとして表を作ろう
解像度最小無音最大
8bit0
(0x00)
128
(0x80)
255
(0xff)
16bit-32768
(0x8000)
0
(0x0000)
32767
(0x7ffff)
24bit-8388608
(0x800000)
0
(0x000000)
8388607
(0x7fffff)
32bit-2147483648
(0x80000000)
0
(0x00000000)
2147483647
(0x7fffffff)

ここで今まで適当だったのが、負の段階と正の段階はが各1ずつ違うという所。
16bitを例に取ると、負は32768段階あるけど、正は32767段階なのだ。

これをそのままfloatに変換すると、floatは-1.0~0~1.0なので、おかしな事になる。

今までは0.5足して32767.5で割るというやり方がネットにあったのでそれでやっていたが、
0が0にならない、というモヤモヤした状態で変換していた。
これは音にはそんなに影響無いけど、なんかキモチワルイ。

そこで実験。市販の波形編集ソフトを起動して、どうやって変換しているのか調べてみた。

そしたらなんと、驚愕の結果が!!

wavelabとsoundforge、両方とも、32768段階で正も負も計算していた!!!!

という事は、例えば16bitだったら、32768段階なので、最小単位は0.0000305175781となり、
負の最小は-1.0、正の最大は0.999969482という事になる。

これすげーショックな結果!!

でも、よく考えると、音割れするよりはそっちの方が良いのかしら・・と思いなおしたり。
それでも普通に普及している整数PCMって、イビツな状態だったのよね・・。
何だか納得いかないわ・・

0 件のコメント:

コメントを投稿