0

我需要用 C# 中的 yin 算法计算基频。

我有一个数组(data[44100]),其中包含 1 秒长的 250Hz 正弦波的幅度。这是我的代码:

int t = 0;                    //starting point of the window
int w = data.Length / 25;     //the end of the window so the size of the window is 40msec
int rmax = 0;                 //the maximum of the correlation function
int period = 0;               //the period of the sinus

for (int tau = 0; tau < w; tau++)
{ 
    int r = 0;
    for (int j = t + 1; j < (t + w); j++)
    {
       r = r + (data[j] * data[j + tau]);
    }     
    if (r > rmax)
    {
       rmax = r;
       period = tau;
    }
}

float time = (float)period/44100;
float freq = 1.0f / time;
System.Console.WriteLine(freq);

我应该得到 250 的频率,但出了点问题。数组中的值很好,我在 excel 中检查了它,期间应该是这样。有人可以帮忙吗?

4

2 回答 2

2

您在自相关函数中包含零滞后,并且信号与零滞后完全相关。在达到一个周期的滞后之前,您也会停止 (tau < w),此时正弦波将出现下一个自相关峰值。

尝试从预期周期的一半延迟开始,然后逐步增加到预期周期的 1.5 倍。

于 2012-09-30T19:26:57.807 回答
1

您的代码和您的评论不匹配。

1 秒/25 将是 0.04 秒而不是 0.4 秒。

于 2012-09-30T17:59:42.643 回答