mpg123 その2

少し出張に行ってました。
久しぶりにいい出張だった。また行ってもいいかな?。


mpg123では固定小数点の時に小数部15bitで計算していました。
これは最終的な出力が16bitで、さらにオーバーフロー検出用に1bit必要なので

32bit-16bit-1bit=15bit

で、小数部15bitみたいです。
しかし16bit出力なのにcos等1以下の数を扱う事が多く、有効精度が足りないようです。
結局少数点の桁数を場合によって変える事にしました。1以下の数値は小数部30bit、
他はだいたい小数部27bitで、decode.c内でdct後の合成処理?で小数部15bitに戻しました。


また、例のgainpow2は

for(i=-256;i<118+4;i++)
    gainpow2[i+256] = DOUBLE_TO_REAL(pow((double)2.0,-0.25 * (double) (i+210)));

指数部に-0.25とあるので、4つ毎に1/2になる事が解ります。最初の4つのみ計算しておき、残りは引数を4で割ってシフト数として扱う事で精度を確保しました。


若干気になるのが浮動小数点を使用時の出力時に16bitへの変換でshort型への変換をキャストで行っています。キャストでfloatをshortへ変換すると-1<x<1の範囲の数値が0になってしまう。
これは意図してこうしているのだろうか?。


LGPLなので変更した所はそのうち公開します。
やっぱり本家にメールしないとダメかな?。
英語のメール書くのか・・・。