如何通过代码限制/剪辑音频音量?

How do I cap / clip audio volume via code?

我正在处理一个显示突然尖峰的音频文件:

当我尝试规范化音频文件时,音频程序看到这个尖峰,注意到它处于 0 dB 并且不会再规范化音频。

为了解决这个问题,我应用了一个限制为 -3 dB 的限制器。我用过 Steinberg Wavelab 和 Audacity Hard Limiter。相反,它们都降低了整个音量。

两者都没有消除这个峰值。

编辑:我发现 Audacity 中的“Hard Clip”可以满足我的需要,但现在我仍然想完成我自己的方法。

所以我在想它们可能无法正常工作。

然后我尝试在 VB6 中编写自己的限制器,以便完全控制正在发生的事情。

为此,我正在加载 wav 文件的音频数据,如下所示:

(我把流程精简了很多)

Dim nSamples() As Integer
ReDim nSamples(0 To (lCountSamples - 1))

Get #iFile, , nSamples

我现在在“nSamples”中有音频数据。

    Dim i&
    For i = 1 To UBound(nSamples)
    
        Dim dblAmplitude As Double
        dblAmplitude = nSamples(i) / 32767

        Dim db As Double
        db = 20 * Log10(dblAmplitude)

        If db > -0.3 Then
            nSamples(i)=0 'how would I lower the volume here instead of just setting it to 0???
        End If

    Next

我不确定如何根据样本数据计算 dB 以对其进行剪辑以及如何将其剪辑到 -3dB。

我现在只是简单地尝试将裁剪值设置为“0”。

然而,这里发生了一些奇怪的事情:音频的下半部分不见了:

我预计将值设置为 0 会使音频静音,但在我的情况下,较低的 wav 形式消失了。

我的方法有什么问题?

谢谢!

正在根据音频样本计算 dB isn't that simple。 听起来你想要做的是找到一个合适的阈值,然后用类似的东西剪辑音频:

If Abs(nSamples(i)) > threshold Then
  nSamples(i) = threshold * Sgn(nSamples(i))

如果所有音频剪辑的阈值都相同,您可以将阈值设置为某个固定值。否则,对样本进行排序并搜索靠近顶部和底部的点之间的较大间隙来找到您的阈值可能会更准确。