Подсчет основной частоты методом инь в 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 сек.