Answers:
希尔伯特变换用于计算“解析”信号。参见例如http://en.wikipedia.org/wiki/Analytic_signal。如果您的信号是正弦波或已调制的正弦波,则分析信号的幅度确实看起来像包络。但是,希尔伯特变换的计算并非易事。从技术上讲,它需要相当长的非因果FIR滤波器,因此将需要相当数量的MIPS,内存和延迟。
对于宽带信号,实际上取决于您如何为特定应用定义“包络”。对于动态范围压缩的应用,您需要一个与响度随时间变化的感知紧密相关的指标。希尔伯特变换不是正确的工具。
更好的选择是应用A加权滤波器(http://en.wikipedia.org/wiki/A-weighting),然后进行有损峰值或有损RMS检测器。随着时间的流逝,这将与感知到的响度很好地关联,并且这样做相对便宜。
您可以按以下方式使用希尔伯特变换来计算包络。(我将其编写为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),因此与过去的样本相比,对每个新样本的考虑都更多。然后根据此差异估计,根据您的需求进行设计,该函数会将差异映射到您应用于每个音频样本的增益。这可能是一个硬性决定的边界,而如果方差超过某个阈值,则会使增益降低某种程度。
或者可能是更软决策的边界,您可以在其中创建从方差到增益的非线性变换,然后根据最后的方差估计将变换应用于每个样本。
这是更多的启发式方法,但至少它使您摆脱了繁重的数学工作。