Как поймать событие, когда спектр звука достиг определенной высоты, например, событие, вызванное громким звуком?

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

Это то, что мне было нужно,

  1. Когда я воспроизвожу звук и звук достигает определенного порога, текущее время потока будет записано.

Большое спасибо. Мой крайний срок будет через 36 часов. Каждая помощь будет оценена. Мое будущее зависит от этого. Удачи мне. :) Спасибо, парни! Пожалуйста, дайте мне образец или точную вещь, чтобы сделать. Я дам вам свои ресурсы, если вам нужна дополнительная информация по моему проекту. Спасибо! Бог благословил.

P.S. Для этого проекта требуется детектор малого барабана. но у меня осталось не так много времени, поэтому я решил обнаружить не малый барабан, а самый высокий пик спектра, потому что большую часть времени малый барабан генерирует самый высокий пик, чем другие инструменты, такие как бас, тарелки. Спасибо, парни!


person Sam Araja    schedule 11.09.2011    source источник
comment
Я использую библиотеку NAudio. Я также видел проект SoundCatcher от codeproject. Но мне это не помогло, потому что структура моего кода отличается от него. и я просто новичок в С#.   -  person Sam Araja    schedule 11.09.2011
comment
Что вы подразумеваете под максимальным пиком спектра? Вы ищете пик на какой-то конкретной частоте? Или только на одной частоте? Если нет, вы можете рассчитать мощность сигнала во временной области.   -  person hotpaw2    schedule 11.09.2011


Ответы (3)


Пока вы можете генерировать постоянно обновляемый спектр, вам просто нужно повторять спектр после каждого обновления и проверять величины соответствующих бинов. Обычно вы можете перекрывать каждое окно образца, например. если ваш размер FFT и размер окна выборки N = 1024, то вы сначала берете FFT по выборкам 0..1023, затем следующий блок будет 512..1535. Это 50% перекрытие помогает уменьшить задержку при обнаружении (вы можете увеличить перекрытие, но если вы зайдете слишком далеко, это может стать слишком интенсивным вычислением).

person Paul R    schedule 11.09.2011

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

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

Этот подход называется "согласованная фильтрация" и хорошо известен в теории оптимального обнаружения.

person Ben Voigt    schedule 12.09.2011

Если вы просто хотите увидеть, когда сигнал станет очень мощным, вам не нужно БПФ. Вы можете использовать теорему Парсеваля, которая связывает силу временной и частотной областей. Это позволяет вам создать детектор энергии со скользящим окном O(1) из скользящего среднего значения квадратов выборок.

Кстати, это именно тот вопрос, который актуален на DSP Stack Exchange.

person Mark Borgerding    schedule 12.09.2011