Учитывая звуковой поток, найти, когда дверь захлопывается (расчет уровня звукового давления?) - PullRequest
41 голосов
/ 01 февраля 2009

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

Слушайте: 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 кГц, и я бы хотел избежать большого количества обработки или хранения образцов.

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

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

Посмотрите:
alt text

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

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

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

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

-Adam

Ответы [ 9 ]

27 голосов
/ 01 февраля 2009

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

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

  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. Любой резкий шум, такой как хлопок, может рассматриваться как закрытие двери.

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

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

8 голосов
/ 01 февраля 2009

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

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

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

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

7 голосов
/ 01 февраля 2009

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

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

Удачи!

5 голосов
/ 01 февраля 2009

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

UPDATE

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

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))
4 голосов
/ 01 февраля 2009

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

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

3 голосов
/ 01 февраля 2009

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

Можно также использовать Фурье-анализ для устранения фоновых шумов, которые не связаны с закрытием двери.

0 голосов
/ 02 февраля 2009

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

0 голосов
/ 02 февраля 2009

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

0 голосов
/ 01 февраля 2009

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

...