True Envelope 算法:如何加快速度?

信息处理 fft 信封
2022-01-25 23:39:11

前提(因为有人可能会询问背景):我是 SynthEdit 的频谱模块的作者,这是一个用于实时 STFT 音频处理的模块化框架,几个月以来一直在努力编写一个稳定且强大的频谱包络估计器,用于语音修改,带有共振峰保留、声码、逆滤波等的音高移位。

在发明(并尝试)了所有可能的谱包络估计算法之后,但对它们的鲁棒性和时间稳定性不足感到失望,我认为所谓的真包络有可能提供我正在寻找的所有需要​​的优势。

简而言之,该算法不断平滑目标幅度谱,然后用自身和原始幅度谱的最大值迭代更新它,直到平滑包络缓慢增长,一旦满足某个停止条件,算法就会停止。经过实际实验,结果表明需要 15 到 30 次迭代,具体取决于原始频谱中的 F0。

所提出的算法使用倒谱平滑在每次迭代时平滑目标频谱,即通过在任意阶上将倒谱系数归零(50 是一个不错的选择 - 与类似算法不同,鉴于其迭代性质,结果似乎对所选择的倒谱顺序不再那么敏感,否则这自然会与 FO 的知识相关联,这反过来又是另一个病态问题)

然而,这意味着计算 40 次 FFT 进行 20 次迭代,即使在现代 cpu 上可行,这肯定是对资源的巨大浪费!

我尝试了一种更聪明的方法:在不进入倒谱域的情况下过滤幅度谱,即简单地使用双向 1 极点 LP 滤波器。速度提升很大,但结果肯定不如倒谱法,因为砖墙倒谱滤波具有不同的响应,除非使用带有 sinc 卷积的 FIR,否则无法使用快速 IIR 滤波器轻松模拟(但这会使事情变得更糟,因为性能)

本文本文中,提出了一些技巧来提高性能和加速收敛。我不是在谈论原始频谱的下采样(这在某种程度上我已经做过),而是在谈论控制迭代算法步长的技巧。

不幸的是,尽管很冗长,但两篇论文的解释都非常糟糕,尽管我付出了所有努力,但我未能正确理解和实施建议的技巧。

因此,我的问题是,是否有人可以提供一个伪代码,让我了解如何按照上述论文的作者建议的方式加速收敛。或者,关于如何降低真包络算法的计算复杂性的任何其他详细说明或建议或想法,因为必须为每个光谱帧计算数十个 FFT 来计算包络实际上是一种矫枉过正。

提前致谢

更新:我还不是 100% 确定这将是解决方案,但我很有可能发现了一个简单但亲切的技巧。仅在一次迭代之后,可以将得到的倒谱与原始频谱的倒谱进行比较,并且可以线性地外推倒谱系数的“未来”意味着要保持(即在用于提升的矩形窗口内)。对于一次迭代后的每个系数,计算起始倒谱中相应系数的差值并将该差值乘以模拟进一步迭代结果的因子就足够了。结果很有希望,看起来像哥伦布的蛋……很奇怪,上面论文的作者从来没有想到过这么简单优雅的解决方案……

更新 2:最后我什至设法“解密”原始论文并实施建议的加速技巧以增加迭代步骤。通过这个技巧,算法在 4 / 5 次迭代中收敛。不过,每帧仍然有 8 到 10 个 FFT。哦,好吧……案子已经结案了。我意识到这是一个过于专业的话题。

0个回答
没有发现任何回复~