如何进行音频扩展/归一化(强调高低之间的差异)

时间:2018-11-12 09:53:17

标签: audio ffmpeg

我试图找到一种方法来强调音频中高点和低点之间的差异。我似乎找不到有关如何执行此操作的文档-也许可以使用ffmpeg完成。非常感谢来自对信号处理了解更多的人的一些指导。

1 个答案:

答案 0 :(得分:1)

从根本上说,扩展器压缩器 *相反;您可能会有更多的运气来查找有关如何实现这些功能的文档。它们与噪声门也有很多共同之处。

扩展器

基本方法是实现信封跟随器,并使用包络的值缩放音频源。包络跟随器尝试跟踪音频信号的幅度。

基本的pythonic伪代码框架看起来像这样:

envelope_follower e          # some envelope follower, we'll replace this

for each sample x:
   amplitude = e.get(x)      # use the envelope follower to estimate the amplitude of e
   x = expand(x, amplitude)  # apply some expansion operation

在最基本的情况下,expand操作如下所示(假设您的样本在-1.0到1.0之间):

def expand(x, amplitude):
    return x * amplitude

还有更复杂的方法,例如钳位和缩放幅度,以使其永远不会降到0.5以下,或者在乘法之前对幅度应用非线性函数。

# just an example
def expand(x, amplitude):
    return x * clamp(1.2 * amplitude - 0.2 * (amplitude * amplitude), 0.3, 1.0)

信封关注者

压缩器/扩展器的质量几乎完全取决于实现包络跟随器的方式。 这不是一门精确的科学,因为一个非常准确的信封跟随者在某些情况下可能会引起一些令人讨厌的可听见的影响-需要权衡取舍。

与所有这些事情一样,有很多方法!这是一对:

滤波整流器

低通滤波整流器是最简单的方法之一-特别是如果您已经具有信号处理模块库的话。

它是这样的:

class envelope_follower:
    lowpassfilter filter;

    def get(x):
        return filter.process( abs(x) )

这里得到的控制基本上与滤波器设计和低通截止频率有关。使用简单的漏气蓄能器过滤器将使您受益匪浅。

攻击释放关注者

人们通常希望对扩展器进行更多控制,有时很难考虑滤波后的整流器的实际效果-调整一个参数可能会改变其许多行为。

对于现实世界的信号,压缩器/扩展器通常非常需要快速响应(例如,对钢琴或鼓的撞击),并且释放缓慢(因此,钢琴音符的尾部不会突然被切掉)关闭)

Attack-Release Follower通过指定多个参数来提供更精确的控制:

  • 两个阈值
    • 一个阈值,在该阈值之上,声音应该变大
    • 一个阈值,在该阈值以下应使声音更安静(不一定是相同的阈值,但可以是!)
  • 两个时间段:
    • 超过第一个阈值时达到完整响度需要多长时间(这是 Attack 参数)
    • 达到安静状态(发布)所需的时间

实现其中一种的基本方法是:

class envelope_follower:
    # Parameters required. These are just made up
    attack_threshold = 0.6
    release_threshold = 0.3
    attack_time = 10       # in samples
    release_time = 1000    # in samples

    amp = 0.0

    def get(x):
        # we still work with the absolute value.
        # You might use another measure of amplitude here like RMS
        # or even the filtered rectifier above
        a = abs(x)

        if x > attack_threshold:
          amp += (1.0 / attack_time)
        else if x < release_threshold:
          amp -= (1.0 / release_time)

        amp = clamp(amp, 0.0, 1.0)

        return amp

这种跟随器的一个常见扩展是添加一个 Hold 参数,该参数指定扩展器应完全打开的最短时间长度。这样可以避免包络在低频信号上产生可听见的三角波或锯齿波。

一种更复杂的方法是执行完整的Attack-Decay-Sustain-Release,使您可以控制瞬变,通常用作鼓处理。

变得疯狂

从这里,您可以:

  • 创建更流畅的expand函数

  • 将上述内容调整为压缩扩展器-一种组合设备,可以使低声静音,但也可以使声音过大;

  • 将信号分成多个频段,然后分别压缩/扩展每个频段。通常这样做是在音乐制作过程中获得真正的面部最大振幅;

  • 根据要扩展的声音的频谱内容调整起音/保持/释放。对于高频信号,很短的起音/释放时间就可以了,但是对于低频信号来说,听起来很糟糕;

  • 为超出阈值的声音添加轻微的饱和失真;即使信号仍然具有相同的最大幅度,这也可以使声音变大。理想情况下,您需要一个完全不影响阈值以下信号的饱和器。

祝你好运!


*请勿与MP3样式的压缩混淆。压缩器压缩动态范围。