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

StackOverflow https://stackoverflow.com/questions/441438

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Нужна дополнительная информация.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Есть наивные реализации байесовского классификатора для нескольких языков, таких как nbc .

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top