Какой алгоритм следует использовать для классификации сигнала (звука) одного класса? - PullRequest
12 голосов
/ 14 января 2009

Обновление Этот вопрос ранее назывался ". Назовите имя простого алгоритма обнаружения шаблона сигнала (звука) "

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

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

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

Ответы [ 11 ]

11 голосов
/ 14 января 2009

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

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

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

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

3 голосов
/ 27 января 2009

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

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

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

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

3 голосов
/ 27 января 2009

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

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

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

(Изменить: ICA - это случай Слепое разделение источников (BSS), есть много других способов сделать BSS, и это также может помочь в их поиске.)

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

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

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

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

2 голосов
/ 27 января 2009

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

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

2 голосов
/ 27 января 2009

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

Также, хотя и не просто, я думаю, что Скрытая Марковская Модель (HMM, я знаю, что вы сказали, что не распознаваете речь, но выслушайте меня!) Обеспечит вам лучшие результаты. Опять же, я никогда не использовал его, но есть повсеместно доступные реализации с открытым исходным кодом. Вам просто нужно потренировать его, используя вашу существующую «чистую» запись насекомых. Вот одна из реализаций с открытым исходным кодом: General Hidden Markov Model Library .

2 голосов
/ 14 января 2009

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

1 голос
/ 28 февраля 2014

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

1 голос
/ 29 января 2009

Возможно, вам понадобится подход Винера .

1 голос
/ 27 января 2009

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

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

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

1 голос
/ 27 января 2009

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

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

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

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

...