¿Cómo puede saber si hay una señal (cuando su señal se parece mucho al ruido)?

11

Este es mi detector de ronquidos de nuevo.

Me he vuelto bastante bueno detectando una señal cuando hay algo allí: puedo rastrear desde un ronquido que se despega de la pared hasta la respiración que ni siquiera puedes escuchar en la grabación. El problema es que no puedo decir cuándo la señal ha caído por debajo del nivel detectable y la aplicación solo está "escuchando cosas". Y, desafortunadamente, los ronquidos / respiración a menudo son lo suficientemente irregulares que es poco probable que una autocorrelación simple o un esquema de tiempo de intervalo similar ayude mucho. (Y en realidad es probable que en algunos casos el ruido sea más regular que la respiración).

Entonces, ¿hay algún truco que me falte para descubrir cuando no hay señal? Parece que me encuentro con un lugar difícil aquí, dado que la "señal" es tan ruidosa para empezar.

(Y tal vez esto esté relacionado con otro problema que estoy teniendo: extrañamente, no puedo medir con precisión (ni siquiera aproximadamente) el nivel de la señal incluso cuando es bastante alto. Dado que necesito usar promedios y proporciones para detectar la señal de todos modos, el tipo de información de nivel se pierde. Estoy buscando algunos trucos para reconstituirlo).

Técnica básica

(Para Yoda)

La señal de audio se muestrea (generalmente a 8000Hz, por varias razones), luego se FFT en 1024 bloques. (En mis experimentos, los filtros de Hamming y los bloques superpuestos parecen tener poco efecto, aunque pueden revisarse más adelante).

El FFT se divide en "bandas" (actualmente 5, ligeramente sesgadas en tamaño para colocar más detalles en el extremo inferior) y se suma la "diferencia espectral" y el nivel de cada banda. Los promedios a largo plazo de los valores de límite máximo se utilizan como "umbrales", y se utilizan ajustes de sesgo adicionales para mantener una tasa de "sobre umbral" de aproximadamente el 20%.

Cada valor "por encima del umbral" tiene un peso de 1 (por debajo del umbral tiene un peso de 0), pero luego ese peso se ajusta por la "variabilidad" aparente (aproximadamente a 2 Hz) en la banda, para dar más peso a las bandas que llevan una señal más aparente.

Se suman los pesos de las bandas y luego se suman los pesos sumados de los bloques posteriores durante aproximadamente un segundo para producir una "puntuación" continua. Esto se compara nuevamente con un umbral promedio en ejecución (más varias heurísticas) para detectar el inicio / desplazamiento del ronquido.

Actualizar

De repente se me ocurrió que si mi algoritmo mantiene efectivamente una señal de nivel constante (según mi problema de nivel de señal), la forma de medir efectivamente la SNR es midiendo el ruido cuando no hay señal.

Convenientemente, los ronquidos son intermitentes, con mucho "aire muerto" en el medio. Y ya estoy detectando los sobres ronquidos. ¡Así que cualquier cosa fuera del sobre (entre el final de un ronquido y el comienzo del siguiente) es presumiblemente ruido! Esto puedo (con un grado modesto de precisión / repetibilidad) medir. (Por supuesto, se necesitaron tres intentos para llegar a un algoritmo medio decente; la realidad nunca coincide con la teoría).

Así que todavía no tengo la respuesta completa, pero he progresado.

(Si bien la técnica anterior me da un proxy bastante bueno para SNR, todavía tengo problemas para estimar el nivel de señal real. Mis indicaciones de "nivel relativo" pueden estar fuera de la escala para una respiración apenas audible y más o menos para un sonajero de ventana. Necesito algún tipo de proxy para el nivel absoluto).

Daniel R Hicks
fuente
"Este es mi detector de ronquidos nuevamente", ¿podría vincular a su pregunta anterior (donde presumiblemente la describió en detalle) o agregar algunos detalles sobre su detector en esta pregunta?
Lorem Ipsum

Respuestas:

5

Hasta ahora parecía identificar los ronquidos a través de la presencia de un patrón periódico fuerte en el audio. Si me dices que puede haber otras fuentes con la misma propiedad, es hora de seguir adelante y enfocarte en una propiedad de la señal más específica del ronquido; y sugeriría mirar con mayor precisión el timbre del sonido grabado en sí. Dado que un oyente humano puede apartar los ronquidos de la respiración, puede recurrir al enfoque tradicional de clasificación de señal de audio. Calcule características como MFCC y patrones de fluctuación en sus datos de audio, y entrene un clasificador bayesiano (o más sofisticado) para discriminar los ronquidos de la respiración.

También podría ser el momento de revisar la literatura sobre el tema ... Por ejemplo, encontré esto: http://web.itu.edu.tr/kamasak/pubs/pdf/pm7_8_007.pdf

pichenettes
fuente
Un problema es que la naturaleza del sonido varía mucho de un individuo a otro e incluso para un solo individuo en el transcurso de una noche. Pero gracias por las pistas, las investigaré.
Daniel R Hicks
Si su conjunto de entrenamiento es lo suficientemente grande, esto podría ser factible utilizando técnicas de aprendizaje automático.
pichenettes
Tengo más de 50 conjuntos de datos. Desafortunadamente, un algoritmo que funciona perfectamente en un conjunto falla miserablemente en el siguiente. Algunos tienen TV en segundo plano, algunos tienen controladores de aire retumbando, etc. La respiración / ronquidos puede ser apenas audible o descascarada. Un sujeto puede cambiar de posición y cambiar completamente la naturaleza de sus ronquidos. Se requiere claramente algún tipo de esquema de autoajuste.
Daniel R Hicks
¿Qué características estás usando para la clasificación?
pichenettes
Principalmente solo "diferencia espectral" (también conocida como "flujo espectral") para detectar "inicio" y "desplazamiento". Pero mi esquema actual divide el espectro en bandas y "pondera" cada banda en función de la intensidad aparente de la señal en esa banda (que se juzga por la cantidad de variación en la diferencia espectral que ocurre a aproximadamente 1/2 Hz). Esto funciona bien para detectar la respiración / ronquidos en todo el rango de volumen, incluso con ruido significativo, pero efectivamente pierde toda indicación de volumen real. Y simplemente mirar el nivel de sonido total simultáneo no funciona debido al problema de ruido.
Daniel R Hicks
0

Es posible que deba crear un clasificador dinámico, que pueda adaptarse al sujeto actual, la fase de reposo y el entorno de audio, en lugar de sintonizar un conjunto de entrenamiento fijo.

hotpaw2
fuente
Eso es lo que estoy pensando.
Daniel R Hicks