Платформа ускорения обнаружения пиков Objective-C

Я здесь не гуру математики, поэтому я хочу спросить любого, кто знаком с цифровой обработкой сигналов, каков наилучший способ обнаружения пиков в реальном времени. Я получаю около 30 кадров / значений в секунду, и я пытался реализовать алгоритм наклона для обнаружения пиков, он работал нормально, примерно в 80% случаев, но на самом деле этого недостаточно :(.

Из того, что я искал, следует использовать быстрое преобразование Фурье, но я понятия не имею, как с ним начать, возможно, мне не хватает общего представления о том, как мне следует использовать БПФ в этом случае.

В iOS у нас есть этот удивительный фреймворк Accelerate, который должен помочь мне в работе с БПФ, но пока я не понимаю общей идеи, он для меня практически бесполезен.

Может ли кто-нибудь просветить меня, указав мне правильное направление :-)?

Большое спасибо, и с Новым годом!


person Andy    schedule 02.01.2013    source источник
comment
Что вы вводите здесь, звуковой сигнал? Под пиком вы подразумеваете точку максимальной громкости на этом входе?   -  person Brad Larson    schedule 02.01.2013
comment
Бред, на самом деле ты не поверишь :D мой ввод - это в основном значение освещенности с камеры iPhone, это просто поплавок. И под пиком я подразумеваю максимальное значение (удар), я пишу детектор сердцебиения (проект выходного дня:]). Забавно то, что я использую вашу библиотеку GPUImage, которая ПОТРЯСАЮЩАЯ! :)   -  person Andy    schedule 02.01.2013
comment
БПФ тут не поможет.   -  person Bjorn Roche    schedule 02.01.2013
comment
@Andy - Работа со средней яркостью камеры может быть немного сложной, потому что я обнаружил, что настройки автоматического усиления и баланса белого камер iOS, как правило, настраивают вещи так, что изображение почти всегда имеет яркость 50%. Это может затруднить выделение пиков и спадов, но сердцебиение может быть достаточно быстрым, чтобы опередить усиление камеры и настройки экспозиции.   -  person Brad Larson    schedule 02.01.2013
comment
@BradLarson мммм, я мог бы изменить его только на красный канал, но из того, что я видел, значения довольно хорошие.   -  person Andy    schedule 03.01.2013


Ответы (1)


Таким образом, у вас есть плавающий массив значений освещения камеры, генерируемый каждую секунду, который содержит 30 сэмплов. Вы хотите знать, каково пиковое значение в секунду? Или когда-нибудь? Чтобы вычислить максимальное значение в векторе с использованием ускорения, вы можете использовать функцию vDSP_maxv.

Или вы пытаетесь обнаружить все пики выше заданного порога в секунду? В этом случае вы можете сгенерировать вектор, содержащий пороговое значение той же длины, что и вектор для поиска пиков. Затем вы можете использовать функцию vDSP_vmax, чтобы найти все значения выше этого порога.

Если этого недостаточно, есть много более сложных методов поиска пиков во временных рядах, здесь обсуждаются некоторые простые:

Обнаружение пиков во временном ряду

Я бы, наверное, попробовал что-то вроде вычисления градиента и поиска 0 пересечений с vDSP_nzcros.

person Tark    schedule 02.01.2013
comment
Да, у меня есть 30 сэмплов в секунду, но я храню их в массиве и выдаю значения только после того, как обнаружу один удар, или, если удар не обнаружен, я просто добавляю новые значения в конец массива, и я удалите старые (то же количество значений, что и добавленное) с самого начала. По сути, мне нужно хранить в памяти достаточно значений, которые мне понадобятся для обнаружения биений в реальном времени. Я собираюсь изучить vDSP_maxv и посмотреть, что я могу там выяснить. Спасибо ! - person Andy; 02.01.2013