Какой алгоритм я должен использовать для сигнальной (звуковой) классификации одного класса?

Обновить этот вопрос ранее назывался как " Дайте мне имя простого алгоритма для обнаружения паттерна сигнала (звука)"

  • Моя цель - обнаружить наличие заданного шаблона в шумном сигнале. Я хочу обнаружить присутствие вида насекомых, записывающего звуки с помощью микрофона. Я ранее записывал звук насекомого в цифровом формате.
  • Я не пытаюсь распознавать голос.
  • Я уже использую свертку между входным сигналом и шаблоном, чтобы определить их уровень подобия. Но я думаю, что этот метод больше подходит для дискретного времени (например, цифровой связи, где сигналы происходят с фиксированными интервалами) и различать входной сигнал между двумя заданными шаблонами (у меня есть только один шаблон).
  • Я боюсь использовать нейронные сети, потому что я их никогда не использовал, и я не знаю, могу ли я вставлять этот код.

Не могли бы вы указать мне некоторые другие подходы или попытаться убедить меня, что мой нынешний подход по-прежнему является хорошей идеей или что нейронные сети могут быть осуществимым способом?

Обновление У меня уже есть 2 хорошие ответы, но еще один приветствуется и даже вознаграждается.

Ответ 1

Шаг вверх от свертки динамическое деформирование времени, который можно рассматривать как оператор свертки, который растягивает и сжимает один сигнал, чтобы оптимально соответствовать другому.

Возможно, более простой подход состоял бы в том, чтобы выполнить БПФ выборки и определить, могут ли ваши насекомые какие-либо конкретные частоты, которые можно фильтровать.

На более сложной стороне, но не совсем нейронной сети, это инструментальные средства SVM, такие как libsvm и svmlight, что вы можете бросить свои данные.

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

Ответ 2

Требуется дополнительная информация.

Когда вы говорите шумный сигнал, что такое фоновый шум? Является ли оно в первом приближении стационарным (в статистическом смысле, т.е. Постоянным), или оно нестационарно (то есть, вероятно, будет содержать другие звуки, такие как другие вызовы животных и т.д.?)

Если фоновый шум нестационален, лучшим вариантом может быть использование Independent Components Analysis, который пытается отделить данный звуковой смеси в ее составные источники, вам даже не понадобится первоначальная запись самого насекомого. Многие программы ICA связаны со страницы Википедии.

(Edit: ICA - это случай Blind Source Separation (BSS), есть много других способов сделать BSS, и это может помочь для поиска их.)

Если, однако, фоновый шум неподвижен, проблема намного проще (хотя все еще очень тяжелая):

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

Затем вы можете попробовать сравнить разделы вашего отфильтрованного сигнала, которые содержат "больше энергии", чем в среднем, с вашим (фильтрованным) вызовом насекомых. Возможно, используя алгоритмы подобия изображения, предложенные А. Рексом.

Изменить. Поскольку фоновый шум нестационарный, я могу только предложить, чтобы поиск Blind Source Separation non- -Государственные источники могут привести к еще нескольким алгоритмам. Я боюсь, что ответ заключается в том, что существует не простой алгоритм, который будет делать то, что вы хотите.

Ответ 3

Звучит как типичная одна проблема классификации классов, т.е. вы хотите искать одну вещь в большом пуле других вещей, которые вам не нравятся о.

Что вы хотите сделать, это найти набор функций или дескрипторов, которые вы можете рассчитать для каждой короткой части своей сырой записи, которую вы можете сопоставить с функциями, которые производит ваша чистая запись. Я не думаю, что свертка обязательно плоха, хотя она довольно чувствительна к шуму, поэтому она может оказаться не оптимальной для вашего дела. То, что может на самом деле работать в вашем случае, - это сопоставление шаблонов при преобразовании прямоугольника. Вы принимаете преобразование Фурье вашего сигнала, предоставляя вам график зависимости мощности от частоты (а не график мощности и времени), тогда вы делите частоту в диапазонах, и вы берете среднюю мощность для каждой полосы в качестве функции. Если ваши данные содержат в основном белый шум, то патерн, который вы получаете от необработанного звука насекомого одинаковой длины, очень точно соответствует образцу вашего эталонного звука. Этот последний трюк был успешно использован (с некоторым окном) для взлома аудиокоманды, используемого google и другими, чтобы сделать свои сайты доступными для слепых.

Кстати, поскольку ваш необработанный звуковой сигнал является цифровым (иначе обработка с компьютером не будет работать;-)) свертка подходит. Вы должны выполнить свертку между вашим опорным сигналом и образцом равной длины от исходного ввода, начиная с каждого образца. Итак, если ваш опорный сигнал имеет длину N, а ваш необработанный образец имеет длину M, где M >= N, тогда вы должны выполнить M-N + 1 = P свертки между вашим опорным сигналом и P-образцами из вашего исходного ввода, начиная с 1. П. Лучшая возможность для размещения опорного звука в исходном образце пробы с наивысшим счетом свертке. Обратите внимание, что это очень быстро занимает время.

