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

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

Pregunta

No a diferencia de un clap detector ("Palmada en! clap clap Clap de descuento! clap clap Palmada en, 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: El cómputo de 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.

-Adam

¿Fue útil?

Solución

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.

Yo 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, la 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.

Otros consejos

Debe tocar los interruptores de cierre de puerta en el automóvil. Intentar hacer esto con un análisis de sonido es una ingeniería excesiva.

Hay muchas sugerencias sobre diferentes procesamientos de señal enfoques para tomar, pero realmente, para cuando aprenda sobre la detección teoría, construir una placa de procesamiento de señal integrada, aprender el procesamiento arquitectura 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 sintonizar y depurar de nuevo para cualquier otro automóvil), desearás simplemente pegar con cinta adhesiva una caña cambie dentro del auto y pegue un imán a la puerta.

No es que no sea un problema interesante de resolver para los expertos de dsp, pero por la forma en que haces esta pregunta, está claro que suena el procesamiento no es la ruta que desea tomar. Solo será una pesadilla para que funcione correctamente.

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

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

Puede que eche un vistazo a " promedio de celdas CFAR " (frecuencia de alarma falsa constante) detección. Wikipedia tiene un poco aquí . Su idea es muy similar a esta, ¡y debería funcionar! :)

¡Buena suerte!

Empezarí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 estar alrededor de 40-50Hz. Mi .02.

UPDATE

Tuve otra idea después de publicar esto. Si puede, agregue un acelerómetro en el dispositivo. Luego, correlacione las señales vibratorias y acústicas . Esto debería ayudar con la detección de puertas cruzadas de vehículos. Estoy pensando que debería estar bien correlacionado ya que el sonido es impulsado vibracionalmente, mientras que el estéreo no lo es. He tenido un dispositivo que fue capaz de detectar las rpm de mi motor con un soporte de parabrisas (ventosa), por lo que la sensibilidad podría estar allí. (¡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 Ableton Live utiliza la detección transitoria para encontrar los ritmos en la música para hacer coincidir los ritmos.

El pico distintivo que ves en la forma de onda anterior se llama transitorio, y existen varios algoritmos buenos para detectarlo. El artículo describe 3 métodos para hacer esto.

Quizás debería intentar 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.

En el tema del muestreo menos frecuente, la frecuencia de sonido más alta que se puede capturar es la mitad de la frecuencia de muestreo. Por lo tanto, si el sonido de la puerta del automóvil fuera más fuerte a 1000Hz (por ejemplo), una frecuencia de muestreo por debajo de 2000Hz lo perdería por completo

Una compuerta de ruido muy simple probablemente funcionaría bien en su situación. Simplemente espere la primera muestra cuya amplitud esté por encima de un valor umbral especificado (para evitar disparar con ruido de fondo). Solo necesitaría ser más complicado que esto si necesita distinguir entre diferentes tipos de ruido (por ejemplo, un cierre de puerta frente a un aplauso).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top