# Source code for draugr.numpy_utilities.signal_utilities.signal_projection

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    __author__ = "Christian Heider Nielsen"
    __doc__ = r"""

               Created on 17-12-2020
               """

    import numpy

    __all__ = [
        "normalise_signal",
        "normalise_signal_minmax",
        "normalise_signal_max_abs",
        "heaviside",
    ]

    from draugr.numpy_utilities.signal_utilities.signal_statistics import mean_square

    def normalise_signal_minmax(signal: numpy.ndarray) -> numpy.ndarray:
        """description"""
        return numpy.interp(signal, (signal.min(), signal.max()), (-1, 1))

    def normalise_signal_max_abs(signal: numpy.ndarray) -> numpy.ndarray:
        """description"""
        return signal / numpy.abs(signal).max()

    def normalise_signal(
        signal: numpy.ndarray, variance: numpy.ndarray = None
    ) -> numpy.ndarray:
        """Normalise power in y to a (standard normal) white noise signal.
        Optionally normalise to power in signal `x`.
        The mean power of a Gaussian with `mu=0` and `sigma=1` is 1."""
        if variance is not None:
            variance = mean_square(variance)
        else:
            variance = 1.0

        return signal * numpy.sqrt(variance / mean_square(signal))

    def heaviside(signal: numpy.ndarray) -> numpy.ndarray:
        """Heaviside.

        Returns the value 0 for `x < 0`, 1 for `x > 0`, and 1/2 for `x = 0`."""
        return 0.5 * (numpy.sign(signal) + 1)

    if __name__ == "__main__":

        def asiudha() -> None:
            """
            :rtype: None
            """
            a = numpy.random.random(9) - 0.5
            print(
                normalise_signal_minmax(a),
                "\n",
                normalise_signal_max_abs(a),
                "\n",
                normalise_signal(a),
            )
            print(heaviside(a))

        asiudha()