|
Алгоритм Герцеля, Поиск частот в записанном сигнале |
|
|
|
Jun 6 2016, 05:09
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 20-09-14
Пользователь №: 82 877

|
Здравствуйте. Надо выделить частоты, характерные для движения человека, из записанного сигнала датчика движения, и определить порог для их детектирования оптимизированным алгоритмом Герцеля. Расскажите, пожалуйста, как это сделать? Запись сигнала, поданного на линейный вход звуковой карты, производилась через конденсатор 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 файлы).
|
|
|
|
|
Jun 6 2016, 12:19
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 20-09-14
Пользователь №: 82 877

|
Цитата(ViKo @ Jun 6 2016, 10:24)  Для начала весь спектр посмотрите. Каким макаром? Нашёл программу Audacity, но какие нужны настройки для построения спектра я не знаю. Да и экспорт только в текстовом виде.
Цитата(alexeyv @ Jun 6 2016, 12:15)  Следовательно на 48кГц, чтобы различить 5 и 8 Гц необходимое количество выборок ~24кило. Этим алгоритмом будет анализироваться сигнал, подаваемый на АЦП, а не записанные файлы; они (файлы) должны помочь определить частоты и порог их детектирования (см. первое сообщение).
|
|
|
|
|
Jun 6 2016, 13:06
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(kreker @ Jun 6 2016, 18:19)  Каким макаром? преобразование Фурье много делать умеет matlab, mathematica, excel в конце концов. да и руками сделать обычное небыстрое преобразование Фурье - на любом ЯП несколько строчек. Цитата(kreker @ Jun 6 2016, 18:19)  Этим алгоритмом будет анализироваться сигнал, подаваемый на АЦП, а не записанные файлы; они (файлы) должны помочь определить частоты и порог их детектирования (см. первое сообщение). какая разница откуда данные, чтобы иметь разрешение по частоте в 1Гц, длина выборки должна быть больше секунды. ну и искать 14Гц с датчика движения, не многовато ли? алкоголиков с похмелья по дрожжанию рук выделять из сигнала? да и то там не выше пары Гц будет.
|
|
|
|
|
Jun 7 2016, 05:07
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Каким макаром? У того же Sound Forge есть встроенная функция Menu->View->Spectrum Analysis. Чтобы не замарачиваться изучением Matlab/Exel/Mathematica Цитата Этим алгоритмом будет анализироваться сигнал, подаваемый на АЦП, а не записанные файлы; они (файлы) должны помочь определить частоты и порог их детектирования (см. первое сообщение). Хорошо,понял. Но еще раз повторяю. У вас 125 семплов в секунду => частота семплирования 125 Гц + 25 семплов => ширина спектральной линии будет 5Гц, а между 5 и 8 всего 3Гц. Для 125Гц необходимо анализировать разом не менее 60 семплов. Но вообще 125Гц - это очень мало, не будет никакой точности. Увеличьте частоту и количество семплов до максимума. З.Ы. Посмотрел файлы - нет там ни 5 ни 8 ни 14 Гц. Только какая-то ~2кГц и ее гармоники. Вы уверены что ваша звуковая карта на ПК пропускает такие низкие частоты?
Сообщение отредактировал alexeyv - Jun 7 2016, 05:12
|
|
|
|
|
Jun 7 2016, 07:14
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 20-09-14
Пользователь №: 82 877

|
Цитата(alexeyv @ Jun 7 2016, 10:07)  З.Ы. Посмотрел файлы - нет там ни 5 ни 8 ни 14 Гц. Только какая-то ~2кГц и ее гармоники. Вы уверены что ваша звуковая карта на ПК пропускает такие низкие частоты? Не уверен. Встроенная звуковуха: Realtek® ALC1200 8-Channel High Definition Audio CODEC.
|
|
|
|
|
Jun 8 2016, 04:42
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Встроенная звуковуха: Realtek® ALC1200 8-Channel High Definition Audio CODEC. У ALC888 АЦП минимум 10 Гц. у ALC889 АЦП от 0Гц. Но у обоих стоит цифровой фильтр от 20 Гц (из datasheet: Integrated high-pass filter to cancel DC offset generated from digital microphone) По ALC1200 ничего не нашел, но пишут что это перелицованный ALC888 Цитата Нет, есть там кое-что в низкочастотной области. Отчет по файлам: Откуда, если там цифровой фильтр для устранения постоянной составляющей?
|
|
|
|
|
Jun 8 2016, 07:27
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(alexeyv @ Jun 8 2016, 10:42)  Откуда, если там цифровой фильтр для устранения постоянной составляющей? в даташите на ALC888 никакого HPF фильтра нет. а последовательная ёмкость если и режет низкие частоты, то не так круто. картинки спектров парой постов выше я же не в фотошопе нарисовал. хотя конечно для датчиков движения где самые интересные частоты меньше 1Гц аудио АЦП не самый лучший выбор.
|
|
|
|
|
Jun 8 2016, 09:08
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата в даташите на ALC888 никакого HPF фильтра нет. Версия даташита Rev.1.4. 07 April 2008. Раздел 2.2. Самый первый пункт Большего описания нет т.к. этот фильтр не управляемый и идет совместно с аналоговым блоком (АЦП)
|
|
|
|
|
Jun 8 2016, 09:25
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 20-09-14
Пользователь №: 82 877

|
Цитата(_pv @ Jun 8 2016, 12:27)  Хотя, конечно, для датчиков движения, где самые интересные частоты меньше 1Гц, аудио АЦП - не самый лучший выбор. А чем тогда снимать сигнал? Цитата(Alex11 @ Jun 7 2016, 15:25)  Попробуйте снять еще данные, максимально уменьшив частоту дискретизации, но так, чтобы виндюки не включали еще свою передискретизацию. Сделаю.
|
|
|
|
|
Jun 8 2016, 10:05
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(alexeyv @ Jun 8 2016, 15:08)  Версия даташита Rev.1.4. 07 April 2008. Раздел 2.2. Самый первый пункт мне даташит 1.0 попался, там нету. да и тут только в какой-то определённой ревизии ALC888-VC2-GR, а их там 5 штук разных. о чём спор, если на ALC1200 всё равно даташита нет. ну и будь у ТС в его звуковухе этот фильтр на 12Гц, никакого сигнала он бы не увидел вообще. (см картинку спектра) Цитата А чем тогда снимать сигнал? любым АЦП, который НЧ не режет. сделать-то что хотите? подключить датчик движения к звуковой карте?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|