【问题标题】:How to do audio expansion/normalization (emphasise difference between high and low)如何进行音频扩展/归一化(强调高低之间的差异)
【发布时间】:2018-11-28 21:01:55
【问题描述】:

我正在努力寻找方法来强调音频中高点和低点之间的差异。我似乎找不到有关如何执行此操作的文档-也许可以使用 ffmpeg 完成。真的很感谢那些对信号处理有更多了解的人的一些指示。

【问题讨论】:

  • 您是否正在寻找有关如何编写扩展器算法的建议或库来执行此操作?
  • 如果存在具有这种功能的库,我很想知道它(我必须为许多文件做这件事,所以不是手工)。否则,我想要一些关于如何实现这种算法的指示。
  • 一篇讨论它的论文或文章也可以

标签: audio ffmpeg


【解决方案1】:

从根本上说,expandercompressor *相反;您可能会更幸运地找到有关如何实现这些的文档。它们也与噪声门有很多共同点。

扩展器

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

一个基本的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 风格的压缩相混淆。压缩器压缩动态范围。

【讨论】:

  • 哇,这非常有帮助,谢谢。很好的概述让我开始!
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 2021-11-23
  • 2020-11-09
  • 1970-01-01
  • 2020-07-24
  • 2013-03-19
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多