Dada una transmisión de audio, busque cuándo se cierra una puerta (¿cálculo del nivel de presión del sonido?)

11 minutos de lectura

avatar de usuario
adam davis

No muy diferente a un detector de aplausos (“¡Aplaude! aplaudir ¡Aplaude! aplaudir ¡Aplaude, aplaude, el badajo! aplaudir “) Necesito detectar cuando se cierra una puerta. Esto es en un vehículo, que es más fácil que la puerta de una habitación o casa:

Escucha: http://ubasics.com/so/van_driver_door_closing.wav

Mirar:
unnamed file 59

Está muestreando a 16 bits 4 khz, y me gustaría evitar mucho procesamiento o almacenamiento de muestras.

Cuando lo mira en audacity u otra herramienta de forma de onda, es bastante distintivo, y casi siempre se corta debido al aumento de la presión del sonido en el vehículo, incluso cuando las ventanas y otras puertas están abiertas:

Escucha: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

Mirar:
unnamed file 60

Espero que haya un algoritmo relativamente simple que tome lecturas a 4 kHz, 8 bits y realice un seguimiento del “estado estable”. Cuando el algoritmo detecta un aumento significativo en el nivel de sonido, marcaría el lugar.

  • ¿Cuáles son tus pensamientos?
  • ¿Cómo detectaría este evento?
  • ¿Hay ejemplos de código de cálculos de nivel de presión de sonido que puedan ayudar?
  • ¿Puedo salirme con la mía con un muestreo menos frecuente (1 kHz o incluso más lento?)

Actualizar: Jugar con Octave (análisis numérico de código abierto, similar a Matlab) y ver si la raíz cuadrada media me da lo que necesito (lo que resulta en algo muy similar al SPL)

Actualización2: Al calcular el RMS, se encuentra que la puerta se cierra fácilmente en el caso simple:
unnamed file 61 unnamed file 62

Ahora solo necesito ver los casos difíciles (radio encendida, calefacción/aire en alto, etc.). El CFAR se ve muy interesante. Sé que voy a tener que usar un algoritmo adaptativo, y el CFAR ciertamente cumple los requisitos.

-Adán

  • ¿Es un acelerómetro una opción?

    – cocinar

    1 de febrero de 2009 a las 6:51

  • Estoy incluyendo un acelerómetro de triple eje en el tablero. Por cierto, también incluye sensor de presión, sensor de luz, detección de interruptor de puerta, GPS y cámara. Si bien estas opciones están disponibles, idealmente el diseño solo requerirá el micrófono para detectar el cierre de la puerta.

    – Adán Davis

    1 de febrero de 2009 a las 6:54

  • solo un pensamiento aleatorio, si casi siempre se corta cuando se cierra, ¿por qué no simplemente detectar el clip?

    – aronchick

    7 mayo 2009 a las 18:18

  • @aronchick: porque hay tantos ruidos en el automóvil que también son lo suficientemente fuertes como para recortar, pero son diferentes en otros aspectos.

    – Adán Davis

    7 mayo 2009 a las 18:43

Mirando las capturas de pantalla de los archivos de audio de origen, una forma sencilla de detectar un cambio en el nivel de sonido sería hacer una integracion numerica de las muestras para averiguar la “energía” de la onda en un momento específico.

Un algoritmo aproximado sería:

  1. Divide las muestras en secciones.
  2. Calcular la energía de cada sección.
  3. Tome la relación de las energías entre la ventana anterior y la ventana actual
  4. Si la relación excede algún umbral, determine que hubo un ruido fuerte repentino.

pseudocódigo

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;

Debo agregar un descargo de responsabilidad de que no he probado esto.

Debería ser posible realizar esta forma sin tener todas las muestras registradas primero. Siempre que haya un búfer de cierta longitud (WINDOW_SIZE en el ejemplo), se puede realizar una integración numérica para calcular la energía de la sección de sonido. Sin embargo, esto significa que habrá un retraso en el procesamiento, dependiendo de la duración del WINDOW_SIZE. Determinar una buena duración para una sección de sonido es otra preocupación.

Cómo dividir en secciones

