Pregunta

Actualizar esta pregunta se tituló anteriormente como " Dame el nombre de un algoritmo simple para la detección de patrones de señal (sonido) "

  1. 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 graba los sonidos con un micrófono. Anteriormente grabé el sonido del insecto en formato digital.
  2. No estoy tratando de hacer reconocimiento de voz.
  3. 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 dados (solo tengo un patrón).
  4. Tengo miedo de usar redes neuronales, porque nunca las usé, y no sé si podría incrustar ese código.

¿Podría indicarme otros enfoques, o tratar de convencerme de que mi enfoque actual sigue siendo una buena idea o que las redes neuronales pueden ser una forma factible?

Actualización Ya tengo 2 buenas respuestas, pero otra sería bienvenida e incluso recompensada.

¿Fue útil?

Solución

Un paso adelante de la convolución es deformación dinámica del tiempo que puede considerarse como un operador de convolución que estira y reduce una señal para que coincida de manera óptima con otra.

Quizás un enfoque más simple sería hacer una FFT de la muestra y determinar si su insecto tiene alguna frecuencia particular que pueda filtrarse.

En el lado más complejo, pero no del todo una red neuronal, hay juegos de herramientas SVM como libsvm y svmlight en el que puede lanzar sus datos.

Independientemente del camino que intente, pasaría tiempo explorando la naturaleza del sonido que produce su insecto utilizando herramientas como FFT. Después de todo, será más fácil enseñarle a una computadora a clasificar el sonido si puede hacerlo usted mismo.

Otros consejos

Suena como un un problema de clasificación de una clase , es decir, usted desea buscar una cosa en un gran grupo de otras cosas que no le interesan.

Lo que desea hacer es encontrar un conjunto de características o descriptores que pueda calcular para cada parte corta de su grabación en bruto que luego pueda 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, el patró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 los captcha de audio que Google et al. sus sitios accesibles para ciegos.

Por cierto, debido a que su señal de audio sin procesar es digital (de lo contrario, el procesamiento con una computadora no funcionará ;-)) es adecuada la convolución. Debe realizar la convolución entre su señal de referencia y una muestra de igual longitud a partir de la entrada sin formato 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 convoluciones M-N + 1 = P entre su señal de referencia y las muestras P de su entrada sin procesar a partir de 1 .. pag. La mejor posibilidad para la ubicación del sonido de referencia en la muestra sin procesar es la muestra con el puntaje de convolución más alto. Tenga en cuenta que esto consume muchísimo tiempo muy rápido.

La coincidencia basada en la transformación de Fourier, como expliqué anteriormente, utilizando muestras superpuestas al 50% de sus datos brutos de dos veces la longitud de su muestra de referencia, al menos sería más rápido (aunque no necesariamente mejor)

Se necesita más información.

Cuando dice una señal ruidosa, ¿cuál es el ruido de fondo? ¿Es, para una primera aproximación, estacionaria (en un sentido estadístico, es decir, constante) o no estacionaria (es decir, es probable que contenga otros sonidos, como otras llamadas de animales, etc.)

Si el ruido de fondo no es estacionario, lo mejor sería utilizar algo llamado Análisis de componentes independientes que intenta separar una mezcla de sonido dada en sus fuentes componentes, ni siquiera necesitaría la grabación original del insecto mismo. Gran cantidad de software ICA está vinculado desde la página de Wikipedia.

(Editar: ICA es un caso de Separación de fuente ciega ( BSS), hay muchas otras formas de hacer BSS y también podría ser útil buscarlas).

Sin embargo, si el ruido de fondo es estacionario, el problema es mucho más fácil (aunque aún muy difícil):

En este caso, el enfoque que usaría es el siguiente. Analice el espectro de amplitud de un poco del ruido y el espectro de amplitud de su llamada de insecto. Si tienes suerte, la llamada del insecto puede, en general, estar en una banda de frecuencia diferente al ruido. Si es así, filtre la señal entrante con un filtro de paso alto, bajo o de banda adecuado.

