¿La mejor manera de evaluar la "calidad" de la autocorrelación?

9

Este es un viaje secundario desde mi aplicación de ronquidos .

Tuve una grieta al producir una autocorrelación de la señal de audio, para ver si eso "se correlaciona" muy bien con los ronquidos / respiración. Tengo un algoritmo simple que funciona (produce 1.0 como elemento cero, lo cual es una buena señal), pero me pregunto cómo evaluar el resultado para determinar si la autocorrelación es fuerte y, tal vez, cómo usarlo para separar varias posibles fuentes de sonido.

Pregunta n. ° 1: ¿Es el RMS de la autocorrelación (omisión del elemento cero) una métrica de "calidad" tan buena como cualquiera, o hay algo mejor?

Para elaborar: simplemente quiero una forma numérica (vs "mirar" en un gráfico) para distinguir una señal altamente autocorrelacionada de una señal menos autocorrelacionada.

(Realmente no sé lo suficiente como para saber qué otras preguntas hacer).

Algunos resultados iniciales: en algunos casos, la autocorrelación (ya sea RMS o pico) muestra un salto dramático en un ronquido, precisamente la respuesta que me gustaría ver. En otros casos no hay movimiento aparente en absoluto en estas medidas (y esto puede ser dos ronquidos sucesivos con las dos respuestas), y en situaciones de mucho ruido, las mediciones realmente caen (ligeramente) durante un ronquido.

Actualización - 22 de mayo: finalmente tuve más tiempo para trabajar en esto un poco más. (Me detuvieron en otra aplicación que es literalmente un dolor). Introduje la salida de la autocorrelación en una FFT y la salida es algo interesante: muestra un pico bastante dramático cerca del origen cuando comienza un ronquido.

Así que ahora me enfrento al problema de cuantificar este pico de alguna manera. Curiosamente, los picos más altos, en términos de magnitud absoluta, ocurren en otros momentos, pero probé la relación de pico a media aritmética y eso sigue bastante bien. Entonces, ¿cuáles son algunas buenas maneras de medir el "pico" de la FFT. (Y por favor no digas que necesito tomar un FFT de esto, esta cosa ya está cerca de tragarse su propia cola. :))

Además, se me ocurrió que la calidad de la FFT podría mejorar un poco si reflejara los resultados de la autocorrelación, con cero (que es, por definición, magnitud 1.0) en el medio. Esto pondría las "colas" en ambos extremos. ¿Es esta (posiblemente) una buena idea? ¿Debería la imagen especular estar vertical o invertida? (Por supuesto, lo intentaré independientemente de lo que digas, pero pensé que tal vez podría obtener algunas pistas sobre los detalles).

Intención planificada

Mis casos de prueba se pueden dividir aproximadamente en la categoría de "buen comportamiento" y la categoría de "niños problemáticos".

Para los casos de prueba de "buen comportamiento", la planitud de la FFT de la autocorrelación se reduce drásticamente y la proporción de autocorrelación pico a promedio aumenta durante un ronquido. La relación de esos dos números (relación de pico dividida por la planeidad) es particularmente sensible, exhibiendo un ascenso de 5-10x durante una respiración / ronquido.

Sin embargo, para los "niños problemáticos", los números se dirigen exactamente en la dirección opuesta. La relación pico / promedio baja ligeramente, mientras que la planeidad en realidad aumenta en un 50-100%

La diferencia entre estas dos categorías es (principalmente) triple:

  1. Los niveles de ruido son (generalmente) más altos en los "niños problemáticos"
  2. Los niveles de audio son (casi siempre) más bajos en los "niños problemáticos"
  3. Los "niños problemáticos" tienden a consistir en más respiración y menos ronquidos reales (y necesito detectar ambos)

¿Algunas ideas?

Actualización: 25/05/2012: es un poco prematuro tener un baile de la victoria, pero cuando reflejé la autocorrelación sobre un punto, tomé la FFT de eso y luego hice la planitud espectral, mi esquema de relación combinada mostró un buen salto en Varios ambientes diferentes. Reflejar la autocorrelación parece mejorar la calidad de la FFT.

Sin embargo, un punto menor es que, dado que el "componente DC" de la "señal" reflejada es cero, el resultado cero de FFT es siempre cero, y esto rompe un poco la media geométrica que incluye cero. Pero omitir el elemento cero parece funcionar.

El resultado que obtengo está lejos de ser suficiente para identificar ronquidos / respiraciones por sí mismo, pero parece ser una "confirmación" bastante sensible: si no obtengo el "salto", entonces probablemente no sea un ronquido / respiración.

No lo he analizado de cerca, pero sospecho que lo que está sucediendo es que se produce un silbido en algún lugar durante la respiración / ronquido, y ese silbato es lo que se está detectando.

