我正在使用平均幅度差函数来估计准周期音频信号的基本频率。 AMDF定义为

$$ D_n = \ frac {1} {N-n} \ sum_ {k = n} ^ {N-1} | S_k-S_ {k-n} | $$

其中$ N $是信号的长度。当信号偏移等于其周期的量时,此功能将显示最小值。

这是我用来提取音高的代码(在Matlab中):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);


但是,我正在处理音频信号基频非常低的地方:



因此,出现音高倍增问题:检测到的最小值对应于信号周期的一半(即谐波):



我试图提取最大的峰,而不仅仅是第一个峰,但有时这个问题仍然存在。我该如何改善我的代码和/或AMDF功能,以处理基本水平较低的问题?

评论

心理声学和人类感知会影响音高和八度不确定度。可能需要进行实验才能确定最大AMDF峰在什么条件下产生可听见的差异。

您的频率有多低?我有什么例子可以听吗?

#1 楼

这就是我们在音高检测业务中所称的“八度音阶问题”。
首先,我将AMDF更改为ASDF。随着滞后的增加,我不会减小窗口大小。 (此外,我将表示法更改为我认为更常规的表示法。“ $ x [n] $”是离散时间信号。)
$ x [n]的均方差函数(ASDF)样本$ x [n_0] $附近的$是:
$$ Q_x [k,n_0] \ triangleq \ frac {1} {N} \ sum \ limits_ {n = 0} ^ {N-1 } \ left(x [n + n_0- \ left \ lfloor \ tfrac {N + k} {2} \ right \ rfloor] \-\ x [n + n_0- \ left \ lfloor \ tfrac {N + k} { 2} \ right \ rfloor + k] \ right)^ 2 $$
$ \ left \ lfloor \ cdot \ right \ rfloor $是floor()函数,如果$ k $甚至是$ \ left \ lfloor \ frac {k} {2} \ right \ rfloor = \ left \ lfloor \ frac {k + 1} {2} \ right \ rfloor = \ frac {k} {2} $。
现在,展开平方并考虑总和为$ N \ to \ infty $的样子(不是$ N $将达到无穷大,而是让您知道$ N $是否很大)。 ASDF与自相关直接相关。本质上是自相关倒置。这些步骤我将留给您。看一下这个答案。
现在考虑从ASDF定义的这个有限长度的“自相关”(在示例$ x [n_0] $附近):
$$ R_x [k,n_0 ] = R_x [0,n_0]-\ tfrac12 Q_x [k,n_0] $$
其中
$$ R_x [0,n_0] \ triangleq \ frac {1} {N} \ sum \ limits_ {n = 0} ^ {N-1} \ Big(x [n + n_0- \ left \ lfloor \ tfrac {N} {2} \ right \ rfloor] \ Big)^ 2 $$
此值$ R_x [0,n_0] $是信号$ x [n] $在$ n \ approx n_0 $附近的平均功率的量度。因为$ Q_x [0,n_0] = 0 $和$ Q_x [k,n_0] \ ge 0 $对于所有滞后$ k $,这意味着$ R_x [k,n_0] \ le R_x [0,n_0] $对于所有滞后$ k $。
查看以样本$ x [n_0] $为中心的邻域中发生的这种自相关的另一种有用方法是用$ R_x [0,n_0]归一化$ R_x [k,n_0] $ ] $:
$$ r_x [k,n_0] \ triangleq \ frac {R_x [k,n_0]} {R_x [0,n_0]} = 1-\ frac {Q_x [k,n_0]} {2 R_x [0,n_0]} $$
对于所有其他$ k $,此归一化自相关具有$ r_x [0,n_0] = 1 $和$ r_x [k,n_0] \ le 1 $。
假设一分钟$ x [n] $是周期性的加上周期$ P $(而$ P $恰好是整数),则
$$ x [n + P] = x [n] \ quad \ forall n $$
和$ Q_x [ mP,n_0] = 0 $和$ R_x [mP,n_0] = R_x [0,n_0] \ ge R_x [k,n_0] $对于任何整数周期($ m $是整数)。因此,如果$ x [n] $是周期性的,则在$ k = 0 $处且在$ k $处等于$ P $其他倍数的峰值。如果$ x [n] $不是完全周期性的,我们可能期望的是$ k = 0 $的最大峰值,$ k = P $(我们正在寻找的时间段)的另一个峰值(但稍小),并逐步$ P $的较大倍数的峰值较小。
然后我们可以期望归一化自相关的值$ r_x [k,n_0] $在$ k = P $或$ P的其他倍数的滞后时求值$应该非常接近1。该值$ r_x [P,n_0] $可以看作是准周期$ x [的估计周期$ P $的周期性程度(有时称为音高置信度)的量度。 n] $在$ n \ approx n_0 $附近。如果$ r_x [P,n_0] = 1 $,我们可以说$ x [n] $与周期$ P $是完全周期性的。如果您可以获得的最佳$ r_x [k,n_0] $($ k $接近$ k = 0 $)很小,那么$ x [n] $则没有周期性,并且音调置信度很低。
因此,倍频程问题的出现有两个原因。首先,$ P $不一定是整数。那是一个插值问题,没什么大不了的。
第二个原因也是更困难的问题是子谐波。假设您正在以A-440 Hz的频率聆听一个不错的周期性音调,它听起来像A,比中音C高9个半音。现在假设某人在该音调上增加了一个非常微小的振幅(例如60 dB下来) -220?这听起来像什么,从数学上讲,“真实”时期是什么?