En el primer archivo de audio, parece que la duración del sonido de la puerta al cerrarse es de 0,25 segundos, por lo que la ventana utilizada para la integración numérica probablemente debería ser como máximo la mitad de eso, o incluso más como una décima, por lo que la diferencia entre el se puede notar el silencio y el sonido repentino, incluso si la ventana se superpone entre la sección de silencio y la sección de ruido.

Por ejemplo, si la ventana de integración fue de 0,5 segundos y la primera ventana cubrió los 0,25 segundos de silencio y los 0,25 segundos de cierre de la puerta, y la segunda ventana cubrió los 0,25 segundos de cierre de la puerta y 0,25 segundos de silencio, puede parecer que las dos secciones de sonido tienen el mismo nivel de ruido, por lo tanto, no activan la detección de sonido. Me imagino que tener una ventana corta aliviaría un poco este problema.

Sin embargo, tener una ventana demasiado corta significará que el aumento del sonido puede no encajar completamente en una ventana, y puede parecer que hay poca diferencia de energía entre las secciones adyacentes, lo que puede causar que el sonido se pierda.

creo que el WINDOW_SIZE y THRESHOLD ambos tendrán que determinarse empíricamente para el sonido que se va a detectar.

En aras de determinar cuántas muestras necesitará este algoritmo para mantener en la memoria, digamos, el WINDOW_SIZE es 1/10 del sonido de la puerta al cerrarse, que es de aproximadamente 0,025 segundos. A una frecuencia de muestreo de 4 kHz, es decir, 100 muestras. Eso parece no ser demasiado requisito de memoria. Usando muestras de 16 bits que son 200 bytes.

Ventajas desventajas

La ventaja de este método es que el procesamiento se puede realizar con aritmética de enteros simple si el audio de origen se alimenta como enteros. El problema es, como ya se mencionó, que el procesamiento en tiempo real tendrá un retraso, según el tamaño de la sección que se integre.

Hay un par de problemas que puedo pensar en este enfoque:

  1. Si el ruido de fondo es demasiado alto, la diferencia de energía entre el ruido de fondo y el cierre de la puerta no se distinguirá fácilmente y es posible que no pueda detectar el cierre de la puerta.
  2. Cualquier ruido brusco, como un aplauso, podría considerarse como si la puerta se estuviera cerrando.

Quizás, combinando las sugerencias en las otras respuestas, como tratar de analizar la firma de frecuencia del cierre de la puerta usando el análisis de Fourier, lo que requeriría más procesamiento pero lo haría menos propenso a errores.

Probablemente va a tomar un poco de experimentación antes de encontrar una manera de resolver este problema.

  • Me gusta mucho este enfoque, así que lo implementaré e informaré mis resultados aquí. En lugar de tener un umbral fijo, realizaré un seguimiento de la energía promedio y tendré un factor ajustable (es decir, la ventana debe ser 1.5+ veces el promedio para activarse).

    – Adán Davis

    14 de febrero de 2009 a las 14:50

avatar de usuario
James Caccese

Debe tocar los interruptores de cierre de puertas en el automóvil. Tratar de hacer esto con un análisis de sonido es un exceso de ingeniería.

Hay muchas sugerencias sobre los diferentes enfoques de procesamiento de señales que se pueden tomar, pero en realidad, para cuando aprenda sobre la teoría de detección, construya una placa de procesamiento de señales integrada, aprenda la arquitectura de procesamiento para el chip que eligió, intente un algoritmo, depúrelo, y luego sintonícelo para el automóvil en el que desea usarlo (y luego vuelva a sintonizarlo y volver a depurarlo para cualquier otro automóvil), deseará haber pegado con cinta adhesiva un interruptor de lengüeta dentro del automóvil y pegado un imán al puerta.

No es que no sea un problema interesante de resolver para los expertos en dsp, pero por la forma en que hace esta pregunta, está claro que el procesamiento de sonido no es la ruta que desea tomar. Será una pesadilla hacer que funcione bien.

