domingo, 29 de julio de 2018

Análisis del canto de un grillo con R

Un fin de semana esta pasada primavera un grillo se puso a cantar bajo mi ventana. Lo que hacen los grillos en realidad no es un canto sino una estridulación, sonido producido por fricción de ciertas partes del cuerpo (admítelo, tampoco sabías que existía esa palabra).



Salí al jardín móvil en mano y con Spectroid, un analizador de espectro en tiempo real para Android, comprobé que la frecuencia fundamental de estas estridulaciones ronda los 4,3KHz. Se registraba también un armónico al doble de esta frecuencia unos 25dB por debajo.



Realicé una grabación de este grillo alicantino en la cual no hay rastro del armónico, posiblemente consecuencia de la compresión con pérdida del formato Opus usado. Aquí puede escucharse la secuencia completa.


Sin embargo voy a hacer trampa y para el resto del estudio usaré la parte final de este otro grillo esloveno, con bastante más muestra y que como veremos preserva los armónicos. Además mantiene un nivel de grabación estable, cosa que yo no logré al desplazar el móvil durante el registro, lo que permite introducir la intensidad como variable en el análisis.


~~~

Empezamos por analizar la forma de onda del sonido, la cual sigue un patrón muy regular: cada 'cri' consiste en un tren generalmente de cinco pulsos (en el grillo alicantino eran cuatro) que modulan en amplitud a una frecuencia fundamental muy definida.



En el espectrograma vemos que la frecuencia central está entorno a 4,3KHz (como la del otro grillo), y que el segundo armónico tiene mayor amplitud que el primero. En el arranque de cada pulso el espectro se ensancha un poco, pero el bicho afina rápidamente. Durante cada pulso se produce una ligera modulación descendente de frecuencia.



Pero el grillo no es perfecto y a veces "se come" alguno de los pulsos o retrasa el siguiente 'cri', posiblemente cuando lo perturba algún ruido o se mueve.

Vamos a hacer un análisis de la grabación completa para tratar de encontrar patrones en el sonido. Caracterizaremos cada tren de pulsos (es decir cada uno de los 'cri') por las siguientes variables, algunas de ellas derivadas de las restantes:
  • n: instante de inicio (samples).
  • N: número de pulsos.
  • D: duración (samples).
  • Dpre: lapso respecto al tren de pulsos precedente (samples).
  • Dpost: lapso respecto al tren de pulsos siguiente (samples).
  • T: período medio de los pulsos (samples).
  • dp: duración media de los pulsos (samples).
  • duty: ciclo de trabajo medio (%) (duty = dp / T).
  • f: frecuencia central (Hz).
  • W: potencia media de los pulsos.
  • E: energía media de los pulsos (E = W · dp).


~~~

Para delimitar cada tren de pulsos, y dentro de ellos los pulsos integrantes, escribiremos primero una rutina que reconozca los instantes de inicio y fin de cada pulso individual mediante una detección de cambios de estado silencio/actividad.

Empezamos por rectificar los semiciclos negativos y normalizamos. Sobre la rectificación hacemos una detección de envolvente sencilla implementada calculando el máximo en una ventana deslizante de ancho ajustado al período de la frecuencia fundamental del grillo (se garantiza así abarcar siempre dos semiciclos).

Con el fin de evitar glitches debidos a las no idealidades del canto del grillo usaremos un doble mecanismo de histéresis:
  • En amplitud: un umbral de transición silencio a actividad superior al umbral para considerar la transición contraria (en la práctica ha bastado con usar el mismo umbral en ambos casos).
  • Temporal: exigiendo umbrales de duración mínima de los períodos de silencio y actividad para admitir un cambio de estado.

Al implicar las medidas de histéresis un sistema con memoria no es fácil vectorizar la detección de períodos silencio/actividad, así que recorremos con un bucle la envolvente muestra a muestra aplicando la inteligencia de umbrales definida. El resultado se almacena en un dataframe (pulse) donde con gran economía solo se codifican los instantes de inicio y fin de cada pulso.

Finalmente leemos la anterior secuencia de pulsos, almacenando en un nuevo dataframe (cri) los trenes de pulsos identificados. La decisión de qué pulsos consecutivos pertenecen a un mismo tren de pulsos se toma por umbral de separación máxima entre pulsos.

Afinados todos los umbrales, la detección funciona de manera perfecta gracias a la regularidad del grillo. Se muestra un tren de pulsos con su envolvente en rojo, la detección de pulsos individules en verde y la delimitación del tren de pulsos en azul. Puede verse con más detalle haciendo clic en la imagen.



Cada tren de pulsos se almacena en una fila del dataframe con sus variables definitorias por columnas, quedando así la información perfectamente sumarizada:



~~~

Obtenidas las variables para cada tren de pulsos (disponemos de 97 trenes de pulsos en total), mostramos el correlograma con el paquete corrplot:



Por desgracia nuestro grillo no "coopera" mucho, y dejando de lado correlaciones obvias inevitables, las variables de naturalezas dispares donde esperábamos ver patrones interesantes muestran relaciones muy débiles.



Lo más notable que encontramos es esa cierta correlación positiva entre la energía media generada en las estridulaciones y la frecuencia. Es decir que cuanto más chillaba el grillo más agudo le salía el 'cri', algo que también ocurre con la voz humana.



~~~

Ya que la estadística no nos brinda nada relevante, una curiosidad sobre los grillos: la temperatura influye en el período del canto de estos insectos hasta el punto de poder estimarla a partir del mismo. Para la especie analizada, la temperatura que arroja la estimación es de 21,5 ºC.

Fuente: Wikipedia


Y para terminar una visualización ad hoc del canto de nuestro grillo a base de círculos. El tamaño de estos se relaciona con la potencia del canto (W), la separación física entre círculos simboliza el lapso entre estridulaciones (Dpost), el color representa la frecuencia central (f) significando colores cálidos una frecuencia por debajo de la mediana y viceversa, y los cambios de dirección a derecha e izquierda vienen dados por una duración media de los pulsos (dp) superior o inferior respectivamente a la de la estridulación previa.



Este "sendero acústico" nos permite comprobar visualmente cómo de regular es el canto del grillo en cada uno de los parámetros y su evolución temporal. La correlación vista entre frecuencia y energía la constatamos al ver que los círculos azules suelen ser los de mayor tamaño y los rojizos los más pequeños. Con mayor resolución haciendo clic sobre la imagen.

Para construir el grafo se ha empleado la librería gráfica diseñada en 'Dibujando gráficos de mapa de bits con R'.

En cricket.R puede encontrarse el código usado para todo el análisis.

2 comentarios:

  1. Excelente análisis! Te felicito. Muy detallado. Sobre la conclusión de cuanto más chilla el grilloo, más agudo es, suelen emplearlo para "discutir" con otros machos, es una forma de demostrar fuerza. Cuándo pelean los adultos estridulan con fuerza. Me ha gustado mucho tu artículo!

    ResponderEliminar
    Respuestas
    1. Gracias por la información Miguel. Si ya me caían bien los grillos, tras unas horas dedicado a estudiar cómo cantan todavía les tengo más simpatía a estos peleones.

      Salu2!

      Eliminar

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.