使用AMDF进行基音提取时如何处理低基数?


11

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

dñ=1个ñ-ñķ=ññ-1个|小号ķ-小号ķ-ñ|

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

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

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

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

音频信号频谱

结果,出现音调加倍问题:检测到的最小值对应于信号周期的一半(即二次谐波):

以上信号的AMDF

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


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

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

Answers:


10

这就是我们在音高检测业务中所称的“ 八度音阶问题 ”。

首先,我将AMDF更改为ASDF。随着滞后的增加,我不会减小窗口大小。(此外,我将表示法更改为我认为更常规的表示法。“ ”是离散时间信号。)x[n]

样本附近的方差函数(ASDF)为:x [ n 0 ]x[n]x[n0]

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

ķ ķfloor()函数,如果,则。kķ2=ķ+1个2=ķ2

现在,扩大广场和考虑的总和是什么样子的(不是将无穷大,但给你一个想法,如果大)。ASDF与自相关直接相关。本质上是自相关倒置。这些步骤我将留给您。看一下这个答案。Ñ Ñññ ñ

因此,现在考虑从ASDF定义的有限长度“自相关”(在样本的附近):X[ñ0]

[RX[ķñ0]=[RX[0ñ0]-1个2X[ķñ0]

哪里

[RX[0ñ0]1个ññ=0ñ-1个X[ñ+ñ0-ñ2]2

由于和对于所有滞后,这意味着对于所有滞后。Q X [ ķ Ñ 0 ] 0 ķ - [R X [ ķ Ñ 0 ] [R X [ 0 Ñ 0 ] ķX[0ñ0]=0X[ķñ0]0ķ[RX[ķñ0][RX[0ñ0]ķ

假设是周期为一分钟(恰好是整数),然后P PX[ñ]PP

X[ñ+P]=X[ñ]ñ

并且对于任意整数个周期(是整数), 且。因此,如果是周期性的,则在且在等于任何其他倍数的峰值。如果是完全是周期性的,我们所期望的是在最大峰值时,又一个高峰(但略小)(我们正在寻找的时期)和逐渐变小峰较大的倍数。- [R X [ P Ñ 0 ] = - [R X [ 0 Ñ 0 ] [R X [ ķ Ñ 0 ] ķ = 0 ķ PX[Pñ0]=0[RX[Pñ0]=[RX[0ñ0][RX[ķñ0]ķ=0ķPX [ n ] k = 0 k = P PX[ñ]X[ñ]ķ=0ķ=PP

因此,倍频程问题的产生有两个原因。首先,不一定是整数。那是一个插值问题,没什么大不了的。 P

第二个原因和更棘手的问题是次谐波。假设您正在以A-440 Hz的频率聆听一个不错的周期性音调,它听起来像A,比中间C高9个半音。现在假设有人在该音调上增加了一个非常微小的振幅(例如60 dB下调)A -220?这听起来像什么,在数学上,“真实”时期是什么?


在此期间选择“正确的”峰值。

假设您通过直流阻塞滤波器运行笔记,因此的平均值为零。事实证明,每的自相关的平均值也为零(如果大,则接近该平均值)。这意味着必须求和(超过)约为零,这意味着零上方的面积与下方的面积相同。R x [ k n 0 ] n 0 N R x [ k n 0 ] kX[ñ][RX[ķñ0]ñ0ñ[RX[ķñ0]ķ

好的,因此表示附近的幂,并且必须为非负数。 永远不会超过但是当是周期性的时。 如果。因此,如果的周期为并且您有一堆以隔开的峰,那么您就知道这些峰应该有多高。并且如果的DC分量为零,则意味着在峰值之间,它必须具有负值。x [ n ] n = n 0 R x [ k n 0 ] R x [ 0 n 0 ] x [ n ] [ n ][RX[0ñ0]X[ñ]ñ=ñ0[RX[ķñ0][RX[0ñ0]X[ñ]x [ n + P ] = x[RX[Pñ0]=[RX[0ñ0]X[ñ+P]=X[ñ]P P R x [ k n 0 ]X[ñ]PP[RX[ķñ0]

如果是“准周期的”,则一个周期看起来很像相邻周期,但不太像随时间下降的周期。这意味着第一个峰值将高于第二个或第三个。可以使用规则始终选择最高峰,并期望最高峰始终是第一个峰。但是,由于听不到次谐波,有时情况并非如此。有时第二个或第三个峰值会稍高一点。此外,由于周期很可能不是样本,而是整数个在x [ n ] x [ n ] R x [ P n 0 ] R x [ 2 P n 0 ] R x [ 3 P n 0 ] P k R x [ k n 0 ] k kX[ñ]X[ñ]X[ñ][RX[Pñ0][RX[2Pñ0][RX[3Pñ0]Pķ[RX[ķñ0]始终为整数,因此真正的峰值很可能介于整数值之间。即使您要插值平滑峰的位置(我建议,二次插值也足够好),以及它在整数之间的实际值有多高,您的插值算法Alg都会使一个峰比实际值高一点或低一点。因此,选择绝对最高的峰值可能会导致您在真正想要另一个峰值时虚假地选择第二个峰值(反之亦然)。ķķ

因此,您必须以某种方式让增加的峰成为障碍,以使第一个峰比第二个峰略有优势,第二个峰比第四个峰(下一个八度音阶)低,等等。您如何做到这一点?ķ

这样做,通过乘以用的递减函数使得在峰值是由一些因素,相对于相同的峰值在减压。事实证明,幂函数(不是指数函数)可以做到这一点。所以计算k k = 2 P k = P[RX[ķñ0]ķķ=2Pķ=P

ķ-α [RX[ķñ0]

因此,如果是周期为完美周期,而忽略了非整数插值问题,则P PX[ñ]PP

[RX[2Pñ0]=[RX[Pñ0]

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

音调降低一个八度的峰值所占的比例是

2P-α[RX[2Pñ0]P-α[RX[Pñ0]=2P-αP-α=2-α

因此,如果您想使第一个峰值比第二个峰值提高1%,这意味着您将不会选择音调作为次谐波音调,除非次谐波音调自相关至少比第一个高1%。峰值,您将解决从α

2-α=0.99

这是加权,去加重或削弱对应于低于一个八度音阶的次谐波音调的峰值的一致方法。

它仍然使您面临阈值问题。您必须正确选择。但是,这是一个一致的方式强调的第一个高峰在第二,这是一个低八度,但没有这么多,如果纸币确实一个低八度,但在所有的偶次谐波的能量是强大的,相比奇谐波,这仍然会为选择第二个峰值留下可能性。α


1
要回答您的最后一个问题:如果添加220 Hz幅度,则音调将为220 Hz,其中440 Hz是基频之后的一次谐波(从数学上来说)。我的情况相似,但谐波也更高,因此从感知的角度来看,缺少基波不是问题。我不明白用
ASDF

但是问题的另一半是*“听起来像什么”?回答这个问题,然后让我们看看您想要音高检测器做什么。
罗伯特·布里斯托

尝试计算和绘制以获得与AMDF相同的音调。应该看起来像AMDF倒挂 [RX[ķñ0]
罗伯特·布里斯托

如果您没有其他更高的谐波,而只有440 Hz,并且220 Hz的音调足够低,您将听到440 Hz的音调。在某个级别以上(我不知道是哪个级别),您还会听到220 Hz的音调和220 Hz的音调。
frion

我说-60 dB是有原因的。现在,您想要音高检测器说什么,它是220 Hz还是440 Hz音符还是其他?
罗伯特·布里斯托

0

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

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


如何施加重量?我不知道基本面在哪里。另外,我的信号是乐器的音符,所以范围更大
firion '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.