如何防止语音信号ACF中的八度跳跃?

信息处理 估计 语音处理 沥青 八度
2022-02-16 00:04:54

我正在处理语音信号,我的目标是估计基频
 F0 这个信号通常被称为“音高”。

主要思想是获取语音信号的小块,以便可以假设静止。然后计算该语音信号块的自相关函数(ACF),并找到指基频的 ACF 的全局最大值(零除外)的索引。

但在文本中指出:

全局最大值可能不在对应于真实基频的滞后处,但可能是它的整数倍。因此,最大值可以在对应于 T0 倍数的滞后之间的连续帧中跳跃,这也会导致 F0 估计中的跳跃。这些效果称为八度跳跃。

我的问题出现在这一点上:八度跳跃是如何发生的?可能的原因是什么?我知道 ACF 是一个周期函数,因为原始时间序列是周期性的,在我看来,这个周期等于我们正在处理的原始语音信号的块长度。当我调查 ACF 的第一个周期的间隔时,我如何确定最大值是指音高还是从连续周期(块)偏移的最大值?我怎样才能防止这种影响?

2个回答

八度误差在自相关或基于 FFT 的音高检测器中很常见。ACF 在该周期的倍数处显示峰值。自相关方法通过在滞后范围内搜索来选择最高的非零滞后峰值。如果上限足够大,它可能会错误地选择更高阶的峰值。避免这种情况的一种方法是使用 ACF 的以下定义

rt(τ)=j=t+1t+Wτx(j)x(j+τ)
在哪里τ是时滞指数tW是窗口大小。此定义可确保您的 ACF 随着滞后值的增加而逐渐减小,因此将谐波检测为基波的机会较小。

YIN是一个音高检测器,它通过定义一个差分函数来克服 ACF 方法的一些缺陷,并对其进行归一化,使其在低滞后时保持较大,而在较大滞后时下降,从而避免八度音阶错误。

dt(τ)=j=1W(x(j)x(j+τ))2
dt(τ)={1,τ=0dt(τ)/1τj=1τdt(j),τ0
您现在可以在这个修改后的差异函数中寻找最大的峰值来找到音高。

如果音高频率的次谐波周围的噪声(或其他调制)多于音高,则可能发生八度跳变。

如果音色包含强泛音或泛音序列以及基本音高频率处或附近的弱或几乎缺失的频谱,则可能发生八度向上跳跃。声学环境或通道中的噪声或非平坦频率响应也会增加泛音峰值的功率。

ACF 中的窗口效应会增加噪声,从而增加上述估计错误的概率。

人类可能会通过使用之前或之后的音高、音色和瞬态来推断八度音阶,以纠正时间局部频谱中的杂散跳跃。