Además, el badajo es solo un filtro de paso alto que se alimenta a un detector de umbral. (más un temporizador para asegurarse de que 2 aplausos juntos lo suficientemente rápido)

  • En muchas situaciones esta es la respuesta correcta. Si se puede hacer sin cablear los interruptores, entonces podemos evitar problemas de instalación, aumento de costos, problemas de responsabilidad y, dado que este dispositivo está destinado a ser reutilizado (no instalado permanentemente), el cableado no es óptimo. Aunque es una opción.

    – Adán Davis

    1 de febrero de 2009 a las 3:56

  • En algunos casos, como el cableado eléctrico de puertas corredizas o hatchback, puede ser necesario ya que el sonido del cierre no es tan enérgico, por lo que se requiere más procesamiento o ajuste personalizado (y, por lo tanto, configuración). Otro pensamiento fue colocar un sensor de luz cerca de una luz de cortesía, fácil de instalar y también funciona.

    – Adán Davis

    1 de febrero de 2009 a las 3:58

  • Tiendo a estar de acuerdo, pero eso no me impidió sugerir una forma de hacerlo algorítmicamente…. 🙂 +1

    – Drew Pasillo

    1 de febrero de 2009 a las 4:24

  • “Por la forma en que hace esta pregunta, está claro que el procesamiento de sonido no es la ruta que desea tomar”. ¿Qué pasa con la forma en que estoy haciendo la pregunta que sugiere eso? Con mucho gusto lo modificaré si estoy dando una falsa impresión de mi intención.

    – Adán Davis

    1 de febrero de 2009 a las 6:52

  • Lo siento si salí como un idiota, pero pareces nuevo en el procesamiento de señales. No quiero apagarlo si está buscando jugar o aprender, pero si desea crear una solución real para la detección de cierre de puertas en un período de tiempo razonable, el procesamiento de la señal de audio es probablemente la ruta más difícil.

    – James Caccese

    1 de febrero de 2009 a las 8:30

avatar de usuario
dibujó el salón

Hay mucha literatura relevante sobre este problema en el mundo de los radares (se llama teoría de detección).

Es posible que eche un vistazo a la detección de “promedio de células CFAR” (tasa constante de falsas alarmas). Wikipedia tiene un poco aquí. Tu idea es muy similar a esta, ¡y debería funcionar! 🙂

¡Buena suerte!

avatar de usuario
cocinar

Comenzaría mirando el espectro. Hice esto en los dos archivos de audio que diste, y parece haber alguna similitud que podrías usar. Por ejemplo, la principal diferencia entre los dos parece ser alrededor de 40-50 Hz. Mi .02.

ACTUALIZAR

Tuve otra idea después de publicar esto. Si puede, agregue un acelerómetro al dispositivo. Luego correlacionar las señales vibratorias y acústicas. Esto debería ayudar con la detección de puertas cruzadas del vehículo. Estoy pensando que debería estar bien correlacionado ya que el sonido está impulsado por vibraciones, mientras que el estéreo, por ejemplo, no lo está. He tenido un dispositivo que pudo detectar las rpm de mi motor con un montaje en el parabrisas (ventosa), por lo que la sensibilidad podría estar ahí. (¡No prometo que esto funcione!)

texto alternativo
(fuente: 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))

El proceso para encontrar un pico distinto en las señales de audio se llama detección transitoria. Aplicaciones como Ácido de Sony y Capaz de vivir utilice la detección de transitorios para encontrar los latidos en la música para hacer coincidir los latidos.

El pico distintivo que ve en la forma de onda de arriba se llama transitorio, y hay varios buenos algoritmos para detectarlo. El papel Detección y clasificación de transitorios en materia energética describe 3 métodos para hacer esto.

avatar de usuario
Llavero

Me imagino que la frecuencia y la amplitud también variarán significativamente de un vehículo a otro. La mejor manera de determinar eso sería tomando una muestra en un Civic versus un SUV grande. Tal vez podría hacer que el usuario cierre la puerta en un modo de “aprendizaje” para obtener la firma de amplitud y frecuencia. Entonces podría usar eso para comparar cuando está en modo de uso.

También podría considerar usar análisis de Fourier para eliminar los ruidos de fondo que no están asociados con el cierre de la puerta.

avatar de usuario
Szundi

Tal vez debería tratar de detectar un aumento instantáneo significativo en la presión del aire que debería marcar el cierre de una puerta. Puede emparejarlo con este análisis de forma de onda y nivel de sonido y todo esto podría darle un mejor resultado.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad