2

SInt16バッファに保存されているモノラル16ビットPCMオーディオサンプルに署名しましたが、UInt8バッファに保存されている署名されていないモノラル8ビットPCMサンプルに変換しようとしています。私は次の基本的に機能するコードを書きました:

for (int i=0; i < numSamples; i++) { 
    SInt8 tempSigned8Bit = signed16BitBuffer[i]/127; // In 2 passes
    unsigned8BitBuffer[i] = tempSigned8Bit + 127;    // for clarity
}

ただし、結果として得られるオーディオの最大振幅でクリッピングが聞こえるか、少なくともそれが歪みが発生している場所の印象です。これは再量子化のアーティファクトですか、それとも同様の変換についてこの質問で説明されているように、符号変換なしで何らかのクランプを含める必要がありますか?

16ビットpcmを8ビットに変換します

ビット単位の最適化は不要ですが、私は確かにそれらにノーとは言いません。

4

1 に答える 1

8

大きな値の場合、127ではなく256で除算する必要があるため、これは失敗します。また、オフセットは127ではなく128である必要があります。

for (int i = 0; i < numSamples; i++) { 
    SInt8 tempSigned8Bit = signed16BitBuffer[i] / 256;
    unsigned8BitBuffer[i] = tempSigned8Bit + 128;
}

+/-フルスケールとゼロの変換は次のようになります。

Signed    Divide    Add
16 bit    by 256    128
sample

 32767 ->  127 ->   255    ; Full scale +
     0 ->    0 ->   128    ; 0
-32768 -> -128 ->     0    ; Full scale -
于 2012-07-23T17:56:26.667 に答える