如何增加原始音频字节的音量/幅度

时间:2016-04-01 12:09:46

标签: c# .net audio

我正在处理电话原始电话声音和录音,我想在.Net C#项目中将它们规范化到一定的音量级别。

声音是原始音频字节的集合(单声道未经检验的16位带符号PCM音频16000Hz)。

音频被分成3200字节== 100ms的块。

有关如何增加音量/幅度以使声音响亮的任何建议吗?

如果我需要添加常量或乘法值,或者我需要对每1,2,3 ....字节进行一次,我还没有线索?也许已经有一个开源解决方案呢?

1 个答案:

答案 0 :(得分:1)

回答我自己的问题(对于其他人)。

解决方法是将每个样本(当16位PCM为2个字节时)乘以常数值。

避免溢出\大幅增加你可以通过寻找最高样本值来计算可以使用的最高常数值,并计算乘法因子以使其达到最高样本值,在16位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;
    }