SvdEntropy

SVD entropy: how many independent components the signal's history spans.

SvdEntropy py
data
entropy
Type name
signal:SvdEntropy
Plane
signal
Tags
analysis
Language
python
Tier
in-process
Bundle
complexity
Source
node-bundles/complexity/svd_entropy.py
Availability
available

Slots

SlotDirectionType
datainputARRAY
entropyoutputARRAY

Parameters

svd

NameTypeDefaultRangeDoc
orderint32 … 20Dimension of the delay embedding.
delayint11 … 100Samples between embedding coordinates.
normalizebooltrueScale to 0..1 against an even spread.

common

NameTypeDefaultRangeDoc
autotriggerboolfalseRun on the node's own schedule, instead of waiting for an input frame. Turn this on for sources; leave it off for transforms driven by their input.
max_frequencyfloat00 … 100Rate cap for this node, read through `frequency_mode`. 0 means uncapped — the node runs as often as the scheduler and its inputs allow.
frequency_modestringupdates_per_secondupdates_per_second | seconds_per_updateHow to read `max_frequency`: as a rate in Hz (updates per second), or as a period in seconds between updates — convenient for very slow nodes.

Source

The current source of this node, as it stands in the goofi repository at node-bundles/complexity/svd_entropy.py.

node-bundles/complexity/svd_entropy.py
"""SvdEntropy — how many independent components a signal's own history has, from antropy.

Embeds the signal in a delay space and reads the spread of its singular values: a rhythm needs
few, noise needs all. The last axis is time and is consumed; every axis before it survives.
"""

import antropy
import numpy as np
import goofi


class SvdEntropy(goofi.Node):
    """SVD entropy: how many independent components the signal's history spans."""

    TAGS = ["analysis"]
    INPUTS = {"data": goofi.InputSlot(goofi.DataType.ARRAY, required=True)}
    OUTPUTS = {"entropy": goofi.DataType.ARRAY}
    PARAMS = {
        "svd": {
            "order": goofi.IntParam(3, 2, 20, doc="Dimension of the delay embedding."),
            "delay": goofi.IntParam(1, 1, 100, doc="Samples between embedding coordinates."),
            "normalize": goofi.BoolParam(True, doc="Scale to 0..1 against an even spread."),
        }
    }

    def process(self, data):
        p = self.params.svd
        return np.apply_along_axis(
            antropy.svd_entropy,
            -1,
            np.asarray(data.data, dtype=np.float64),
            order=p.order,
            delay=p.delay,
            normalize=p.normalize,
        ).astype(np.float32)

← All nodes

This reference describes goofi 3.1.0(537cd394), generated from a running instance on 2026-09-06.