コンセプトとしては、
・簡単に波形が編集できる
・内部演算は32bitfloatで行う
この辺りである。
内部演算を32bitfloatで行うという事は、PCMデータはイチイチfloatに変換する必要があり、
そのやり方があやふやなまま運用してきていた。
ココにきて、そろそろリリースかという雰囲気になってきたので、あやふやなままではアカン
と思い、しっかりちゃんとやろうという気分で取り組んでみた。
ポイントとして表を作ろう
解像度 | 最小 | 無音 | 最大 |
---|---|---|---|
8bit | 0 (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 件のコメント:
コメントを投稿