¿Hay alguna forma de diferenciar el sonido del aire soplado del sonido normal a través del micrófono del teléfono?

He estado trabajando en una aplicación de Android que toma la entrada del micrófono cuando el usuario lo toca. Estoy usando un análisis de sonido basado en FFT y convirtiendo los valores en frecuencia usando un método de cruce por cero.

Todavía estoy insatisfecho con los resultados. Lo que quiero es que solo detecte el "soplo de aire" y genere un valor único, de modo que pueda ignorar todos los demás sonidos. He estado buscando mucho lo mismo en Google, pero no pude obtener ninguna respuesta clara. Espero encontrar alguna solución por aquí.

EDITAR: Ahora, realmente no tuve suficiente tiempo para investigar sobre las soluciones proporcionadas. Además, creo que tendré que tomar las fórmulas y crear mis propias clases en JAVA y llevará tiempo. Pero me gustaría compartir el enlace de la aplicación que publiqué. No es el más eficiente como mencioné en mi pregunta, pero funciona. El enlace de mi aplicación es:

Cumpleaños de Appy en Play Store

Me gustaría que los usuarios de Android lo prueben y también me den su opinión.

En términos generales, el ruido del viento debe eliminarse en la fuente, pero es continuo. Soplar en un micrófono se llevará a cabo en pulsos cortos de unos pocos segundos. Busque pulsos de muy baja frecuencia (0,2 Hz)
Oh, está bien, Jim, ¿y qué pasa con los métodos que estoy usando? Me refiero a FFT y cruce por cero. ¿Hay algún método en particular que me dé la frecuencia precisa?
Ninguno que yo sepa. Básicamente, estás lidiando con ráfagas de ruido.
El sonido capturado por un micrófono debido al aire que sopla sobre él definitivamente no es una frecuencia específica o un rango de frecuencias: el rango variaría según los parámetros nativos del micrófono, así como los de las etapas de amplificación. Lo que quizás desee detectar es una banda relativamente amplia de ruido blanco, a un nivel más alto que el ruido de fondo continuo, y consistente durante al menos un segundo. Si hay un conjunto específico de frecuencias predominantes, probablemente no sea el sonido del aire, sino más bien una voz, música u otros sonidos. Un ruido blanco más breve podría ser un impacto, etc.
Bien, una pregunta más, ¿sería mejor aplicar un filtro de paso bajo, para poder obtener una frecuencia precisa y luego poder tomar ese rango específico de frecuencia cada vez que soplo en el micrófono? Además, gracias por aclararme las cosas Jim y Anindo. He estado buscando mucho sobre esto. También estudiaré más sobre el ruido blanco ahora.
No. El soplado cubrirá una gran parte de la banda de frecuencia y se superpondrá con los datos de voz. Es poco probable que un filtro lineal simple elimine el ruido del viento, ¡o ya se habría hecho en telecomunicaciones!
Detectar la frecuencia mediante el cruce por cero no es lo ideal, ya que los sonidos del mundo real no son una onda sinusoidal de una sola frecuencia con cruces por cero regulares. Encuentre un osciloscopio, o simplemente vea las formas de onda de grabación de sonido en Audacity con el zoom máximo, para ver lo que realmente está tratando de capturar.

Respuestas (2)

La mayoría de los comentarios se centran en el problema más común de eliminar/ignorar el ruido para poder extraer el otro sonido. Desea hacer lo contrario: detectar sonidos de soplo de aire, rechazando todos los demás sonidos.

Primero, su método de cruce por cero no será muy útil para esto. El soplado de aire está cerca del ruido rosa en forma de señal, con algo de "tinte" en el espectro según la posición del ventilador, la posición del micrófono, la fabricación del teléfono, etc.

Debido a que dice que ya tiene FFT, ejecutaría cuadros repetidos de 50 ms aproximadamente y buscaría la firma de soplar en el micrófono. Probablemente será una distribución de espectro muy amplio sin picos agudos. Además, tendrá una duración superior a un solo fotograma.

