-----
    Brief
    -----
    Function to extract features given in functions, that returns an array with the set of features
    for each time window.

    -----------
    Description
    -----------
    Machine learning pipelines usually use features to represent each sample of the input signals.
    Those features should be relevant in the sense that they should be useful to distinguish between the classes
    of each specific problem, and not redundant, as the usage of redundant features usually improves the complexity
    of the problem without improving its results.

    This function allows to extract features from the various windows provided in windowed_signal.

    ----------
    Parameters
    ----------
    windowed_signal: list or numpy.array
        Input windowed signal (if your signal is not windowed, you can use the function windowing of this module).
    functions: list
        List of functions that will be applied to each window. For example: [numpy.mean, numpy.std]

    Returns
    -------
        Array of features with shape (n_windows, n_features).

def features_extraction(windowed_signal, functions):
    """
    -----
    Brief
    -----
    Function to extract features given in functions, that returns an array with the set of features
    for each time window.

    -----------
    Description
    -----------
    Machine learning pipelines usually use features to represent each sample of the input signals.
    Those features should be relevant in the sense that they should be useful to distinguish between the classes
    of each specific problem, and not redundant, as the usage of redundant features usually improves the complexity
    of the problem without improving its results.

    This function allows to extract features from the various windows provided in windowed_signal.

    ----------
    Parameters
    ----------
    windowed_signal: list or numpy.array
        Input windowed signal (if your signal is not windowed, you can use the function windowing of this module).
    functions: list
        List of functions that will be applied to each window. For example: [numpy.mean, numpy.std]

    Returns
    -------
        Array of features with shape (n_windows, n_features).
    """
    features = np.zeros(shape=(windowed_signal.shape[0], len(functions)))

    for i, window in enumerate(windowed_signal):
        fea = []
        for f in functions:
            fea.append(f(window))
        features[i] = fea

    return features