音高检测:这是区分浊音和清音的最可靠方法

信息处理 沥青 检测
2022-02-15 08:50:02

我正在尝试编写一个语音/口哨驱动的合成器,但我正在努力进行音高检测。作为一个前提,我必须说我在 dsp 编码方面非常熟练和经验丰富,而且我已经阅读了我在文献中可以找到的关于这个非常棘手的主题的几乎所有内容,并且我知道不存在单一的强大解决方案。基于谐波序列或 HPS 及其变化的分析,我尝试并发明了频域中的所有可能和奇特的方法,但我仍然受到倍频程误差的困扰,加上缺乏一个可靠的标准来区分音高和非音高帧(即包含噪音)。最后,我决定放弃频谱方法并使用时域自相关(通过 FFT、平方幅度加 IFFT),即使仍然不是 100% 容易出错,这也是所有方法中最可靠的方法。但又一次,

我发现了一个名为 Autotalent 的插件的源代码,我认为它很有趣,那里的作者依赖于一个“置信度”值,该值是通过将自相关中最高峰的高度乘以用于窗口的自相关的相应位置的值而获得的窗口处理的帧,但我真的无法理解其背后的逻辑。我出于好奇尝试使用相同的技巧,但我得到的是一个似乎与框架倾斜或不倾斜的事实完全无关的值。

请问我应该从哪里开始寻找一个不太复杂的解决方案(一切都是为了实时操作)。有什么提示吗?您是否知道任何可靠的方法来区分音调和非音调帧(在时域或频域中)?谢谢

3个回答

SWIPE 是一个音高估计器,过去对我来说效果很好。你可以在这里找到 MATLAB 中的论文和代码它可能会给你一些想法。

音高估计不是一个微不足道的问题。作为一种基本方法,您可以使用自相关和/或倒谱方法。结果甚至可以组合以获得最佳结果。对于预处理,您可以进行低通滤波并定义基本频率范围。

也许归一化自相关和零交叉率一起使用可以很好地工作......

归一化自相关可以定义为:

NAC(k)=m=kN1S[mk]S[m]m=kN1S2[mk]m=kN1S2[m]

使用 NAC 函数的最大优点是我们正在对自相关值进行归一化,因此这些值将始终在 1 和 0 之间变化,无论信号能量如何,显然它可以用来定义置信度......这个值NAC = 1会说明你认为信号是完全周期性的,也许你永远不会1在现实世界中得到信号哈哈

这可以用来决定帧是否被认为是浊音,您可以同时跟踪 Pitch 和 V/U,当然 NAC 有相同的八度误差问题,要处理它,您需要 ckeck 子周期。 ..