38 votos

Dada una secuencia de audio, encontrar cuando una puerta se cierra de golpe (nivel de presión de sonido de cálculo?)

No a diferencia de un clap detector ("Clap! clap clap Clap! clap clap Clap, clap off, el Badajo! clap clap ") necesito para detectar cuando una puerta se cierra. Esto es, en un vehículo, que es más fácil que una habitación o la casa de la puerta:

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

Mira:
image of waveform shows steady line, then sudden disruption, settling down to steady line

Es el muestreo de 16 bits 4khz, y me gustaría evitar un montón de procesamiento o almacenamiento de las muestras.

Cuando usted mira en la audacia y la otra de forma de onda de la herramienta es muy distintivo, y casi siempre clips debido al aumento de la presión de sonido en el vehículo - incluso cuando las ventanas y puertas están abiertas:

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

Mira:
alt text

Espero que haya una relativamente simple algoritmo que tome las lecturas en 4 khz, 8 bits, y de seguir la pista de la "situación estable". Cuando el algoritmo detecta un aumento significativo en el nivel de sonido que marcaría el lugar.

  • ¿Cuáles son tus pensamientos?
  • ¿Cómo se detecta este evento?
  • Hay ejemplos de código de nivel de presión de sonido cálculos que podrían ayudar?
  • Puedo conseguir lejos con menos frecuencia de toma de muestras (1kHz o incluso más lento?)

Actualización: Jugando con la Octava (open source análisis numérico - similar a Matlab) y ver si la raíz cuadrada de la media aritmética me dará lo que necesito (lo que resulta en algo muy similar a la SPL)

Update2: Computación en la RMS encuentra la puerta cerrar fácilmente en el caso sencillo:
alt text alt text
Ahora solo tengo que mirar en los casos difíciles (radio, de calor/aire en alto, etc). El CFAR se ve muy interesante - sé que me voy a tener que usar un algoritmo adaptativo, y CFAR sin duda se ajusta a la ley.

23voto

coobird Puntos 70356

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 integración numérica de las muestras para averiguar la "energía" de la onda en un tiempo específico.

Un áspero algoritmo sería:

  1. Dividir las muestras en secciones
  2. Calcular la energía de cada sección
  3. Tome la proporción de las energías entre la anterior ventana y de la ventana actual
  4. Si la proporción supera cierto umbral, determinar que hubo un repentino ruido fuerte.

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 que no he probado este.

De esta manera, debe ser posible para ser realizado sin tener las muestras de todos los registrados en primer lugar. Mientras hay búfer de cierta longitud (WINDOW_SIZE en el ejemplo), una integración numérica se puede realizar para calcular la energía de la sección de sonido. Esto no significa, sin embargo, que habrá un retraso en el procesamiento, dependiendo de la duración de la WINDOW_SIZE. La determinación de una buena longitud para una sección de sonido es otro motivo de preocupación.

Cómo Dividir en Secciones

En el primer archivo de audio, parece que la duración del sonido de la puerta de cierre es de 0,25 segundos, por lo que la ventana que se utiliza para la integración numérica debe ser, probablemente, en más de la mitad de los que, o aún más como un décimo, por lo que la diferencia entre el silencio y de repente, el sonido puede ser notado, incluso si la ventana es la superposición entre el silencio y la sección de ruido sección.

Por ejemplo, si la ventana de integración fue de 0,5 segundos, y la primera ventana estaba cubriendo el 0,25 segundos de silencio y de 0,25 segundos de cierre de puerta, y la segunda ventana estaba cubriendo 0,25 segundos de cierre de puerta y de 0,25 segundos de silencio, puede parecer que las dos secciones de sonido tiene el mismo nivel de ruido, por lo tanto, no activación de la detección de sonido. Me imagino que tiene una corta ventana de aliviar este problema de alguna manera.

Sin embargo, tener una ventana que es demasiado corto significa que el aumento en el sonido no se puede encajar en una ventana, y se puede apppear que hay poca diferencia en energía entre las secciones adyacentes, lo que puede provocar que el sonido se puede perder.

Creo que el WINDOW_SIZE y THRESHOLD son a la vez va a tener que ser determinada empíricamente para el sonido que va a ser detectado.

