Подсчет основной частоты методом инь в C#

Мне нужно посчитать основную частоту с помощью алгоритма Инь в C#.

У меня есть массив (данные [44100]), который содержит амплитуду синусоидальной волны 250 Гц длиной 1 с. Вот мой код:

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 ответа

Вы включаете в свою функцию автокорреляции запаздывание нуля, и сигнал прекрасно коррелирует с самим собой при запаздывании нуля. Вы также останавливаетесь (tau

Попробуйте начать с задержки в половину ожидаемого периода и перейти в 1,5 раза к ожидаемому периоду.

Существует несоответствие между вашим кодом и вашим комментарием.

1 сек / 25 будет 0,04 сек, а не 0,4 сек.

Другие вопросы по тегам