Учитывая аудиопоток, определите, когда хлопает дверь (расчет уровня звукового давления?)

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

Вопрос

Мало чем отличается от детектора хлопков ("Хлопай дальше! хлоп , хлоп Хлопайте в ладоши! хлоп , хлоп Хлопай, хлопай, Хлопушка! хлоп , хлоп ") Мне нужно определить, когда закрывается дверь.Это делается в транспортном средстве, что проще, чем открыть дверь в комнате или домашнем хозяйстве:

Слушай: http://ubasics.com/so/van_driver_door_closing.wav

Смотри:
image of waveform shows steady line, then sudden disruption, settling down to steady line

Это выборка на частоте 16 бит 4 кГц, и я бы хотел избежать большой обработки или хранения выборок.

Когда вы смотрите на это в audacity или другом инструменте waveform, это довольно отчетливо и почти всегда фиксируется из-за увеличения звукового давления в автомобиле - даже когда окна и другие двери открыты:

Слушай: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

Смотри:
alt text

Я ожидаю, что существует относительно простой алгоритм, который будет снимать показания с частотой 4 кГц, 8 бит, и отслеживать "устойчивое состояние".Когда алгоритм обнаруживает значительное повышение уровня звука, он отмечает это место.

  • О чем вы думаете?
  • Как бы вы обнаружили это событие?
  • Существуют ли примеры кода для расчета уровня звукового давления, которые могли бы помочь?
  • Могу ли я обойтись менее частой выборкой (1 кГц или даже медленнее?)

Обновить: Играю с Octave (численный анализ с открытым исходным кодом - аналогично Matlab) и смотрю, даст ли мне среднеквадратичное значение то, что мне нужно (что приводит к чему-то очень похожему на SPL)

Обновление 2: Вычисляя среднеквадратичное значение, дверь легко закрывается в простом случае:
alt text alt text
Теперь мне просто нужно взглянуть на сложные случаи (включенное радио, высокая температура воздуха и т.д.).CFAR выглядит действительно интересно - я знаю, что мне придется использовать адаптивный алгоритм, и CFAR, безусловно, подходит по всем параметрам.

-Адам

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

Решение

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

Грубый алгоритм был бы следующим:

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

Псевдокод

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 байт.

Преимущества / Недостатки

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

Есть пара проблем, о которых я могу подумать при таком подходе:

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

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

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

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

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

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

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

Кроме того, хлопушка - это всего лишь фильтр высоких частот, подаваемый в пороговый детектор.(плюс таймер, чтобы убедиться, что 2 хлопка достаточно быстро хлопают вместе)

В мире радаров существует много соответствующей литературы по этой проблеме (она называется теорией обнаружения).

Вы могли бы взглянуть на обнаружение "cell averaging CFAR" (постоянная частота ложных срабатываний).В Википедии есть немного здесь.Ваша идея очень похожа на эту, и она должна сработать!:)

Удачи!

Я бы начал с рассмотрения спектрального.Я сделал это с двумя аудиофайлами, которые вы предоставили, и, похоже, есть некоторое сходство, которое вы могли бы использовать.Например, основное различие между ними, по-видимому, составляет около 40-50 Гц.Мой .02.

Обновить

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

alt text
(источник: charlesrcook.com)

%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001

%% Van driver door
data = wavread('van_driver_door_closing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

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

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

Я бы предположил, что частота и амплитуда также будут значительно варьироваться от транспортного средства к транспортному средству.Лучший способ определить это - взять пробу у Civic в сравнении с большим внедорожником.Возможно, вы могли бы попросить пользователя закрыть дверь в режиме "обучения", чтобы получить амплитудную и частотную сигнатуру.Затем вы могли бы использовать это для сравнения в режиме использования.

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

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

Что касается менее частой выборки, то самая высокая звуковая частота, которая может быть зафиксирована, составляет половину частоты дискретизации.Таким образом, если звук двери автомобиля был самым сильным на частоте 1000 Гц (например), то при частоте дискретизации ниже 2000 Гц этот звук был бы полностью утрачен

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

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