"""parses [SPECT_PARAMS] section of config"""
import attr
from attr import converters, validators
from attr.validators import instance_of
def freq_cutoffs_validator(instance, attribute, value):
if len(value) != 2:
raise ValueError(
f"freq_cutoffs should be a list of two elements, but instead got: {value}"
)
if value[0] > value[1]:
raise ValueError(
f"lower freq_cutoff should be less than higher freq_cutoff, instead of: {value}"
)
VALID_TRANSFORM_TYPES = {"log_spect", "log_spect_plus_one"}
def is_valid_transform_type(instance, attribute, value):
if value not in VALID_TRANSFORM_TYPES:
raise ValueError(
f"Value for `transform_type`, {value}, in [SPECT_PARAMS] "
"section of .toml file is not recognized. Must be one "
f"of the following: {VALID_TRANSFORM_TYPES}"
)
[docs]@attr.s
class SpectParamsConfig:
"""represents parameters for making spectrograms from audio and saving in files
Attributes
----------
fft_size : int
size of window for Fast Fourier transform, number of time bins. Default is 512.
step_size : int
step size for Fast Fourier transform. Default is 64.
freq_cutoffs : tuple
of two elements, lower and higher frequencies. Used to bandpass filter audio
(using a Butter filter) before generating spectrogram.
Default is None, in which case no bandpass filtering is applied.
transform_type : str
one of {'log_spect', 'log_spect_plus_one'}.
'log_spect' transforms the spectrogram to log(spectrogram), and
'log_spect_plus_one' does the same thing but adds one to each element.
Default is None. If None, no transform is applied.
thresh: int
threshold minimum power for log spectrogram.
spect_key : str
key for accessing spectrogram in files. Default is 's'.
freqbins_key : str
key for accessing vector of frequency bins in files. Default is 'f'.
timebins_key : str
key for accessing vector of time bins in files. Default is 't'.
audio_path_key : str
key for accessing path to source audio file for spectogram in files.
Default is 'audio_path'.
"""
fft_size = attr.ib(converter=int, validator=instance_of(int), default=512)
step_size = attr.ib(converter=int, validator=instance_of(int), default=64)
freq_cutoffs = attr.ib(
validator=validators.optional(freq_cutoffs_validator), default=None
)
thresh = attr.ib(
converter=converters.optional(float),
validator=validators.optional(instance_of(float)),
default=None,
)
transform_type = attr.ib(
validator=validators.optional([instance_of(str), is_valid_transform_type]),
default=None,
)
spect_key = attr.ib(validator=instance_of(str), default="s")
freqbins_key = attr.ib(validator=instance_of(str), default="f")
timebins_key = attr.ib(validator=instance_of(str), default="t")
audio_path_key = attr.ib(validator=instance_of(str), default="audio_path")