Согласование на основе преобразования Фурье, как я объяснял выше, используя 50% перекрывающихся выборок из ваших необработанных данных в два раза больше длины эталонного образца, по крайней мере, будет быстрее (хотя и не обязательно лучше).

Ответ 4

Если бы я был, вы немного начали бы читать немного о "Функции окна" , как окно Хэмминга, это хорошая отправная точка для распознавания звука. (Это, конечно, в сочетании с Преобразование Фурье)

Ответ 5

Вы можете попробовать сопоставленный фильтр. Хотя я никогда не использовал его, я слышал хорошие вещи.

Кроме того, хотя это и не просто, я думаю, что скрытая марковская модель (HMM, я знаю, что вы не сказали о распознавании речи, но выслушайте меня!) предоставит вам наилучшие результаты. Опять же, я никогда не использовал его, но есть версии с открытым исходным кодом, доступные повсюду. Вам просто нужно будет обучать его, используя вашу "чистую" запись насекомых. Вот одна реализация с открытым исходным кодом: Общая скрытая библиотека моделей Маркова.

Ответ 6

По общему признанию, это не моя область знаний, но моя первая мысль - рекурсивный фильтр наименьших квадратов - он выполняет автокорреляцию. Это похоже на фильтр свертки, который вы используете сейчас, но немного более продвинутый. Фильтрация Калмана является расширением этого - он используется для регенерации сигнала из нескольких шумных измерений, поэтому он, вероятно, не пригодится в этом случае. Я бы не отказался от офтальмологических нейронных сетей - они очень полезны в таких вещах (при условии, что вы их тренируете должным образом).

Думая об этом более подробно, я бы, вероятно, рекомендовал использовать БПФ. Скорее всего, сигнал, который вы ищете, очень ограничен по диапазону, и вам, вероятно, повезло бы с использованием полосового фильтра на данные, а затем на БПФ и, наконец, используя ваш простой фильтр свертки на этих данных вместо данных во временной области точки. Или сделайте оба и дважды получите данные. Я не занимаюсь математикой, поэтому я не могу сказать вам, если вы получите существенные (не линейно-зависимые) результаты с использованием этого метода, но единственное, что вы теряете, - это время.

Ответ 7

Вам может быть интересен MA Toolbox, реализация Matlab меры (ов) сходства.

Я лично нашел эту статью, Общая классификация звука и сходство в MPEG-7, интересно. Однако это может быть за платой (я не знаю), и это может быть не так полезно на практике.

Структура GPL-ed Marsyas имеет инструмент для классификации машинного обучения, называемый kea. Я предполагаю, что это, вероятно, не делает то, что вы хотите, или слишком много усилий для подключения.

Моя единственная идея иначе - принять преобразования Фурье, эффективно преобразуя ваши звуки в полутоновые изображения. Затем используйте один из многих алгоритмы подобия изображения.

Ответ 8

A Наивный байесовский классификатор может быть полезен здесь, классифицируя образцы звука в те, которые содержат ваши виды интересов, и те, которые этого не делают. Он работает достаточно хорошо для сложных явлений; Я когда-то использовал его, чтобы решить, содержит ли заданный набор данных RADAR в миллиметровом диапазоне препятствие, такое как кисть, ловушка резервуара и т.д. Что касается того, как разбить ваши непрерывные данные на дискретные куски для байесовского классификатора, вы можете просто сдвинуться вдоль непрерывный набор данных и обрывать куски, равные по длине, к вашему образцу насекомых. Например, если образец, с которым вы сравниваете, составляет 2 секунды, вы можете подавать дискриминатор 0-2, 0,5-2,5 с, 1-3 и т.д. Вам нужно будет обучить дискриминатора, но это обычное требование любого решения, основанного на машинах.

Подобные подходы касаются единственного способа, если у ваших видов насекомых нет единого, относительно отличного звука, который вы ищете. Кросс-корреляция/свертка имеют ограниченную полезность, если вы ищете что-то более сложное, чем один звук, который может быть выше или ниже.

Существуют наивные реализации классификаторов байесов для нескольких языков, например nbc.

Ответ 10

Google: алгоритм FastICA. Некоторые используют взаимозависимое разделение сигналов ICA и Blind-Source. Автор алгоритма написал фантастическую книгу о МКА, которая составляет около 40-60 долларов, использованных на амазонке.

Ответ 11

Goertzel - вы можете использовать его либо для простого обнаружения паттерна, так и для сложного разделения частот. Вы можете увидеть образец моя реализация в С#