Sesión 2: análisis de propagación del sonido con baRulho
Author
AMAG & SG- Grupo de estudio E’ira & Semillero de Bioacústica y ecoacustica
Propósito de esta sesión
En esta segunda sesión vamos a:
organizar y cargar los datos del experimento
alinear los sonidos regrabados con el archivo maestro
calcular tres métricas de propagación:
excess_attenuation
signal_to_noise_ratio
blur_ratio
Comparar cómo cambian estas métricas con la distancia por tipo de sonido
Importante
En esta práctica trabajaremos un grabador a la vez. Este archivo está escrito para que se use primero con la carpeta zoom y luego, si se quiere, se repita el flujo con grillo.
Warning: package 'tidyverse' was built under R version 4.3.2
Warning: package 'tidyr' was built under R version 4.3.2
Warning: package 'readr' was built under R version 4.3.2
Warning: package 'dplyr' was built under R version 4.3.2
Warning: package 'stringr' was built under R version 4.3.2
Warning: package 'lubridate' was built under R version 4.3.2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 4.0.0 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(stringr)library(baRulho)
Loading required package: warbleR
Warning: package 'warbleR' was built under R version 4.3.3
Loading required package: tuneR
Warning: package 'tuneR' was built under R version 4.3.2
Loading required package: seewave
Warning: package 'seewave' was built under R version 4.3.2
Attaching package: 'seewave'
The following object is masked from 'package:lubridate':
duration
The following object is masked from 'package:readr':
spec
Loading required package: NatureSounds
Loading required package: knitr
Warning: package 'knitr' was built under R version 4.3.2
Loading required package: ohun
Warning: package 'ohun' was built under R version 4.3.3
Please cite 'ohun' as:
Araya-Salas, M., Smith-Vidaurre, G., Chaverri, G., Brenes, J. C., Chirino, F., Elizondo-Calvo, J., & Rico-Guevara, A. 2023. ohun: an R package for diagnosing and optimizing automatic sound event detection. Methods in Ecology and Evolution. https://doi.org/10.1111/2041-210X.14170
Please cite 'baRulho' as:
Araya-Salas, M., Grabarczyk, E. E., Quiroz-Oliva, M., Garcia-Rodriguez, A., & Rico-Guevara, A. (2025). Quantifying degradation in animal acoustic signals with the R package baRulho. Methods in Ecology and Evolution, 00, 1-12. https://doi.org/10.1111/2041-210X.14481
Attaching package: 'baRulho'
The following object is masked from 'package:seewave':
attenuation
master_annotations<-read.delim("./grillo/master_annotations.txt",check.names =FALSE,stringsAsFactors =FALSE) #cambiar el path segun la grabadora que estemos analizandostr(master_annotations)
'data.frame': 25 obs. of 9 variables:
$ Selection : int 1 2 3 4 5 6 7 8 9 10 ...
$ View : chr "Spectrogram 1" "Spectrogram 1" "Spectrogram 1" "Spectrogram 1" ...
$ Channel : int 1 1 1 1 1 1 1 1 1 1 ...
$ Begin Time (s): num 1 2.29 5.22 9.05 11.97 ...
$ End Time (s) : num 1.99 4.92 8.75 11.67 14.97 ...
$ Begin File : chr "master.wav" "master.wav" "master.wav" "master.wav" ...
$ Low Freq (Hz) : num 1780 6023 5313 6002 800 ...
$ High Freq (Hz): num 2040 9734 9720 9693 1200 ...
$ sound.id : chr "start_marker" "s._11" "s._21" "s._31" ...
En teoría, baRulho::find_markers() debería detectar automáticamente los marcadores del archivo maestro en los audios regrabados. Sin embargo, en este proyecto encontramos un problema: la función sí alcanzaba a correr la correlación y la detección, pero luego fallaba con un error de ruta (invalid 'path' argument). Como ohun::template_correlator() y ohun::template_detector() sí funcionaron por separado, en esta guía usamos ese flujo de forma explícita.
Además, al revisar los resultados vimos que:
el umbral inicial era demasiado bajo y producía muchísimas detecciones falsas;
mezclar start_marker y end_marker hacía que align_test_files() a veces usara el marcador equivocado;
por eso decidimos quedarnos solo con el start_marker;
y luego hacer una revisión visual del alineamiento y, si hace falta, usar manual_realign(). ## 4.1 Elegir solo los marcadores del master
Encontramos un problema al calcular signal_to_noise_ratio() en lote: la función devolvía un vector con una fila menos que el data.frame. Como el cálculo sí funcionó fila por fila, en esta guía calculamos la SNR de esa manera para evitar que el análisis se rompa.
ggplot( degrad_df,aes(x = distance, y = excess.attenuation, color = tipo_sonido)) +geom_point(alpha =0.7) +geom_smooth(method ="lm", se =FALSE) +facet_wrap(~ tipo_sonido) +theme_minimal(base_size =12) +labs(x ="Distancia (m)",y ="Excess attenuation",color ="Tipo de sonido",title ="Cambio de la atenuación extra con la distancia" )
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 23 rows containing non-finite outside the scale range
(`stat_smooth()`).
Warning: Removed 23 rows containing missing values or values outside the scale range
(`geom_point()`).
13.2 SNR vs distancia
ggplot( degrad_df,aes(x = distance, y = signal.to.noise.ratio, color = tipo_sonido)) +geom_point(alpha =0.7) +geom_smooth(method ="lm", se =FALSE) +facet_wrap(~ tipo_sonido) +theme_minimal(base_size =12) +labs(x ="Distancia (m)",y ="Signal-to-noise ratio",color ="Tipo de sonido",title ="Cambio del SNR con la distancia" )
`geom_smooth()` using formula = 'y ~ x'
13.3 Blur ratio vs distancia
ggplot( degrad_df,aes(x = distance, y = blur.ratio, color = tipo_sonido)) +geom_point(alpha =0.7) +geom_smooth(method ="lm", se =FALSE) +facet_wrap(~ tipo_sonido) +theme_minimal(base_size =12) +labs(x ="Distancia (m)",y ="Blur ratio",color ="Tipo de sonido",title ="Cambio de la degradación temporal con la distancia" )
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 23 rows containing non-finite outside the scale range
(`stat_smooth()`).
Warning: Removed 23 rows containing missing values or values outside the scale range
(`geom_point()`).