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 un numerical integration de las muestras para averiguar la "energía" de la onda en un momento específico.
Un algoritmo aproximada sería:
- Divida las muestras en secciones
- calcular 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 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 añadir una advertencia de que no he probado esto.
De esta manera debe ser posible llevar a cabo sin tener todas las muestras grabadas primero. Mientras no es el tampón 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. Sin embargo, esto significa que habrá un retraso en el procesamiento, según la longitud 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, se observa 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 un décimo, por lo que la diferencia entre el silencio y el sonido repentino se puede notar, 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 era 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 del 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 causar el sonido ser extrañado
Creo que tanto el WINDOW_SIZE
como el THRESHOLD
van a tener que determinarse empíricamente para detectar el sonido que se va a detectar.
Con el fin de determinar cuántas muestras necesitará guardar este algoritmo en la memoria, digamos que WINDOW_SIZE
es 1/10 del sonido del cierre de la puerta, que es 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 puede realizarse con aritmética simple número entero si la fuente de audio se alimenta en 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 ocurre a 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 va a ser fácil de distinguir y es posible que no pueda detectar el cierre de la puerta.
- Se puede considerar cualquier ruido brusco, como un aplauso, ya que la puerta se está cerrando.
Tal vez, la combinación de las sugerencias en las otras respuestas, como se trata de analizar el registro de frecuencia de la puerta que se cierra mediante el análisis de Fourier, lo que requeriría un mayor procesamiento, pero haría menos propenso a errores.
Probablemente va a tomar un poco de experimentación antes de encontrar una manera de resolver este problema.
¿Es un acelerómetro una opción? – ccook
Incluyo un acelerómetro de triple eje en el tablero. Por cierto, también incluye un sensor de presión, sensor de luz, detección de interruptor de puerta, GPS y cámara. Si bien estas opciones están disponibles, lo ideal es que el diseño solo requiera el micrófono para la detección del cierre de la puerta. –
simplemente un pensamiento al azar, si casi siempre se sincroniza cuando se cierra, ¿por qué no solo detectar el clip? – aronchick