transmitir - Dada una transmisión de audio, ¿encuentra cuándo se cierra una puerta(cálculo del nivel de presión sonora?)
transmitir en vivo youtube android (9)
Al observar las capturas de pantalla de los archivos de audio fuente, una manera simple de detectar un cambio en el nivel de sonido sería hacer una integración numérica de las muestras para descubrir la "energía" de la onda en un momento específico.
Un algoritmo aproximado sería:
- Divida las muestras en secciones
- Calcule la energía de cada sección
- Tome la relación de las energías entre la ventana anterior y la ventana actual
- Si la proporción supera 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 añadir un descargo de responsabilidad que no he probado esto.
De esta manera debería ser posible realizar sin tener todas las muestras registradas primero. Siempre que haya memoria intermedia 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 de 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 del cierre de la puerta es 0,25 segundos, por lo que la ventana utilizada para la integración numérica probablemente sea como máximo la mitad, o incluso más como una décima, por lo que la diferencia entre Se puede notar silencio y un sonido repentino, incluso si la ventana se superpone entre la sección silenciosa y la sección de ruido.
Por ejemplo, si la ventana de integración fue de 0.5 segundos, y la primera ventana cubría los 0.25 segundos de silencio y 0.25 segundos de cierre de la puerta, y la segunda ventana cubría 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 significa que el aumento en el sonido puede no encajar completamente en una ventana, y puede darse cuenta de que hay poca diferencia de energía entre las secciones adyacentes, lo que puede ocasionar que el sonido se pierda.
Creo que WINDOW_SIZE
y THRESHOLD
van a tener que determinarse empíricamente para el sonido que se va a detectar.
Con el fin de determinar cuántas muestras tendrá que guardar este algoritmo en la memoria, digamos que WINDOW_SIZE
es 1/10 del sonido del cierre de la puerta, que es de aproximadamente 0.025 segundos. A una velocidad de muestreo de 4 kHz, eso es 100 muestras. Eso parece no ser un requisito de memoria demasiado grande. 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 simples si el audio de origen se introduce como enteros. La captura es, como ya se mencionó, que el procesamiento en tiempo real tendrá un retraso, dependiendo del tamaño de la sección que esté integrada.
Hay un par de problemas que se me ocurren en este enfoque:
- 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.
- Cualquier ruido brusco, como un aplauso, podría considerarse como la puerta se está 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 al error.
Probablemente va a tomar un poco de experimentación antes de encontrar una manera de resolver este problema.
No muy diferente de un detector de aplausos ("¡ Palmada ! ¡ Palmada ! ¡Clap off! Clap clap Clap on, clap off, clapper! Clap clap ") Necesito detectar cuándo se cierra una puerta. Esto está en un vehículo, que es más fácil que una puerta de la habitación o del hogar:
Escuchar: http://ubasics.com/so/van_driver_door_closing.wav
Está muestreando a 16bits 4khz, y me gustaría evitar mucho procesamiento o almacenamiento de muestras.
Cuando lo mira con audacia u otra herramienta de forma de onda, es bastante distintivo, y casi siempre se recorta debido al aumento de la presión acústica en el vehículo, incluso cuando las ventanas y otras puertas están abiertas:
Escuchar: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav
Espero que haya un algoritmo relativamente simple que tome lecturas a 4 kHz, 8 bits, y haga un seguimiento del "estado estable". Cuando el algoritmo detecta un aumento significativo en el nivel de sonido, marcaría el punto.
- ¿Cuáles son tus pensamientos?
- ¿Cómo detectarías este evento?
- ¿Hay ejemplos de códigos de cálculos de nivel de presión sonora que podrían ayudar?
- ¿Puedo salir con un muestreo menos frecuente (1kHz o incluso más lento?)
Actualización: Jugar con Octave (análisis numérico de código abierto, similar a Matlab) y ver si el cuadrado medio de raíz me dará lo que necesito (lo que da como resultado algo muy similar al SPL)
Actualización2: calcular el RMS encuentra que la puerta se cierra fácilmente en el caso simple:
Ahora solo necesito ver los casos difíciles (radio encendida, calefacción / aire en altura, etc.). El CFAR parece realmente interesante: sé que voy a tener que usar un algoritmo adaptativo, y CFAR sin duda encaja.
-Adán
Comenzaría mirando el espectro. Hice esto en los dos archivos de audio que diste, y parece que hay alguna similitud que podrías usar. Por ejemplo, la principal diferencia entre los dos parece ser alrededor de 40-50Hz. Mi .02.
ACTUALIZAR
Tuve otra idea después de publicar esto. Si puede, agregue un acelerómetro en el dispositivo. Luego correlaciona las señales vibratorias y acústicas . Esto debería ayudar con la detección cruzada de la puerta del vehículo. Estoy pensando que debería estar bien correlacionado ya que el sonido es impulsado por vibración, por ejemplo, el estéreo no lo está. He tenido un dispositivo que fue capaz de detectar las rpm de mi motor con una montura de parabrisas (ventosa), por lo que la sensibilidad podría estar allí. (¡No prometo que esto funciona!)
texto alternativo http://www.charlesrcook.com/spectral.jpg
%% 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))
Debería tocar los interruptores de cierre de la puerta del automóvil. Intentar hacer esto con análisis de sonido es una sobreingeniería.
Hay muchas sugerencias sobre diferentes enfoques de procesamiento de señal, pero realmente, cuando aprendes acerca de la teoría de detección, construyes una placa de procesamiento de señal integrada, aprendes la arquitectura de procesamiento para el chip que eliges, intentas un algoritmo, lo depuramos, y luego sintonizarlo para el automóvil en el que desea usarlo (y luego volver a sintonizarlo y volver a depurarlo para cada otro automóvil), deseará que solo Stickey pegue un interruptor de láminas dentro del automóvil y coloque un imán en el 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 para que funcione bien.
Además, la claqueta es solo un filtro de paso alto alimentado a un detector de umbral. (más un temporizador para asegurarse de que 2 aplauden lo suficientemente rápido)
El proceso para encontrar un pico distinto en las señales de audio se llama detección transitoria . Las aplicaciones como Acid de Sony y Ableton Live usan la detección de transitorios para encontrar los ritmos en la música para hacer combinaciones de tiempos.
El pico distintivo que ves en la forma de onda anterior se llama transitorio, y hay varios buenos algoritmos para detectarlo. El documento Detección y clasificación de transitorios en materia de energía describe 3 métodos para hacerlo.
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 era más fuerte a 1000 Hz (por ejemplo), entonces una frecuencia de muestreo por debajo de 2000 Hz perdería ese sonido por completo.
Hay mucha literatura relevante sobre este problema en el mundo de los radares (se llama teoría de detección).
Puede echar un vistazo a la detección de "promediación celular CFAR" (frecuencia de falsa alarma constante). Wikipedia tiene un poco here . Tu idea es muy similar a esto, ¡y debería funcionar! :)
¡Buena suerte!
Me imagino que la frecuencia y la amplitud también variarían significativamente de un vehículo a otro. La mejor forma de determinar eso sería tomar una muestra en un Civic versus un SUV grande. Quizás podría hacer que el usuario cierre la puerta en un modo de "aprendizaje" para obtener la firma de amplitud y frecuencia. Entonces podrías usar eso para comparar cuándo está en modo de uso.
También podría considerar usar el análisis de Fourier para eliminar los ruidos de fondo que no están asociados con el cierre de la puerta.
Tal vez deberías tratar de detectar una elevación instantánea significativa en la presión de aire que debería marcar una puerta cercana. Puede emparejarlo con esta forma de onda y análisis de nivel de sonido, y todos estos podrían darle un mejor resultado.
Una puerta 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 el disparo con ruido de fondo). Solo necesita hacerse más complicado que esto si necesita distinguir entre los diferentes tipos de ruido (por ejemplo, el cierre de una puerta frente a una palmada).