YIN 音高检测算法(如何改进我的结果)

信息处理 沥青 即时的
2021-12-21 03:36:00

我在我的一个学校项目中使用 YIN 算法,该项目使用吉他声音的音高检测。当我弹奏一个音符时,我会在开始时获得随机频率,直到它们稳定下来。我在想那些可能是来自于琴弦上的拨弦动作。

我正在阅读原始论文:

Cheveigne A, Kawahara H. - YIN,语音和音乐的基频估计器

试图对库进行逆向工程并改善我的结果。我正在学习计算机科学,我的信号处理知识有限。总结:

步骤 1) Auto-correlation:- 我们试图找到信号与自身的相关性,该相关性在一个窗口内移动了一个滞后。

在此处输入图像描述

函数可能有无限的值。我们选择了非零滞后的最高峰。在滞后范围内。(为什么是最高峰?这是否意味着最响亮的频率?)。的上限很高。该算法可能会选择更高阶的峰值(什么是更高阶的峰值?)τ

以下步骤是为了提高结果的准确性

步骤 2) Difference Function:- 以差分函数的形式对信号进行建模。 给出:

d(τ)=j=1j=W(xjxj+τ)2
d(τ)=j=1j=W(rt(0)+rt+τ(0)2rt(τ)

所以我们基本上使用幅度作为偏差。

步骤 3) Cumulative mean normalization 用累积归一化差异替换差异函数以避免选择零滞后值:

dt(τ)=dt(τ)(1/τ)j=1τdt(j)

第4步) Absolute Threshold(有人可以解释这部分吗?)

第 5 步) Parabolic Interpolation:将估计拟合为抛物线曲线。d(τ)

第 6 步) Choose The Best Local Estimate:不言自明

我正在尝试将吉他声音与单声道 MIDI 进行比较。

我认为我应该考虑修改的参数是窗口大小和阈值以改善我的结果,或者我可以丢弃前几帧。谁能指出我正确的方向?

我正在使用的参数:

采样率:44100

窗户尺寸:1024

啤酒花尺寸:512

阈值:0.1

1个回答

如果您不是在低延迟实时中执行此操作,则可以从音高估计的稳定部分向后工作到波形开始时的瞬态起音部分。

随着时间的推移,弹拨吉他弦的声音以一种可能可预测的模式演变(例如,比声音更是如此)。如果您可以估计开始时间和/或有相邻的音高估计,您可以随着时间的推移自适应地将窗口大小和阈值水平设置为更优化的值,这可能通过对某些吉他音符数据集的实验来确定。您还可以使用统计决策理论来确定任何局部音高估计是否适合任何吉他音符的合理频谱演变的历史,并拒绝异常值作为噪声、瞬态、谐波或八度音阶错误(谐波和八度音阶错误可能是可纠正的错误)。这在时间倒流时特别有用,因为起音通常比音符演变的延音/衰减部分更嘈杂。

步骤 4) 和 6) 的一些改进也可以从人类听众的心理声学实验中获得。例如:对于典型的人类听众要感知到高于某个错误率的八度音程差异,八度音程估计值的归一化差异在多长时间内达到峰值?在更短的时间内的任何差异都可能是难以察觉的。

添加:在 44100 的采样率下,窗口大小为 1024 只允许关联/使用吉他最低弦的音高的多于 2 个周期(E4 = 82.40Hz)。对于最低的吉他音符,3X 或 4X 长的窗口可能更可靠,但较短的窗口会更有响应性或为较高的按弦音符提供更好的时间局部性。