Здравствуйте.
Надо выделить частоты, характерные для движения человека, из записанного сигнала датчика движения, и определить порог для их детектирования оптимизированным алгоритмом Герцеля.
Расскажите, пожалуйста, как это сделать?
Запись сигнала, поданного на линейный вход звуковой карты, производилась через конденсатор 10 мкФ.
Параметры записи: 48000 Гц, Моно, 32 бит float.
По-умолчанию, искал частоты 5, 8 и 14 Гц, но на выходе всё время истина, даже при подстановке других частот.
Возможно, что частоты немного другие или что-то не так с реализацией алгоритма (через DMA по таймеру c ADC передаётся 125 семплов в секунду (5 раз 25 семплов за раз), каждые 25 семплов производится проверка наличия частот), или сигнал сильно "загажен".
Код
#define ADCSAMPLES 25
#define ADC_SAMPLING_RATE 125
#define M_PI 3.14159265358979323846
uint16_t AdcSamplesArr[ADCSAMPLES];
bool goertzel(void)
{
int TARGET_FREQUENCYS[] = {5, 8, 14};
bool temp_var = false, flag_frq_exist[] = {true, true, true};
float coeff, Q0, Q1, Q2, result;
for(int i = 0; i < 3; i++)
{
float prev_result = 0;
coeff = 2 * cos(M_PI * 2 * (TARGET_FREQUENCYS[i] / ADC_SAMPLING_RATE));
Q0=0;
Q1=0;
Q2=0;
for(int k = 0; k < ADCSAMPLES; k++)
{
Q0 = coeff * Q1 - Q2 + (float) AdcSamplesArr[k];
Q2 = Q1;
Q1 = Q0;
result = Q1 * Q1 + Q2 * Q2 - Q1 * Q2 * coeff;
if(prev_result < result)
{
prev_result = result * 0.85;
}
else
{
flag_frq_exist[i] = false;
}
}
}
if((flag_frq_exist[0] == true) && (flag_frq_exist[1] == true) && (flag_frq_exist[2] == true))
{
return temp_var = true;
}
else
{
return temp_var = false;
}
}
Файлы с записью сигнала (*.wav файлы).