倒谱,峰值拾取

信息处理 频率 沥青
2022-02-11 16:39:01

我尝试从倒谱中获得基频。我决定使用峰值拾取算法,该算法使用采样率 fs 选取倒谱 (c) 的最大值。

function [f0] = spPitchCepstrum(c, fs)
 % search for maximum  between 2ms (=500Hz) and 20ms (=50Hz)
 ms2=floor(fs*0.002); % 2ms
 ms20=floor(fs*0.02); % 20ms
 [maxi,idx]=max(abs(c(ms2:ms20)));
 f0 = fs/(ms2+idx-1);
end

它有效,但我不明白为什么 f0 的计算方式如下:

f0 = fs/(ms2+idx-1);

其中分母是值组成索引。

你能解释一下为什么它是这样计算的吗?

2个回答

倒谱参数称为quefreency,它实际上是一个时域因此,例如,如果您正在寻找基频,那么您正在寻找特定范围内的峰值。在你的情况下[0.002;0.2]seC,对应于[50;500]Hz。, 知道F=1.

因此,在搜索基频时,可以在域中找到峰值,然后将其转换为相应的频率您也可以使用不同的方法。我们知道我们的倒谱是围绕中心对称的(类似于傅立叶变换),而且我们有我们的采样频率Fs. 假设你有ñ倒谱箱,因此它们之间的距离是:Fsñ. 这就是为什么你可以找到相应的基频F0通过将采样频率除以峰值的索引。

例如我们的峰值在索引号10, 采样频率为1000Hz. 相应的F0100Hz. 如果峰值在 bin50(更靠右,意味着较低的频率 - 记住频率就像时间),然后F0=20赫兹。分母中 1 的减法是因为 MATLAB 是从 1 索引而不是从 0 索引,就像大多数编程语言一样。

声音中的一堆谐波频率越接近,产生所有这些谐波的基频就越高。倒谱返回的值与频域中一系列谐波频率峰值之间的频率距离的倒数大致成正比。谐波距离越远,假定的基波越低。这就是为什么 Fs 除以 Quefrency 域中的 bin 编号(转换为基于 0 的索引)以产生基频估计的原因。