我正在开发一种用于基频跟踪的软件。为此,我设计了一个计算信号自相关的函数和第二个函数,该函数根据自相关结果找到对应于基频的峰值。
但是我写的代码不是很可靠。我想知道的是:哪些算法对于基频峰值搜索是可靠的?
编辑
到目前为止,在 MATLAB 中完成时,我的自相关图如下所示:
不过我是用C实现的,因为我的软件是用C的,如下:
91 for(;i < *length;i++) {
92 for(j = i;j < *length + i;j++) {
93 if(j > i) {
94 sum += 0;
95 } else {
96 sum += samples[i] * samples[j];
97 }
98 }
99
100 result[i] = sum;
101 sum = 0.0f;
102 }
i
从0
. _ 我也相信这段代码没问题。
在 MATLAB 中近似上面的图,我看到了,其中标记的峰值将是我的基频(我正在测试的音符是 E2)
正如我们从这个情节中看到的
我正在处理的信号是准周期性的,这些峰值之间的差异实际上导致了 E2 的基频 注意:两者之间的距离是 389 - 193 == 196(从 MATLAB 绘图的拖放获得的值),其中,除以我的 16 kHz 采样率,得到 0.01225,这将是我的波形周期。反转这个值,我得到 81.6326530612 Hz,这非常接近我对 E2 的预期 82.41 Hz。
但是,我很难在代码中找到这两个峰值,因为我不确定要比较什么来确定我发现的峰值实际上是这两个峰值。