Source code for sigima.tools.signal.scaling
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
"""
.. Scaling (see parent package :mod:`sigima.algorithms.signal`)
"""
# pylint: disable=invalid-name # Allows short reference names like x, y, ...
from __future__ import annotations
import numpy as np
from sigima.enums import NormalizationMethod
[docs]
def normalize(
yin: np.ndarray,
parameter: NormalizationMethod = NormalizationMethod.MAXIMUM,
) -> np.ndarray:
"""Normalize input array to a given parameter.
Args:
yin: Input array
parameter: Normalization parameter. Defaults to MAXIMUM
Returns:
Normalized array
"""
axis = len(yin.shape) - 1
if parameter == NormalizationMethod.MAXIMUM:
maximum = np.nanmax(yin, axis)
if axis == 1:
maximum = maximum.reshape((len(maximum), 1))
maxarray = np.tile(maximum, yin.shape[axis]).reshape(yin.shape)
return yin / maxarray
if parameter == NormalizationMethod.AMPLITUDE:
ytemp = np.array(yin, copy=True)
minimum = np.nanmin(yin, axis)
if axis == 1:
minimum = minimum.reshape((len(minimum), 1))
ytemp -= minimum
return normalize(ytemp, parameter=NormalizationMethod.MAXIMUM)
if parameter == NormalizationMethod.AREA:
return yin / np.nansum(yin)
if parameter == NormalizationMethod.ENERGY:
return yin / np.sqrt(np.nansum(yin * yin.conjugate()))
# At this point, we must have RMS normalization (last option)
assert parameter == NormalizationMethod.RMS
return yin / np.sqrt(np.nanmean(yin * yin.conjugate()))