libsox を使用して wav ファイルを次のように変換すると、出力が歪むのはなぜですか。
&in->encoding.encoding = SOX_ENCODING_UNSIGNED;
&in->encoding.bits_per_sample = 8;
上記のコードを使用していますか?
入力ファイルには、bits_per_sample = 16 があります。
SOX に 16 ビットのサンプル WAV ファイルを 8 ビットのサンプル ファイルとして読み込むように指示するということですか? SOX について何も知らないので、各 16 ビット サンプルを 2 つの 8 ビット サンプルとして読み取ることを期待します... 上位バイトと下位バイトは次のようになります: ...HLHLHLHLHL...
簡単にするために、上位バイト サンプルを「A」サンプルと呼びます。「A」サンプルは、精度の高い下位バイトが切り捨てられているため、ダイナミック レンジの少ない元のサウンドを運びます。
下位バイト サンプルを「B サンプル」と呼びます。これらはおおよそランダムで、ノイズをエンコードします。
その結果、元のサウンドである「A」サンプルの周波数が半分にシフトされます。これは、すべての「A」サンプルの間に「B」サンプルがあり、「A」サンプルのレートが半分になるためです。「B」サンプルは、元のサウンドにノイズを追加します。元のサウンドを半分だけシフトダウンし、ノイズを加えます。
それはあなたが聞いていることですか?
Edit Guest は、目標は WAV を 8 ビット オーディオにダウンコンバートすることであるとコメントしました。SoXのマンページを読むと、sox_read() の結果として、SoX はメモリ内で常に 32 ビット オーディオを使用するようです。フォーマットを渡すと、そのフォーマットからの読み取りのみが試行されます。
メモリ内でダウンコンバートするには、sox.h の SOX_SAMPLE_TO_SIGNED_8BIT または SOX_SAMPLE_TO_UNSIGNED_8BIT を使用します。
sox_format_t ft = sox_open_read("/file/blah.wav", NULL, NULL);
if( ft ) {
sox_ssample_t buffer[100];
sox_size_t amt = sox_read(ft, buffer, sizeof(buffer));
char 8bitsample = SOX_SAMPLE_TO_SIGNED_8BIT(buffer[0], ft->clips);
}
ダウンコンバートされたファイルを出力するには、読み取り時ではなく書き込み時に 8 ビット形式を使用します。