Por el bien de determinar el número de muestras que este algoritmo será necesario para mantener en la memoria, digamos, el WINDOW_SIZE es de 1/10 de el sonido de la puerta que se cierra, que es de alrededor de 0.025 segundo. A una velocidad de muestreo de 4 kHz, que es de 100 muestras. Que parece no ser demasiado de un requisito de memoria. Utilizando 16 bits muestras de 200 bytes.

Ventajas / Desventajas

La ventaja de este método es que el procesamiento se puede realizar con simple aritmética de enteros si la fuente de audio es alimentado en como enteros. El problema es, como ya se mencionó, que el procesamiento en tiempo real va a tener un retraso, dependiendo del tamaño de la sección en la que está integrado.

Hay un par de problemas que me puede pensar de 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 distinguen fácilmente, y puede no ser capaz de detectar el cierre de la puerta.
  2. Abrupta de ruido, tales como aplaudir, podría ser considerado como la puerta se está cerrando.

Tal vez, la combinación de las sugerencias de las otras respuestas, tales como tratando de analizar la frecuencia de la firma de el cierre de la puerta mediante el análisis de Fourier, que requieren más procesamiento, pero que sea menos propenso a errores.

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

8voto

James Caccese Puntos 730

Debe conectarse a la puerta de cierre de los interruptores en el coche. Tratando de hacer esto con el análisis del sonido está automatizando.

Hay un montón de sugerencias sobre los diferentes procesamiento de la señal enfoques para tomar, pero realmente, por el tiempo que usted aprenda acerca de la detección de teoría, construir un integrado de procesamiento de la señal de la junta, aprender el procesamiento de arquitectura para el chip que usted eligió, el intento de un algoritmo, depurar y, a continuación, optimizar para el coche que desea utilizar y, a continuación, volver a sintonizar y re-debug por cada otro coche), estarás deseando que acaba de stickey grabado una caña interruptor en el interior del coche y hotglued un imán a la puerta.

No es que no es un problema interesante para resolver el dsp expertos, pero de la forma en que estás haciendo esta pregunta, es claro que el sonido de procesamiento no es la ruta que desea tomar. Se acaba de ser una pesadilla para que funcione.

También, el badajo es sólo un filtro de paso alto de la fed en un umbral del detector. (además de un temporizador para asegurarse de 2 palmadas con la rapidez suficiente juntos)

6voto

Drew Hall Puntos 15917

Hay un montón de literatura relevante sobre este problema en el radar del mundo (se llama teoría de detección).

Usted puede tener una mirada en la "celda de un promedio de CFAR" (constante tasa de falsa alarma) de detección. Wikipedia tiene un poco aquí. Su idea es muy similar a este, y se debe trabajar! :)

Buena suerte!

5voto

ccook Puntos 3190

Me gustaría empezar por mirar el espectral. Hice esto en los dos archivos de audio que usted dio, y parece que hay cierta similitud que se puede utilizar. Por ejemplo, la diferencia principal entre los dos parece ser de alrededor de 40-50 hz. Mi .02.

ACTUALIZACIÓN

Yo tenía otra idea de que después de la publicación de este. Si puedes, agregar un acelerómetro en el dispositivo. Luego correlacionar la vibración, y las señales acústicas. Esto debería ayudar con la puerta del vehículo de detección. Estoy pensando que debe ser bien correlacionados, pues el sonido es vibracionalmente impulsado, wheres el estéreo por ejemplo, no lo es. He tenido un dispositivo capaz de detectar mi rpm del motor con un soporte de parabrisas (ventosa), de manera que la sensibilidad que podría estar allí. (Yo no hago promesas que esto funciona!)

alt text

%% 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))

4voto

Nick Haddad Puntos 4326

El proceso para encontrar distintas aumento en las señales de audio se llama detección de transientes. Aplicaciones como Sony Acid y Ableton Live uso transitorio de detección para encontrar los beats de la música para hacer beat matching.

Las distintas spike puede ver en la forma de onda de arriba se llama una transitoria, y hay varios buenos algoritmos para la detección de la misma. El papel Transitorio de la detección y la clasificación en materia energética, se describen los 3 métodos para hacer esto.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X