Esta es una continuación de una pregunta anterior .
Estoy tratando de analizar los sonidos de la respiración y los ronquidos, y aunque ahora puedo detectar bastante bien los ronquidos, la respiración es un desafío mayor.
He aprendido que si rompo el rango de frecuencia analizado (aproximadamente 4KHz, muestreado a aproximadamente 8KHz, con un tamaño de fotograma de 1024) en aproximadamente 5 subranges, muy a menudo una de las subranges exhibe una buena sensibilidad (usando la diferencia espectral) que está enterrada en el ruido en el rango general. El truco consiste en determinar en qué subrango confiar "cuándo".
Presumiblemente, el subrango "confiable" exhibiría variabilidad a una velocidad entre aproximadamente 2Hz y 0.05Hz, mientras que los subranges "malos" se comportarían de manera más aleatoria, siendo la mayor parte de su variación a intervalos más cortos.
Podría improvisar algún tipo de algoritmo para suavizar los valores en una resolución inferior a un segundo y luego calcular la variabilidad en intervalos más largos, pero me pregunto si no hay un algoritmo "enlatado" para este tipo de cosas, algo con tal vez ¿Un mínimo de teoría detrás de esto?
¿Alguna sugerencia?
[Nota: me doy cuenta de que uno podría, en teoría, usar una FFT para extraer esta información, pero eso parece usar un bate de béisbol para matar una pulga. ¿Quizás algo un poco más liviano?]
Adicional:
En cierto sentido (para usar una analogía), estoy tratando de detectar una señal de "banda base" en una transmisión de RF (solo la "RF" son frecuencias de audio, y la "banda base" está por debajo de 8Hz). Y, en cierto sentido, el "RF" es "espectro extendido": los sonidos que quiero detectar tienden a generar muchos armónicos y / o tienen varios componentes de frecuencia separados, por lo que si una banda del espectro es demasiado ruidosa, puedo Probablemente haga uso de otro. El objetivo es determinar básicamente alguna métrica que se parezca a la SNR para las diversas bandas de frecuencia, bajo el supuesto de que la mayoría del "ruido" es> 2Hz y mi señal es inferior a 2Hz.
Tengo como entrada a este algoritmo las amplitudes sin procesar (suma de amplitudes FFT en todas las frecuencias incluidas) para cada banda, medida a intervalos de 8Hz.
(Debe tenerse en cuenta que, si bien no he realizado ninguna medición formal de SNR, la SNR general en todo el espectro procesado parece estar con frecuencia cerca o por debajo de 1.0, si observa visualmente la envolvente de sonido en una herramienta como Audacity, no hay modulación del la envolvente es notable (a pesar de que el oído puede discernir claramente los sonidos de respiración). Es por eso que es necesario analizar las bandas para encontrar aquellas con SNR decente).
fuente
Respuestas:
Daniel
Al volver a leer su pregunta, parece que lo que aprendí a ser conocido como el "ancho de banda de Gabor" podría serle útil en este caso, ya que intenta medir la "variabilidad espectral". (Dilip dio una buena respuesta a mi pregunta sobre Momentos espectrales aquí).
Cuando lo estudié más a fondo, el ancho de banda de Gabor parece ser realmente una medida de cuán 'extendido' es el espectro de su media. (De ahí la manipulación de los momentos).
Echa un vistazo y mira lo que piensas.
fuente
¿Has probado el flujo espectral? Hay implementación de MATLAB aquí: http://blog.weisu.org/2009/12/spectral-flux-sf-in-audio.html
fuente
Lo que necesitas parece mucho más grande que una pulga. Por lo tanto, es posible que deba ir en la dirección opuesta y hacer más que solo una FFT. Quizás cepstrum de baja frecuencia o análisis cepstral para encontrar su frecuencia "exiter".
fuente
Esto es lo que sugiero:
Para cada n:
Elija la subbanda con el pico de autocorrelación más alto (= el más "agudo").
Medidas de pico para observar:
Este tipo de métricas se utilizan, por ejemplo, para distinguir el habla con voz / sin voz.
fuente