如何规范化C#中的wav文件卷?

如何规范化C#中的wav文件卷?,c#,audio,normalization,wav,naudio,C#,Audio,Normalization,Wav,Naudio,我正在用NAudio打开一个wav文件。在我使用SimpleCompressor类之后,我还必须将文件的音量标准化为0db,但我不知道如何做到这一点。目前,我有以下几点: string strCompressedFile = ""; byte[] WaveData = new byte[audio.Length]; SimpleCompressorStream Compressor = new SimpleCompressorStream(audio); Compressor.Enable

我正在用NAudio打开一个wav文件。在我使用SimpleCompressor类之后,我还必须将文件的音量标准化为0db,但我不知道如何做到这一点。目前,我有以下几点:

string strCompressedFile = "";

byte[] WaveData = new byte[audio.Length];


SimpleCompressorStream Compressor = new SimpleCompressorStream(audio);
Compressor.Enabled = true;

if (Compressor.Read(WaveData, 0, WaveData.Length) > 0)
{
    //doing the normalizing now
}

如何从新的字节数组WaveData获取卷以及如何更改卷?在WaveData中,是整个wav文件,包括文件头

您完全可以更改单个采样值,使其符合最大级别:

string strCompressedFile = "";

byte[] WaveData = new byte[audio.Length];

SimpleCompressorStream Compressor = new SimpleCompressorStream(audio);
Compressor.Enabled = true;

byte maxLevel = 20;

if (Compressor.Read(WaveData, 0, WaveData.Length) > 0)
{
    for (int i = 0; i < audio.Length; i++)
    {
        if (WaveData[i] > maxLevel)
        {
            WaveData[i] = maxLevel;
        }
    }
}
string strCompressedFile=“”;
字节[]WaveData=新字节[audio.Length];
SimpleCompressorStream压缩器=新的SimpleCompressorStream(音频);
Compressor.Enabled=true;
字节maxLevel=20;
if(压缩器读取(WaveData,0,WaveData.Length)>0)
{
对于(int i=0;imaxLevel)
{
WaveData[i]=最大电平;
}
}
}

我添加了一个循环,循环遍历所有样本,如果它的值高于
maxLevel
,我们将其设置为
maxLevel

,谢谢你的链接,但我仍然不知道如何实现它。我不能使用任何额外的工具,我必须在我的软件中实现它。我不太熟悉wav文件,但我可以将每个字节设置为相同的数字吗?头不是有一些字节吗?在您的示例中,从字节0开始。我想知道的另一件事是:每个字节的值就是卷吗?我以为是声音(如录音)本身。。。我认为为了规范化,我必须得到最大音量,然后计算出最大音量,然后对所有其他音量使用相同的系数。但我不知道如何获得体积和最大可能值采样是模拟信号的数字表示,因此每个采样值等于给定时间内的模拟信号振幅。如果您将每个字节设置为相同的数字,它将表示直线模拟信号,这基本上是静默的。取而代之的是,你需要以某种方式调整选择。为了录制声音,我找到了一个代码段,它允许我实现一个音量计作为进度条。但老实说,我并不完全理解这段代码:double sum=0;对于(var i=0;i