Source code for ezmsg.sigproc.spectrogram
from typing import Generator
import ezmsg.core as ez
from ezmsg.util.messages.axisarray import AxisArray
from ezmsg.util.messages.modify import modify_axis
from .window import Anchor, WindowTransformer
from .spectrum import (
WindowFunction,
SpectralTransform,
SpectralOutput,
SpectrumTransformer,
)
from .base import (
CompositeProcessor,
BaseStatefulProcessor,
BaseTransformerUnit,
)
[docs]
class SpectrogramSettings(ez.Settings):
"""
Settings for :obj:`SpectrogramTransformer`.
"""
window_dur: float | None = None
"""window duration in seconds."""
window_shift: float | None = None
""""window step in seconds. If None, window_shift == window_dur"""
window_anchor: str | Anchor = Anchor.BEGINNING
"""See :obj"`WindowTransformer`"""
window: WindowFunction = WindowFunction.HAMMING
"""The :obj:`WindowFunction` to apply to the data slice prior to calculating the spectrum."""
transform: SpectralTransform = SpectralTransform.REL_DB
"""The :obj:`SpectralTransform` to apply to the spectral magnitude."""
output: SpectralOutput = SpectralOutput.POSITIVE
"""The :obj:`SpectralOutput` format."""
[docs]
class Spectrogram(
BaseTransformerUnit[
SpectrogramSettings, AxisArray, AxisArray, SpectrogramTransformer
]
):
SETTINGS = SpectrogramSettings
[docs]
def spectrogram(
window_dur: float | None = None,
window_shift: float | None = None,
window_anchor: str | Anchor = Anchor.BEGINNING,
window: WindowFunction = WindowFunction.HAMMING,
transform: SpectralTransform = SpectralTransform.REL_DB,
output: SpectralOutput = SpectralOutput.POSITIVE,
) -> SpectrogramTransformer:
return SpectrogramTransformer(
SpectrogramSettings(
window_dur=window_dur,
window_shift=window_shift,
window_anchor=window_anchor,
window=window,
transform=transform,
output=output,
)
)