Обнаружение частот в буфере по времени
Если я записываю серию звуковых сигналов в буфер, например:
15 кГц для 50 мс, 17 к для 50 мс и так далее, есть ли способ "пройти" по времени и декодировать эти частоты (с помощью goertzel или что-то еще)?
Эй, это обновление, я добавил код, который показывает, как я нахожу первый разделитель в звуковом буфере, который я проверяю. Если я записываю 5 секунд буфера (я записываю в буфер потока, а не в файл) Первый фрагмент занимает около 30 секунд, чтобы проанализировать индекс, с которого начинается начальный разделитель. Я думаю, что это очень новичок... должен найти лучшее решение. спасибо (каждый разделитель длится 0,2 секунды) и это так - Начальный разделитель = 12 кГц, 1-е = 13k, 0-е = 14k, конечный разделитель = 15k
double max_power = 0;
int max_power_index = 0;
double DelimiterSamplesCount = SampleRate * DelimiterTime;
float[] samples32array = samples32.ToArray();
//Searching For Delimiter
for (int i = 0; i < (samples32array.Length); i++) //Delimiter Samples Length = SampleRate*DelimiterTimeLength,( i.e: 44100*0.2=8820 samples)
{
if ((i + (int)DelimiterSamplesCount - 1) > samples32array.Length) break;
double power = Goertzel.GoertzelFilter(samples32array, StartDelimiterFreq, i, i + (int)DelimiterSamplesCount - 1);
if(power > max_power)
{
max_power = power;
max_power_index = i;
}
}
Мой Гертцель такой:
public static double GoertzelFilter(float[] samples, double freq, int start, int end)
{
double sPrev = 0.0;
double sPrev2 = 0.0;
int i;
double normalizedfreq = freq / 44100;
double coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);
for (i = start; i < end; i++)
{
double s = samples[i] + coeff * sPrev - sPrev2;
sPrev2 = sPrev;
sPrev = s;
}
double power = sPrev2 * sPrev2 + sPrev * sPrev - coeff * sPrev * sPrev2;
return power;
}
1 ответ
Если вы знаете набор частот и длительностей, тогда набор скользящих фильтров Гертцеля - хорошее начало для создания простого демодулятора. Сравнение и сканирование на наличие пиковой разницы между этими фильтрами - лучший критерий принятия решения, чем просто проверка на выходную величину определенной величины.