Prototipo de sistema de cancelación de ruido de bricolaje hecho con TensorFlow.
En este post describo cómo construí un sistema de cancelación de ruido activo por medio de redes neuronales por mi cuenta. Acabo de obtener mis primeros resultados que estoy compartiendo, pero el sistema parece un gran número de scripts, binarios, cables, tarjetas de sonido, micrófonos y auriculares, por lo que no publicaré ninguna fuente aún. Puede ser más tarde.
Proyecto de mascotas con Tensorflow, ALSA, C ++ & SIMD, y Python
Durante el último año he estado construyendo un sistema de cancelación de ruido acústico basado en una red neuronal artificial. Lo hice en mi tiempo libre, por eso me tomó tanto tiempo un experimento relativamente pequeño. El sistema que he construido es una prueba de concepto, mostró la consistencia de una idea de NN como un cancelador de ruido.
Me impresionaron los recientes logros de ML en el procesamiento de imágenes como la transferencia de estilo neuronal. Y pensé: “¿Qué pasa si enseñamos RNN con patrones repetidos de ruido de audio para suprimirlo por ANC?” Había implementado el perceptrón en un DSP para algunas cosas de radar antes, así que no tuve miedo por la necesidad de implementar una red neuronal en Un software en tiempo real. Aunque no he tratado con tensorflow y gpu antes, estaba ansioso por hacer algo con ellos. Hasta ahora me parece que fue un viaje interesante y, por fin, logré algunos resultados y me divertí mucho con los desarrolladores.
¿Por qué necesitamos ML para suprimir el ruido?
Modern ANC systems suprime con éxito los ruidos estacionarios como uno en un avión. El enfoque común incorpora filtros adaptativos como LMS o RLS . El principal defecto de estos métodos es que solo son filtros FIR en su núcleo, cuyos coeficientes se adaptan constantemente y se ajusta al ruido solo después de unas pocas miles de muestras. Significa que un filtro adaptativo comienza a adaptarse nuevamente a cada cambio del ruido ambiental, incluso si escuchó ese patrón varios segundos antes. El uso de métodos ML en ANC podría mejorar su rendimiento porque las redes neuronales son capaces de adaptarse a señales con una estructura interna muy compleja.
NN en ANC se usa para predecir valores de muestras de ruido en un momento en que el ruido negro debe cumplir con la norma. ruido en una posición del micrófono.
Espero que los ruidos del exterior, como un sistema de escape ruidoso o un lavaplatos, no sean estacionarios en sentido amplio sino que sean bastante repetitivos y puedan ser aprendidos por una NN con relativa facilidad.
arriba
Mi proyecto para mascotas funciona como auriculares clásicos con cancelación de ruido, excepto por el hecho de que el micrófono está ubicado dentro de una orejera. La configuración de la prueba parece simple y simple:
No coloqué el micrófono en un exterior (como hacen todos los auriculares con cancelación de ruido) porque quería resolver el problema ANC en un caso más amplio. Esta configuración me permite sintonizar fácilmente mi código en una habitación o entorno de automóvil porque la estructura en todos los casos es la misma.
Diseño del software
El software consta de tres procesos:
- Programa C ++ para el procesamiento de señales en tiempo real,
- The Manager es un script de Python con tensorflow para enseñar NN,
- y Learner es otro script de Python para gestionar todo el proceso.
El script del administrador se comunica con los demás por gprc .
El preamplificador de micrófono y los auriculares están conectados a una tarjeta de sonido, que es conectado por USB a una computadora portátil con Linux Mint 17.
El micrófono mide la combinación de un ruido con un ruido negro. Luego, el programa C ++ hace lo siguiente:
- lee muestras,
- divide el ruido externo y la contra-señal de los auriculares,
- pasa muestras de ruido al paso de avance de la red neuronal para obtener muestras de ruido negro, [19659019] la reproducción de las muestras de ruido negro producidas por NN a los auriculares,
- transfiere las muestras de ruido al script del alumno a través del script del administrador, obtiene nuevos coeficientes NN del administrador.
Reproduzco los ruidos en mi teléfono móvil a un par de metros los auriculares. Esa construcción logró suprimir diferentes patrones de ruido, incluso señales no estacionarias como manojos de sinos, encendidos y apagados arbitrariamente con las manos.
Detalles internos
El sonido de entrada se está muestreando a 48 kHz , 16 bits de ancho. El código se muestra hacia abajo 8 veces por el código y se envía al divisor.
El divisor es necesario para aislar el ruido externo de las muestras de entrada, como si no hubiera una señal reproducida en los auriculares. .
El perceptron se implementa por mi cuenta en C ++ con intrínsecos de las instrucciones SIMD para cumplir con el requisito del procesamiento en tiempo real. El perceptrón consta de dos capas ocultas:
- La capa de entrada tanh [304 x 64] toma las últimas 304 muestras de ruido externo previamente aislado.
- La capa intermedia tanh [64 x 64].
- La capa de salida es lineal [64 x 1]. [19659020] Es una red relativamente pequeña y se puede administrar con el horizonte de las últimas 304 muestras. Tiene una implementación simple y toma de 30 a 60 segundos para ser enseñado. Lo actualizaré a una variante recursiva, ya verifiqué la capacidad del modelo RNN para adaptarse a algunos sonidos complejos en una computadora portátil Jupyter. Parece prometedor, pero lleva más tiempo para converger. Espero poder escribir una publicación sobre este cuaderno más tarde. La señal de salida se remuestrea 8 veces y se envía a los auriculares.
Al mismo tiempo, el programa está enviando paquetes de Muestras de ruido externo al script de Python que adapta constantemente los pesos de perceptrón a los patrones de ruido recién medidos y los envía de vuelta al programa c ++. Ejecuto este script de Python en una nube en vm con GPU. Por cierto, ¡encontré que Paperspace es el mejor para los experimentos de ML! Aquí está mi enlace de referencia .
Resultados
Aquí hay algunos gráficos que demuestran los resultados alcanzados. Estos datos son un registro del programa C ++, no hay mediciones objetivas por ahora. Sin embargo, traté de ponerme estos auriculares en la cabeza y parece funcionar igual que las gráficas muestran.
Términos
El ruido negro es la señal que se envió al micrófono.
Ruido puro es el ruido externo aislado por el divisor.
El ruido negro transformado en la entrada del micrófono es parte residual de la señal aislada por el divisor.
samples_in is muestras de sonido sin procesar medidas por el micrófono (y disminuidas 8 veces por supuesto).
Aquí se muestra en la siguiente gráfica cómo el perceptrón detecta la entrada y el inicio de la operación.
Cancelación acústica de ruido por aprendizaje automático se publicó originalmente en Hacia la ciencia de datos en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia. .