質問
私はバッファー付ポータ16ビット値に格納されたdoubleとして)いと思うようにな量子化への8bit(0-255値)。
による Wikipedia を処理することはできない。
- Normalize16ビットの値です。I.。見に分割します。
- Q(x)の算式によりM=8です。
いう場合、C機能を持っているところでこの量子化、なんだろうけど、日本人のC実装かったのですか?
多くの愛 ルイーズ
解決
値d
間隔[0.0, max]
であると仮定すると:
unsigned char quantize(double d, double max)
{
return (unsigned char)((d / max) * 255.0);
}
私はあなたが何を意味するかわからないんだけど、「16ビット値;」倍精度値は、IEEE-754を使用して任意のシステム上で64ビットです。あなたが別の数値型の値を持っている場合は、プロセスが効果的に同じである。
他のヒント
あなたの入力は、あなたの出力は、8ビットPCMデータであり、あなたは、中間値を兼ねるを使用している。、16のPCMデータである波形オーディオ処理、などこの音
はしかし、8ビットPCM波形データがちょうど量子化されていない、表現は、過剰128表記で符号なしの値です。 (指数は、浮動小数点数に格納されている方法など)
量子化するだけでなく、拡大縮小されるだろうだけではなく、最初の最大値を求めます。だから、擬似コードで
double dMax = max_of_all_values(); //
...
foreach (dValue in array_of_doubles)
{
signed char bValue = (signed char)((dValue / dMax)*127.0);
}
あなたがより高い精度が必要な場合は、あなたはラウンドではなく切り捨てることができますが、オーディオ処理では、それは切り捨て順序をランダム化、あるいは、本質的に署名した文字に倍から切り捨ての一環として、フィルタリングアルゴリズムを実行することによって、それを形作るために、一般的に良いでしょう。
注:出力は8ビットのPCMデータである場合にsigned char型が正しいのではなく、質問は特にそれを要求していないので、私はそれを残していること
。編集:これはピクセルデータとして使用する場合は、符号なしの値を求めています。 Iは、(正規化されたデータからdB値は、実際に、全て陰性でなければならない)入力が符号なしの場合にジェームズは既に符号なしの値の正しい答えを与えた参照
これは、エンコーディングは「(ダブルスとして格納されている)の正の16ビット値の」本当の意味がありませんので、何であるか、あなたの質問からクリアされていません。彼らはどちらか16ビットであるか、彼らは二重のある、彼らは両方をすることはできません。
しかし、この16が1.0に正規化符号なしデータビットであると仮定すると(値が0.0の範囲に<= S <= 1.0)、すべてあなたが値整数8ビットにそれらを展開するために必要255で各サンプルを乗算することである。
unsigned char s8 = s * 255 ;
の範囲が0.0ない場合<= S <= 1.0が、0.0 <= S <= maxの次に
unsigned char s8 = s / max * 255 ;
いずれかの方法で、あなた自身を書くかもしれない1以外の「量子化」機能はありません。 (データは、おそらく圧伸された場合であるがそれほど単純ではない - すなわちμレイ又は例えば符号化されたA-法則)が、必要では間違いなく単純な算術式できなくなり、変換