Puede intentar comparar secciones de su señal filtrada que contengan " más energía " que el promedio con su llamada de insectos (filtrada). Posiblemente utilizando los algoritmos de similitud de imagen sugeridos por A. Rex.

Editar : dado que el ruido de fondo no es estacionario, solo puedo sugerir que busque La separación de fuente ciega de fuentes no gaussianas puede llevarlo a algunos algoritmos más. Me temo que la respuesta es que no existe ningún algoritmo simple que haga lo que quiera.

Si lo fuera, comenzaría a leer un poco sobre Funciones de ventana como la ventana de Hamming, Este es un buen punto de partida para el reconocimiento de sonido. (Esto, por supuesto, se combina con Transformación de Fourier )

Puedes probar un filtro combinado. Aunque en realidad 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 hay reconocimiento de voz, ¡pero escúchame!) proporcionaría los mejores resultados para ti. Nuevamente, nunca he usado uno, pero hay implementaciones de código abierto disponibles por todas partes. Solo necesitaría entrenarlo usando su "limpieza" existente Grabación de insectos. Aquí hay una implementación de código abierto: Biblioteca de modelos de Markov oculta general .

Es cierto que esta no es mi área de especialización, pero mi primer pensamiento es un filtro recursivo de mínimos cuadrados - realiza autocorrelación. Es similar al filtro de convolución que está utilizando ahora, pero un poco más avanzado. El filtrado de Kalman es una extensión de esto: se utiliza 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 imprevistas: son muy útiles en este tipo de cosas (siempre que las entrenes adecuadamente).

Pensando en esto más en profundidad, probablemente recomendaría usar una FFT. Lo más probable es que la señal que está buscando esté muy limitada en la banda, y probablemente tenga más suerte usando un filtro de paso de banda en los datos que luego un FFT y finalmente usando su filtro de convolución simple en esos datos en lugar de los datos del dominio del tiempo puntos. O haga ambas cosas y tenga el doble de datos. No me interesan las matemáticas, así que no puedo decirte si obtendrás resultados significativos (no linealmente dependientes) usando este método, pero lo único que estás perdiendo es el tiempo.

Es posible que le interese un MA Toolbox , una implementación de Matlab de medidas de similitud.

Personalmente encontré este documento, Clasificación general de sonido y similitud en MPEG-7 , interesante. Sin embargo, podría estar detrás de un muro de pago (no lo 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. Supongo que esto probablemente no haga lo que quieres o es demasiado esfuerzo para conectar.

Mi única idea es tomar transformadas de Fourier, transformando efectivamente sus sonidos en imágenes en escala de grises. Luego use uno de los muchos algoritmos de similitud de imagen .

Un Naive Bayes Classifier puede valer la pena aquí, clasificando las muestras de sonido en las que contienen su especies de interés y otras que no. Funciona bastante bien para fenómenos complejos; Una vez lo usé para decidir si un conjunto de datos RADAR de onda milimétrica dado contenía un obstáculo como un cepillo, una trampa de tanque, etc. En cuanto a cómo dividir sus datos continuos en trozos discretos para el clasificador bayesiano, puede simplemente deslizarse el conjunto continuo de datos y los trozos de la misma longitud que la muestra de insectos. Por ejemplo, si la muestra con la que está comparando dura 2 segundos, puede alimentar el discriminador 0-2s, 0.5-2.5s, 1-3s, etc. Necesitará entrenar al discriminador, pero eso es común requisito de cualquier solución basada en aprendizaje automático.

Este tipo de enfoques son el único camino a seguir 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 está buscando algo más complejo que un solo sonido que puede tener un volumen más alto o más bajo.

Existen implementaciones ingeniosas del clasificador Bayes para varios idiomas, como nbc .

Es posible que desee un enfoque de filtro Wiener .

Google: algoritmo FastICA. Algunos usan ICA y Separación de señal de fuente ciega indistintamente. El autor del algoritmo escribió un libro fantástico sobre ICA que se usa alrededor de $ 40- $ 60 en Amazon.

Goertzel: puede usarlo para la detección de patrones simples y para la separación de frecuencias complicadas. Puede ver la muestra de mi implementación en C #

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top