2016-04-01 14 views
3

私は電話の生の電話音と録音で作業しています。これらをC#プロジェクトの特定の音量に正規化したいとします。生のオーディオバイトの音量/振幅を上げる方法

このサウンドは、生のオーディオバイト(モノラルのアンヘッダー付き16ビット符号付きPCMオーディオ16000Hz)のコレクションです。

音声は3200バイト== 100msのブロックに分割されます。

音量が大きくなるように音量/振幅を上げる方法を教えてください。

定数または乗算値を追加する必要がある場合、または1,2,3 ...バイトごとに行う必要がある場合には手がかりがありませんか?そして、これには既にオープンソースのソリューションがありますか?

+0

すべての2つのバイトは符号付き16ビット値である:

ここlitle例です。一定の定数を掛けてオーバーフローを避けてください。 –

+0

@RomanR。コメントをいただきありがとうございます。 2バイトをInt16に変換して10倍して2バイトに変換すると、サウンドは聞こえるが実際には歪んだ。 –

+0

私はあなたが10人のオーバーフローと乗算を気にする必要がありますあなたが多くを取得する可能性があります書いた。 1.1を試してみてください。 @ RomanR。 –

答えて

1

私自身の質問に答える(他の人には)。

解決策は、すべてのサンプル(16ビットPCMが2バイトの場合)に一定の値を掛けることです。

極端な値を計算すると、最も高いサンプル値を求め、可能な限り最高のサンプル値を得るための乗算係数を計算することができます。32ビットPCMの場合は32676か何か。

public byte[] IncreaseDecibel(byte[] audioBuffer, float multiplier) 
    { 
     // Max range -32768 and 32767 
     var highestValue = GetHighestAbsoluteSample(audioBuffer); 
     var highestPosibleMultiplier = (float)Int16.MaxValue/highestValue; // Int16.MaxValue = 32767 
     if (multiplier > highestPosibleMultiplier) 
     { 
      multiplier = highestPosibleMultiplier; 
     } 

     for (var i = 0; i < audioBuffer.Length; i = i + 2) 
     { 
      Int16 sample = BitConverter.ToInt16(audioBuffer, i); 
      sample *= (Int16)(sample * multiplier); 
      byte[] sampleBytes = GetLittleEndianBytesFromShort(sample); 
      audioBuffer[i] = sampleBytes[sampleBytes.Length-2]; 
      audioBuffer[i+1] = sampleBytes[sampleBytes.Length-1]; 
     } 

     return audioBuffer; 
    } 
関連する問題