我听说希尔伯特变换可用于计算信号的包络。这是如何运作的?这个“希尔伯特包络”与简单地对信号进行整流得到的包络有何不同?
我特别感兴趣的是找到一种方法来计算用于动态范围压缩的包络(即,自动“调低音频信号响亮部分的音量”)。
我听说希尔伯特变换可用于计算信号的包络。这是如何运作的?这个“希尔伯特包络”与简单地对信号进行整流得到的包络有何不同?
我特别感兴趣的是找到一种方法来计算用于动态范围压缩的包络(即,自动“调低音频信号响亮部分的音量”)。
希尔伯特变换用于计算“解析”信号。参见例如http://en.wikipedia.org/wiki/Analytic_signal。如果您的信号是正弦波或调制正弦波,则分析信号的幅度确实看起来像包络。然而,希尔伯特变换的计算并不简单。从技术上讲,它需要一个相当长的非因果 FIR 滤波器,因此它需要相当多的 MIPS、内存和延迟。
对于宽带信号,这实际上取决于您如何为特定应用定义“包络”。对于动态范围压缩的应用,您需要一个与随时间变化的响度感知密切相关的指标。希尔伯特变换不是正确的工具。
更好的选择是应用 A 加权滤波器(http://en.wikipedia.org/wiki/A-weighting),然后进行有损峰值或有损 RMS 检测器。随着时间的推移,这将与感知响度相当好相关,并且相对便宜。
您可以使用 Hilbert 变换以下列方式计算包络。(我会把它写成 MATLAB 代码):
envelope = abs(hilbert(yourTimeDomainSignal));
我现在没有时间把数学写出来,(我稍后会尝试),但很简单,说你的信号是一个正弦波。正弦的希尔伯特变换是-余弦。(换句话说,希尔伯特变换总是会给你的信号偏移 -90 度相位 - 换句话说,它的正交)。
如果将信号(正弦波)与j
希尔伯特信号(-余弦波)相加,您将得到:
sin(wt) - j.*cos(wt)
这也恰好是 e^(j*(wt - pi/2))。
因此,当你取这个的绝对值时,你得到 1,这是你的信封。(对于这种情况)。
我知道至少有两种不同的方法可以从信号中检索幅度包络。
关键方程是:
E(t)^2 = S(t)^2 + Q(S(t))^2
Where Q represents a π/2 phase shift (also known as quadrature signal).
我知道的最简单的方法是获得 Q 是使用 FFT 将 S(t) 分解成一堆正弦分量,将每个分量逆时针旋转四分之一圈(记住每个分量都是复数,所以一个特定的分量 x + iy -> -y + ix ) 然后重新组合。
这种方法效果很好,虽然需要一些调整(我对数学的理解还不够好,无法以更好的方式解释这一点)
这里有几个关键术语,即“希尔伯特变换”和“解析信号”
我避免使用这些术语,因为我很确定我目睹了它们的使用相当模糊。
一份文件将原始实信号 f(t) 的(复杂)分析信号描述为:
Analytic(f(t)) = f(t) + i.H(f(t))
where H(f(t)) represents the 'π/2 phase shift' of f(t)
在这种情况下,幅度包络只是 |Analytic(f(t))|,这使我们回到了原始的毕达哥拉斯方程
注意:我最近遇到了一种更先进的技术,涉及频移和低通数字滤波器。理论是我们可以通过不同的方式构建解析信号;我们将 f(t) 分解为正弦频率分量和负正弦频率分量,然后简单地去除负分量并将正分量加倍。并且可以通过频移和低通滤波的组合来完成“负频率分量去除”。这可以使用数字滤波器非常快速地完成。我还没有探索过这种方法,所以我现在可以说的就这么多了。
所以你基本上是在寻找一个自动增益控制(AGC)。不确定您是否必须通过数字处理来做到这一点,但是那里有非常非常好的集成电路可以很好地执行该任务,通常 AGC 集成了许多其他功能,但是可以使用 JFET 晶体管创建一些电路和一些二极管。
但是用数字处理来做这件事的一个非常容易理解的方法是设计一个自适应方差估计器,比如取一个足够样本的时间窗口来表示 5 或 10 毫秒,并应用一个遗忘因子 alpha^n (alpha <1) 所以每个新出现的样本都比过去的样本得到更多考虑。然后基于此方差估计,您可以根据需要设计一个函数,该函数将方差映射到您应用于每个音频样本的增益。这可能是一个硬决策边界,而如果方差超过某个阈值,则会将增益降低某个因素。
或者可以是更软决策边界,您可以在其中创建从方差到增益的非线性变换,并根据最后的方差估计将变换应用于每个样本。
这是更具启发性的方法,但至少它使您免于繁重的数学运算。