选择该时期的“正确”高峰。
假设您通过隔直流滤波器运行笔记,因此$ x [n] $的均值为零。事实证明,这会使每个$ n_0 $的自相关$ R_x [k,n_0] $的平均值也为零(如果$ N $大,则接近该平均值)。这意味着$ R_x [k,n_0] $必须相加(超过$ k $)约为零,这意味着零上方的面积要大于如下。 $ x [n] $在$ n = n_0 $附近的幂,并且必须为非负数。 $ R_x [k,n_0] $永远不会超过$ R_x [0,n_0] $,但是当$ x [n] $是周期性的时,它可能会和它一样大。如果$ x [n + P] = x [n] $,则$ R_x [P,n_0] = R_x [0,n_0] $。因此,如果$ x [n] $是周期为$ P $的周期,并且您有一堆峰,它们之间的间隔为$ P $,那么您就知道这些峰应该有多高。并且如果$ R_x [k,n_0] $的DC分量为零,则意味着在峰值之间,它必须具有负值。
如果$ x [n] $是“准周期的”,则$ x [n] $的一个周期看起来很像相邻周期,但不太像信号下方的$ x [n] $的周期及时。这意味着第一个峰值$ R_x [P,n_0] $将高于第二个峰值$ R_x [2P,n_0] $或第三个峰值$ R_x [3P,n_0] $。可以使用规则始终选择最高峰,并期望最高峰始终是第一个峰。但是,由于听不到次谐波,有时情况并非如此。有时第二个或第三个峰值会稍高一点。另外,由于周期$ P $可能不是整数的样本,而是$ R_x [k,n_0] $中的$ k $始终是整数,所以真实的峰值很可能介于$ k $的整数值之间。即使您要插值平滑峰的位置(我建议,二次插值也足够好),以及它在整数$ k $之间的实际值有多高,您的插值算法可能会使一个峰比实际值稍高或略低是。因此,当您真正想要另一个峰值时,选择绝对最高的峰值可能会导致在第一个峰值上虚假地选择第二个峰值(反之亦然)。
因此,您必须以某种方式在增加$ k $时限制这些峰值,以便第一个峰值在第二个上稍有优势,第二个在第四个上(下一个八度音阶),等等。等等。您如何做到这一点?相对于$ k = P $的相同峰值,$ k $的函数减小了,因此$ k = 2P $的峰值减小了某个因子。事实证明,幂函数(不是指数函数)可以做到这一点。因此计算
$$ k ^ {-\ alpha} \ R_x [k,n_0] $$
因此,如果$ x [n] $是周期为$ P $的完全周期性,则忽略插值问题对于非整数$ P $,则
$$ R_x [2P,n_0] = R_x [P,n_0] $$
,但
$$ \ begin {align}
(2P)^ {-\ alpha} R_x [2P,n_0]&= \\
(2P)^ {-\ alpha} R_x [P,n_0]&

\ end {align} $$
降低一个八度音调的峰值的因素是比率
$$ \ frac {(2P)^ {-alpha} R_x [2P,n_0]} {P ^ {-\ alpha } R_x [P,n_0]} = \ frac {(2P)^ {-\ alpha}} {P ^ {-\ alpha}} = 2 ^ {-\ alpha} $$
因此,如果您要给您的第一个峰值一个比第二个峰值大1%的增益,这意味着您将不会选择该音调作为次谐波音调,除非次谐波音调自相关比第一个峰值大至少1%,您可以解决for $ \ alpha $ from
$$ 2 ^ {-\ alpha} = 0.99 $$
这是一种加权,去加重或削弱对应于低于一个八度的次谐波音调的峰值的一致方法。
它仍然给您带来阈值问题。您必须很好地选择$ \ alpha $。但这是一种始终如一的方式,可以强调第一个峰值比第二个峰值低一个八度,但是如果音符确实比一个低八度,那么并不是那么多,但是与奇数相比,所有偶次谐波中的能量都很强谐波,这仍然会为选择第二个峰值留下可能性。

评论


$ \ begingroup $
要回答您的最后一个问题:如果添加220 Hz振幅,则音调将为220 Hz,其中440 Hz是基频之后的一次谐波(从数学上来说)。我的情况类似,但是谐波也更高,因此从感知的角度来看,缺少基波不是问题。我不明白以ASDF取代AMDF如何解决八度音阶问题
$ \ endgroup $
–firion
16年4月8日在7:47

$ \ begingroup $
,但问题的另一半是*“听起来像什么?”?回答这个问题,然后让我们看看您想要音高检测器做什么。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16年4月8日在16:18

$ \ begingroup $
尝试计算和绘制$ R_x [k,n_0] $,以获得与AMDF相同的音调。应该看起来像AMDF倒置一样。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16年4月8日在16:20

$ \ begingroup $
如果您没有其他更高的谐波,而只有440 Hz,并且220 Hz的音调足够低,您会听到440 Hz的音调。在某个级别以上(我不知道是哪个级别),您还会听到220 Hz的音调和220 Hz的音调。
$ \ endgroup $
–firion
16年4月8日在20:51

$ \ begingroup $
我说-60 dB是有原因的。现在,您想让音高检测器说什么,它是220 Hz还是440 Hz音符还是其他?
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16年4月8日在21:01

#2 楼

试探性地,发声语音的基本频率将在[70,400] Hz区间内。因此,第一步将是应用带通滤波器来大致隔离该频带。

其次,您可以将加权函数应用于功率谱。接近基本面时,权重应接近1,而接近带末端时,权重应接近0。当然,此权重已归一化。我会推荐一些超线性的东西:二次方,四次方等-真正消除八度。

评论


$ \ begingroup $
如何施加重量?我不知道基本面在哪里。另外,我的信号是乐器的音符,所以范围更大
$ \ endgroup $
–firion
16-4-7在20:20