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になってしまう。
これは意図してこうしているのだろうか?。