4

録音にゲインを適用したい (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];
                        }

しかし、まだ奇妙な音が聞こえます (ノイズ + 古いトランシーバーのように途切れます)。

どんな助けでも大歓迎です、

ありがとう。

4

3 に答える 3