0

libsox を使用して wav ファイルを次のように変換すると、出力が歪むのはなぜですか。

&in->encoding.encoding = SOX_ENCODING_UNSIGNED;
&in->encoding.bits_per_sample = 8;

上記のコードを使用していますか?

入力ファイルには、bits_per_sample = 16 があります。

4

1 に答える 1

0

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 ビット形式を使用します。

于 2009-02-06T05:55:58.923 に答える