Если посмотреть на скриншоты исходных аудиофайлов, одним простым способом обнаружить изменение уровня звука было бы сделать numerical integration образцов, чтобы узнать «энергию» волны в определенное время.
Грубая алгоритм будет:
- Разделите образцы на секцию
- Вычислить энергию каждой секции
- взять отношение энергий между предыдущим окном и текущим окном
- Если соотношение превышает некоторый порог, определите, что произошел внезапный громкий шум.
ПСЕВДОКОД
samples = load_audio_samples() // Array containing audio samples
WINDOW_SIZE = 1000 // Sample window of 1000 samples (example)
for (i = 0; i < samples.length; i += WINDOW_SIZE):
// Perform a numerical integration of the current window using simple
// addition of current sample to a sum.
for (j = 0; j < WINDOW_SIZE; j++):
energy += samples[i+j]
// Take ratio of energies of last window and current window, and see
// if there is a big difference in the energies. If so, there is a
// sudden loud noise.
if (energy/last_energy > THRESHOLD):
sudden_sound_detected()
last_energy = energy
energy = 0;
Я хотел бы добавить оговорку, что я не пробовал это.
Этот способ должен быть выполнен без предварительного отбора образцов. До тех пор, пока в примере есть буфер некоторой длины (WINDOW_SIZE
), можно вычислить численное интегрирование для вычисления энергии участка звука. Это означает, однако, что задержка в обработке будет зависеть от длины WINDOW_SIZE
. Еще одна проблема заключается в определении хорошей длины для раздела звука.
Как разделить на секцию
В первом звуковом файле, представляется, что длительность звука закрытия двери составляет 0,25 секунды, так что окно, используемое для численного интегрирования следует, вероятно, не более половины из этого или даже больше, как десятая, так что разница между тишиной и внезапным звуком может быть замечена, даже если окно перекрывается между тихой секцией и секцией шума.
Например, если окно интеграции составляло 0,5 секунды, а первое окно охватывало 0,25 секунды молчания и 0,25 секунды закрытия двери, а второе окно закрывало 0,25 секунды закрытия двери и 0,25 секунды молчания, может показаться, что два раздела звука имеют одинаковый уровень шума, поэтому не запускают обнаружение звука. Я предполагаю, что короткое окно облегчит эту проблему.
Однако наличие слишком короткого окна будет означать, что повышение звука может не полностью вписаться в одно окно, и может показаться, что между соседними разделами мало различий в энергии, что может вызвать звук пропущен.
Я считаю, что WINDOW_SIZE
и THRESHOLD
оба должны быть определены эмпирически для звука, который будет обнаружен.
Для определения количества образцов, которые этот алгоритм должен хранить в памяти, скажем, WINDOW_SIZE
- это 1/10 звука закрытия двери, что составляет около 0,025 секунды. При частоте дискретизации 4 кГц, то есть 100 выборок. Похоже, что это не слишком большая потребность в памяти. Использование 16-разрядных образцов, которые составляют 200 байт.
Преимущества/Недостатки
Преимущество этого способа состоит в том, что обработка может быть выполнена с простым целочисленной арифметики, если источник звука подается в виде целых чисел. Уловка, как уже упоминалось, что обработка в реальном времени будет иметь задержку, в зависимости от размера раздела, который интегрирован.
Есть несколько проблем, которые я могу думать о таком подходе:
- Если фоновый шум слишком громкий, разница в энергии между фоновым шумом и закрыванием двери не будет легко отличить , и он не сможет обнаружить закрытие двери.
- Любой резкий шум, такой как хлопок, можно рассматривать как закрывающуюся дверь.
Возможно, комбинация предложений в других ответах, таких как попытка проанализировать частотную подпись закрытия двери с использованием анализа Фурье, что потребует большей обработки, но сделает ее менее подверженной ошибкам.
Скорее всего, это займет некоторое время, прежде чем найти способ решить эту проблему.
Возможно ли использовать акселерометр? – ccook
Я включил акселерометр с тройной осью на доске. Кстати, он также включает датчик давления, датчик освещенности, обнаружение дверного переключателя, GPS и камеру. Хотя эти варианты доступны, в идеале дизайн потребует только микрофон для обнаружения закрытия двери. –
просто случайная мысль - если она почти всегда зажимается, когда она закрывается - почему бы просто не обнаружить клип? – aronchick