algorithm - ¿Qué algoritmo debería usar para la clasificación de una clase de señal(sonido)?
audio pattern-matching (11)
La actualización de esta pregunta se tituló anteriormente como " Dame el nombre de un algoritmo simple para la detección de patrones de señal (sonido) "
- Mi objetivo es detectar la presencia de un patrón dado en una señal ruidosa. Quiero detectar la presencia de una especie de insecto que registra los sonidos con un micrófono. Ya grabé previamente el sonido del insecto en un formato digital.
- No estoy tratando de hacer reconocimiento de voz.
- Ya estoy usando convolución entre la señal de entrada y el patrón para determinar su nivel de similitud. Pero creo que esta técnica es más adecuada para el tiempo discreto (es decir, las comunicaciones digitales, donde las señales se producen a intervalos fijos) y para distinguir una señal de entrada entre 2 patrones determinados (tengo un solo patrón).
- Tengo miedo de usar redes neuronales, porque nunca las usé, y no sé si podría insertar ese código.
¿Podrían por favor señalarme otros enfoques o tratar de convencerme de que mi enfoque actual sigue siendo una buena idea o que las redes neuronales pueden ser factibles?
Actualizar Ya tengo 2 buenas respuestas, pero otra sería bienvenida, e incluso recompensada.
Si fuera así, comenzarías a leer un poco sobre las funciones de la ventana, como la ventana de Hamming, este es un buen punto de partida para el reconocimiento de sonido. (Esto es, por supuesto, combinado con la Transformación de Fourier )
Un paso adelante de la convolución es el time-warming dinámico, que puede considerarse como un operador de convolución que estira y reduce una señal para coincidir de manera óptima con otra.
Tal vez un enfoque más simple sería hacer una FFT de la muestra y determinar si su insecto tiene frecuencias particulares que se pueden filtrar.
En el lado más complejo, pero no en una red neuronal, están los kits de herramientas SVM como libsvm y svmlight en los que puede arrojar sus datos.
Independientemente del camino que intentes, me gustaría dedicar tiempo a explorar la naturaleza del sonido que hace tu insecto usando herramientas como FFT. Después de todo, será más fácil enseñar a una computadora a clasificar el sonido si puede hacerlo usted mismo.
Es cierto que esta no es mi área de especialización, pero mi primer pensamiento es un filtro recursivo de mínimos cuadrados : realiza la autocorrelación. Es similar al filtro de convolución que estás usando ahora, pero un poco más avanzado. El filtrado de Kalman es una extensión de esto: se usa para regenerar una señal de múltiples mediciones ruidosas, por lo que probablemente no sea útil en este caso. No rechazaría las redes neuronales improvisadas, son muy útiles en este tipo de cosas (siempre que las entrene adecuadamente).
Pensando en esto más a fondo, probablemente recomendaría usar una FFT. Lo más probable es que la señal que estás buscando esté muy limitada, y probablemente tengas más suerte usando un filtro de paso de banda en los datos, luego una FFT y finalmente usando tu filtro de convolución simple en lugar de los datos de dominio de tiempo puntos. O haga ambas cosas y tenga el doble de datos. No me gustan las matemáticas, así que no puedo decirte si obtendrás resultados significativos (no linealmente dependientes) con este método, pero lo único que estás perdiendo es el tiempo.
Goertzel: puede usarlo para la detección de patrones simples y para la separación de frecuencias complicadas. Puedes ver la muestra de mi implementación en C #
Puede probar un filtro coincidente. Aunque nunca he usado uno, he escuchado cosas buenas.
Además, aunque no es simple, creo que un Modelo de Markov Oculto (HMM, sé que dijiste que no habías reconocido el habla, ¡pero escúchame!) Te proporcionaría los mejores resultados. De nuevo, nunca he usado uno, pero hay implementaciones de código abierto disponibles en todas partes. Solo necesitarías entrenarlo usando tu grabación de insectos "limpia" existente. Aquí hay una implementación de código abierto: General Hidden Markov Model Library .
Puede que le interese una MA Toolbox , una implementación de Matlab de medidas de similitud.
Personalmente encontré este documento, clasificación de sonido general y similitud en MPEG-7 , interesante. Sin embargo, podría estar detrás de un muro de pago (no sé) y podría no ser tan útil en la práctica.
El marco GPL-ed Marsyas tiene una herramienta para la clasificación de aprendizaje automático, llamada kea. Mi suposición es que esto probablemente no hace lo que quieres o es demasiado esfuerzo para conectar.
De lo contrario, mi única idea es tomar transformadas de Fourier, transformando de manera efectiva tus sonidos en imágenes en escala de grises. Luego use uno de los muchos algoritmos de similitud de imágenes .
Se necesita algo más de información.
Cuando dices una señal ruidosa, ¿cuál es el ruido de fondo? ¿Es, en una primera aproximación, estacionario (en un sentido estadístico, es decir, constante) o no es estacionario (es decir, es probable que contenga otros sonidos, como otras llamadas de animales, etc.?)
Si el ruido de fondo no es estacionario, entonces la mejor opción sería usar algo llamado Análisis de Componentes Independientes que intente separar una mezcla de sonidos dada en sus fuentes componentes, ni siquiera necesitaría la grabación original del insecto. Gran cantidad de software ICA se vincula desde la página de Wikipedia.
(Editar: ICA es un caso de Separación de fuentes ciegas (BSS), hay muchas otras formas de hacer BSS y podría ayudar a buscarlas también).
Sin embargo, si el ruido de fondo es estacionario, entonces el problema es mucho más fácil (aunque todavía muy difícil):
En este caso, el enfoque que utilizaría es el siguiente. Analiza el espectro de amplitud de un poco del ruido y el espectro de amplitud de tu llamada de insecto. Si tiene suerte, la llamada de insectos puede, en general, estar en una banda de frecuencia diferente al ruido. Si es así, filtre la señal entrante con un filtro adecuado de paso alto, bajo o paso de banda.
A continuación, puede intentar comparar las secciones de su señal filtrada que contienen "más energía" que el promedio con su llamada a insectos (filtrada). Posiblemente usando los algoritmos de similitud de imagen sugeridos por A. Rex.
Editar : Como el ruido de fondo no es estacionario, solo puedo sugerir que la búsqueda de la Separación de fuentes ciegas de fuentes no gaussianas puede llevarlo a algunos algoritmos más. Me temo que la respuesta es que no hay un algoritmo simple que haga lo que quiera.
Suena como un típico problema de clasificación de una clase, es decir, desea buscar una cosa en una gran cantidad de otras cosas que no le interesan.
Lo que quiere hacer es encontrar un conjunto de características o descripciones que puede calcular para cada fragmento de su grabación en bruto que luego puede comparar con las características que produce su grabación limpia. No creo que la convolución sea necesariamente mala, aunque es bastante sensible al ruido, por lo que podría no ser óptima para su caso. Lo que realmente podría funcionar en su caso es la coincidencia de patrones en una transformación de Fourier agrupada. Tomas la transformada de Fourier de tu señal, dándote un gráfico de potencia vs frecuencia (en lugar de un gráfico de potencia vs tiempo) luego divides la frecuencia en bandas y tomas la potencia promedio para cada banda como una característica. Si sus datos contienen principalmente ruido blanco, la paternización que obtiene de un sonido de insecto crudo de longitud similar coincidirá muy estrechamente con el patrón de su sonido de referencia. Este último truco se ha utilizado con éxito (con algunas ventanas) para descifrar captcha de audio tal como lo utilizan google et al para hacer que sus sitios sean accesibles para los ciegos.
Por cierto, como la señal de audio en bruto es digital (de lo contrario, el procesamiento con una computadora no funcionará ;-)) la convolución es apropiada. Debe realizar la convolución entre su señal de referencia y una muestra de la misma longitud desde la entrada sin procesar a partir de cada muestra. Entonces, si su señal de referencia tiene una longitud N, y su muestra sin procesar tiene una longitud M donde M> = N, entonces debe realizar M-N + 1 = P convoluciones entre su señal de referencia y P muestras de su entrada bruta comenzando en 1 .. PAG. La mejor posibilidad para la ubicación del sonido de referencia en la muestra bruta es la muestra con la puntuación de convolución más alta. Tenga en cuenta que esto se vuelve increíblemente lento en muy poco tiempo.
La coincidencia basada en la transformada de Fourier como expliqué anteriormente usando muestras solapadas al 50% de sus datos sin procesar del doble de la longitud de su muestra de referencia sería al menos más rápida (aunque no necesariamente mejor)
Un clasificador Naive Bayes puede valer la pena aquí, clasificando las muestras de sonido en las que contienen su especie de interés y las que no. Funciona bastante bien para fenómenos complejos; Una vez lo usé para decidir si un conjunto de datos RADAR dado con ondas milimétricas contenía un obstáculo como un cepillo, una trampa para tanques, etc. En cuanto a cómo dividir tus datos continuos en fragmentos discretos para el clasificador Bayesiano, podrías deslizarte el conjunto de datos continuo y los fragmentos de interrupción son iguales a la longitud de su muestra de insecto. Por ejemplo, si la muestra contra la que está comparando tiene una duración de 2 segundos, puede alimentar el discriminador 0-2, 0.5-2.5, 1-3, etc. Tendrá que entrenar al discriminador, pero eso es común requisito de cualquier solución basada en el aprendizaje automático.
Este tipo de enfoques son acerca de la única manera de ir si su especie de insecto no tiene un sonido único y relativamente distinto que esté buscando. La correlación cruzada / convolución es de utilidad limitada si buscas algo más complejo que un solo sonido que puede tener un volumen mayor o menor.
Existen ingenuas implementaciones de clasificadores de Bayes para varios idiomas, como nbc .
Es posible que desee un enfoque de filtro Wiener .
Google: algoritmo FastICA. Algunos usan ICA y la Separación de señales ciegas de manera intercambiable. El autor del algoritmo escribió un fantástico libro sobre ICA que cuesta alrededor de $ 40- $ 60 utilizado en Amazon.