Otras señales a menudo tendrán picos más distintos dentro del espectro. Por lo tanto, podría calcular qué tan bien se compara el espectro que obtiene con una distribución amplia similar al ruido rosa. Tenga en cuenta que la salida de la FFT no mantendrá los intervalos de frecuencia en orden creciente, sino en el orden de "mariposa", y cualquier otro valor de datos fuera de la FFT es fase, en lugar de amplitud, y por lo tanto no es interesante para este análisis.

Cuando tenga un sonido de "soplo" y un sonido de "fondo", tendrá un "piso de ruido" del sonido de soplo y picos individuales de los otros sonidos. Debe eliminar los picos y detectar el sonido de golpe en función de cualquier perfil que pueda "subyacer" a su espectro y aún así ajustar el sonido de golpe. Hay varias funciones de ajuste/regresión de curvas que puede usar aquí.

Al final, creo que aún tendrás problemas con este enfoque, ya que diferentes teléfonos tienen diferentes características de sonido. Es posible que deba "entrenar" la aplicación en el teléfono particular que el usuario está usando para obtener mejores resultados.

Bueno, tienes razón, definitivamente necesito saber al revés. Pero, al publicar mi pregunta aquí, obtuve bastante información e ideas. Acerca de centrarse en un solo dispositivo, es realmente difícil de hacer en Android. Hay múltiples proveedores y una amplia gama de dispositivos que ejecutan Android. Todo lo que puedo hacer es probarlo en varios dispositivos y esperar lo mejor. Pero es una buena idea la que diste y voy a buscar e implementar una función para calcular el "piso de ruido". Si tengo éxito, se lo haré saber a todos aquí.

Esto está más en la línea de un buen consejo, pero hay algunos consejos aquí, así que tenga paciencia.

Voy a atacar esto desde el punto de vista de un vocalista (que supuestamente lo soy). Las frases que comienzan con P, B y T (por ejemplo, siendo P la peor) envían una ráfaga de aire desde la boca al micrófono que es similar a alguien que sopla durante un corto período de tiempo.

Pon tu mano frente a tu boca y di POP. Deberías sentir lo que quiero decir.

¿Por qué estoy diciendo esto? Un requisito estándar para un micrófono de estudio es un filtro POP y esta es una gasa delgada estirada en un marco que evita en gran medida que los estallidos golpeen el micrófono. No atenúan el habla ni las voces reales; simplemente detienen el chorro de aire que golpea el diafragma del micrófono y convierte en una tontería lo que está tratando de grabar.

Otros micrófonos los tienen incrustados en la espuma circular negra en la que la gente canta. No son tan buenos pero funcionan bien para presentaciones en vivo.

Entonces, he establecido que el habla normal en un micrófono puede contener ráfagas de aire y esto hace que sea más complicado para ti diseñar algo que pueda diferenciar el habla normal y alguien que sopla.

Habrá un filtro pop en el micrófono de un teléfono Android y esto hará que su aplicación sea más difícil. Se verá como una pequeña pieza circular de material negro que cubre el micrófono electret.

Lo que puedo decir es que definitivamente habrá un contenido de baja frecuencia (por debajo de 100 Hz) cuando alguien toque un micrófono y recomendaría usar su PC, una tarjeta de sonido y un programa que pueda abrir y manipular archivos wav. Yo uso Wavelab pero hay algunos programas gratuitos. Registra algunos "golpes" y analiza los resultados. Si puede encontrar algo que reconozca los POP, entonces estoy interesado en lo que encuentre porque no hay filtros de hardware o software que yo sepa que se acerquen al filtro pop mecánico.

Probé algunos e incluso traté de modificar algunos de los filtros para eliminar los pops. Al final, volví a grabar o entré con un cuchillo en el archivo de onda y descuarticé las secciones que estaban saltando porque visualmente (en el archivo de onda) puedes verlas tan claras como el día.

Suena como un filtro de ondículas, o tal vez un comparador de patrones sería un buen enfoque para un filtro pop.
ok, voy a probar con esto. Voy a hacer la investigación sobre esto el fin de semana, ya que necesito continuar con el desarrollo de mi aplicación. Pero tengo muchas ganas de descifrar esto y te avisaría si descubro algún método para reconocer POP.