Daniel R Hicks
fuente
En lo que respecta a la medida de la "fuerza" de la correlación, lo que debe hacer es normalizar las dos señales que están correlacionadas, antes de hacer una correlación. (Después de la normalización, la suma de cada señal debe ser 1). Entonces el pico de correlación siempre existirá entre -1 y 1. Esta es su fuerza. No estoy seguro sobre el resto de su pregunta, tal vez pueda editar un poco.
Spacey
Estoy tratando con la autocorrelación, por lo que las dos señales son una y la misma y, por definición, están "normalizadas" entre sí. Por "fuerza" quiero decir cuánta autocorrelación hay.
Daniel R Hicks
No entiendo lo que quieres, pero creo que te gustaría medir el valor máximo del pico de autocorrelación, no el valor RMS de todo.
Endolito
@endolith Creo que podría estar preguntando sobre una medida de "pico" de su función de autocorrelación, ¿para distinguir una señal con un delta (autocorrelación de ruido) de una señal de muchos picos? (autocorrelación de señal con armónicos). Quizás usar la medida de planitud espectral también se puede usar aquí ...
Spacey
Parece que la planitud espectral es lo que quiere. Daniel: ¿Quieres determinar qué tan diferente es la señal del ruido blanco?
Emre

Respuestas:

3

Preliminares

Esta demostración es más fácil con el paquete de lectura de audio MATLAB , que permite leer / escribir archivos MP3. Alternativamente, puede convertir el archivo MP3 en el ejemplo a WAV manualmente.

Caso fácil

Antes de examinar su archivo problemático, pasemos a SoundCloud y tomemos un ronquido decente para saber qué esperar cuando la SNR es alta. Este es un 52s estéreo 44.1KHz MP3. Descárguelo a una carpeta en la ruta de MATLAB.

Ahora calculemos el espectrograma (elegí una ventana Hann de 8192 muestras) y la planitud espectral:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

Planitud espectral del ronquido de brobar

Las enormes caídas en la llanura espectral (es decir, la desviación del ruido blanco) gritan "Estoy roncando". Podemos clasificarlo fácilmente mirando la desviación de la línea de base (mediana):

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

La planitud espectral clasificada del ronquido de Brobar

Tuvimos más de dos desviaciones estándar de altura libre. La variación estándar en sí misma, para referencia, es 6.8487 .

Estuche duro

Ahora echemos un vistazo a su archivo . Es un archivo WAV de 10 minutos y 8 kHz. Dado que el nivel es muy bajo, ayuda a comparar la señal.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

Planitud espectral del archivo ruidoso

¿Ves esas agradables salsas que acompañan a cada ronquido? Yo tampoco. ¿Qué tal los bonitos picos? No roncan, pero el sonido del sujeto se mueve. La desviación estándar es un miserable 0.9388

Conclusión

¡Necesita adquirir una señal más limpia si desea confiar en la planitud espectral! Tenía que compararlo solo para escuchar algo. Si se detecta una SNR baja, presione al usuario para que acerque el teléfono o use un micrófono como el teléfono que viene con el auricular.

La buena noticia es que es posible detectar ronquidos incluso en el caso problemático. Sin embargo, dado que esta pregunta no era solo acerca de la detección de ronquidos, me detendré aquí y explicaré cómo hacerlo en su otra pregunta .

Emre
fuente
Ahora tienes una idea de a qué me enfrento. Esa muestra fue de calidad "media" entre las muestras con las que tengo que trabajar; hay muchas peores. Y puedo leer esa muestra bastante bien con mis algoritmos existentes.
Daniel R Hicks
¿Qué algoritmos son esos?
Emre
En resumen: el sonido se ejecuta a través de FFT 8 veces por segundo, el espectro se divide en 5 bandas de frecuencia, se calcula la potencia y la diferencia espectral para cada banda, luego los resultados se califican de una manera que da más peso a las bandas que aparecen estar variando al ritmo correcto.
Daniel R Hicks
@Emre Estoy siguiendo sus enlaces, hice una cuenta de soundcloud, pero no puedo ver cómo descargó exactamente ese ronquido. No hay un botón de descarga al lado ni en ningún otro lugar.
Spacey
@Mohammad: proporcioné un enlace de descarga.
Emre
1

La autocorrelación está directamente relacionada con el DFT inverso de la densidad espectral de potencia de su señal. En ese sentido, cualquier información contenida en la magnitud al cuadrado de su DFT también está contenida en la función de autocorrelación.

Dicho esto, sin embargo, lo único que la autocorrelación puede decirle es la presencia de armónicos. (La distancia desde el pico central hasta el siguiente más alto). Quizás el ronquido VS la respiración tienen armónicos fundamentales diferentes, y si es así, el 'método de autocorrelación' sería un buen punto de partida para poder extraer las características (en este caso, los armónicos).

Por lo tanto, la autocorrelación del ruido blanco será una función delta, y no tendrá ningún pico secundario (o cualquier otro pico) fuera de su pico central. Por el contrario, si la señal tiene armónicos, entonces su función de autocorrelación contendrá picos secundarios y terciarios, proporcionales al presente armónico fundamental. La distancia desde el pico principal (centro) al pico secundario durante el período de su frecuencia fundamental.

EDITAR:

Creo que lo que busca es una medida, un número, que codifique cuán similar es una función de autocorrelación a un delta, VS una función de autocorrelación que parece tener muchos picos. Para ese fin, la medida de la planitud espectral podría ser aplicable, o en un caso más general, la medición de su media geométrica a media aritmética.

Spacey
fuente
Tenía la impresión de que la autocorrelación distinguiría mejor la señal (rítmica) del ruido (aleatorio); el ruido se autocorrelacionaría cerca de cero. Un DFT, OTOH, representará el ruido como ruido, un espectro extendido. Al menos esta es la "teoría" tal como la entiendo.
Daniel R Hicks
Por favor vea mis ediciones.
Spacey