用C#中的yin方法计算基频

时间:2012-09-30 17:40:39

标签: c# signal-processing frequency voice

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

我有一个数组(数据[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中检查它,期间是应该的。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您的代码和评论之间存在不匹配。

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

答案 1 :(得分:1)

您在自相关函数中包含零滞后,并且信号与自身完全相关,零滞后。在达到一个周期的滞后之前,你也会停止(tau&lt; w),在这个周期中,一个sin波将具有下一个自相关峰值。

尝试从预期期限的一半开始,然后步入预期期限的1.5倍。