録音にゲインを適用したい (PCM 16bit)。このために、次のコードがあります。
for (int i=0; i<buffer.length/2; i++)
{ // 16bit sample size
short curSample = getShort(buffer[i*2], buffer[i*2+1]);
if(rGain != 1){
//apply gain
curSample *= rGain;
//convert back from short sample that was "gained" to byte data
byte[] a = getByteFromShort(curSample);
buffer[i*2] = a[0];
buffer[i*2 + 1] = a[1];
}
このように適用すると (各サンプルに端数を掛ける)、再生時に途切れます (古いトランシーバーのように聞こえます)。各サンプルでゲイン係数を変える公式はありますか? サンプルの範囲にはいくつかの maxValue と minValue があると仮定し ([-32768, +32767] と推測します)、これらの値を数式で使用すると、現在のサンプルに適用する可変ゲイン係数を取得できます。
//編集:追加
if (curSample>32767) {curSample=32767;}
if (curSample<-32768) {curSample=-32768;}
フルメソッド
aRecorder.read(buffer, 0, buffer.length);
for (int i=0; i<buffer.length/2; i++)
{ // 16bit sample size
short curSample = getShort(buffer[i*2], buffer[i*2+1]);
if(rGain != 1){
//apply gain
curSample *= rGain;
if (curSample>32767) {curSample=32767;}
if (curSample<-32768) {curSample=-32768;}
//convert back from short sample that was "gained" to byte data
byte[] a = getByteFromShort(curSample);
buffer[i*2] = a[0];
buffer[i*2 + 1] = a[1];
}
しかし、まだ奇妙な音が聞こえます (ノイズ + 古いトランシーバーのように途切れます)。
どんな助けでも大歓迎です、
ありがとう。