son - comparar objetos c#
¿Cómo puedo comparar dos capturas para ver cuál es más fuerte? (4)
Dadas dos matrices de bytes de datos capturados desde un micrófono, ¿cómo puedo determinar cuál tiene más picos en el ruido? Asumiría que hay un algoritmo que puedo aplicar a los datos, pero no tengo idea de dónde empezar.
Para llegar a eso, necesito poder determinar cuándo un bebé está llorando frente al ruido ambiental en la habitación.
Si ayuda, estoy usando la clase Microsoft.Xna.Framework.Audio.Microphone para capturar el sonido.
Estoy de acuerdo con @Ed Swangren, se necesitará mucho juego con muestras de datos para muchas fuentes. Para mí, parece que el truco será limitar o, con suerte, eliminar los falsos positivos. Mi experiencia con bebés es que lloran mucho más fuerte que el medio ambiente. por lo tanto, hacer un seguimiento de las mediciones promedio (freq / amp / ??) del entorno normal y luego clasificar qué tan bien los cambios coinciden con las características de un bebé llorando que cambia de niño a niño, por lo que es probable que desee un sistema que ''aprende''. La mejor de las suertes.
actualización: es posible que encuentre útil esta biblioteca http://naudio.codeplex.com/
Más fuerte en qué punto? La amplitud promedio de la señal le dirá cuál es más fuerte en promedio , pero es una manera tonta y de fuerza bruta de hacerlo. Sin embargo, puede funcionar para ti en la práctica.
Para llegar a eso, necesito poder determinar cuándo un bebé está llorando frente al ruido ambiental en la habitación.
Ok, entonces, estoy arrojando ideas aquí; De ninguna manera soy un experto en procesamiento de audio.
Si conoce su opinión, es decir, un llanto de bebé (relativamente fuerte con un tono alto) frente al ruido ambiental (relativamente silencioso), debe poder analizar la señal en términos de tono (frecuencia) y amplitud (volumen). Por supuesto, si durante la grabación alguien deja caer algunas ollas y sartenes en el piso de la cocina, será difícil de discernir.
Como primer paso, simplemente atravesaría la señal, manteniendo una desviación estándar de tono y amplitud en todo, y luego establecería un indicador cuando esas desviaciones saltasen más allá de algún umbral que deberías definir. Cuando regresen, es posible que pueda asumir de manera segura que capturó el llanto del bebé.
Nuevamente, solo te lanzo una idea aquí. Deberá ver cómo funciona en la práctica con datos reales.
puede convertir cada muestra (normalizada a un rango de 1.0 a -1.0) en una calificación de decibelios aplicando la fórmula
dB = 20 * log-base-10 (valor de la muestra)
Para ser honesto, siempre que no te moleste el falso positivo ocasional, y tu micrófono esté configurado correctamente, no deberías tener problemas para distinguir la diferencia entre el llanto de un bebé y el ruido de fondo ambiental, sin pasar por la molestia de hacer un FFT.
Te recomendaría que eches un vistazo al código fuente de una compuerta de ruido, que hace más o menos lo que buscas, con tiempos y umbrales de ataque configurables.
Primero use una Transformada Rápida de Fourier para transformar la señal en el dominio de la frecuencia. Luego, verifique si la señal en las típicas "frecuencias de llanto" es significativamente más alta que las otras amplitudes.
El preprocesador del códec speex admite detección de ruido frente a señal, pero no sé si puede hacer que funcione con XNA.
O si realmente quiere algún tipo de volumen, calcule la suma de cuadrados de las amplitudes de las frecuencias que le interesan (por ejemplo, 50-20000Hz) y si el promedio de eso en los últimos 30 segundos es significativamente más alto que el promedio sobre los últimos 10 minutos o excede un cierto umbral absoluto suena la alarma.