The three analyses on this page sit one level above the individual descriptors. Instead of producing a single physical quantity, they combine many features into a decision-ready result: a scalar deviation from a known-good baseline, a learned embedding vector, or a map of the modulation structure hidden in a stationary-looking signal.
The anomaly score answers a question that has no textbook formula: does this machine sound different from the machines I know are good? It does so without any labelled fault data — only recordings of normal behaviour are required.
Each analysis frame is reduced to fourteen features, eight from the waveform and six from the spectrum of the same frame:
| Domain | Features |
|---|---|
| Time | RMS, Kurtosis, Crest Factor, Shape Factor, Impulse Factor, Margin Factor, Energy Entropy (8 sub-frames), Zero Crossing Rate |
| Spectrum | Spectral Centroid, Spectral Spread, Spectral Flatness, Spectral Crest, Spectral Entropy, Spectral Rolloff |
The definitions are exactly those of the corresponding stand-alone analyses, so a high score can always be traced back to an interpretable quantity. Any feature that cannot be evaluated on a frame (for example a ratio on a silent frame) contributes 0 rather than invalidating the whole vector.
The baseline stores a mean and a standard deviation per dimension. A frame is scored by its normalized distance from that baseline — a diagonal Mahalanobis distance averaged over the dimensions:
The normalization by the number of dimensions makes the score easy to read: a frame that sits exactly on the baseline scores 0, and a frame that deviates by exactly one standard deviation in every dimension scores exactly 1. A threshold of 3 therefore means “on average three sigma away from normal”, independent of how many features are used.
Each standard deviation is regularized to a small positive floor, so a feature that happens to be constant across the baseline recordings cannot blow the score up to infinity.
Three ways of obtaining the baseline are supported, tried in this order:
| Mode | Set by | Use |
|---|---|---|
| Loaded from file | BaselineStatsPath | Production use: the baseline was trained on a population of known-good units and is reused unchanged for every test. |
| Head of the recording | BaselineSeconds | Run-in and endurance monitoring: the first seconds define “normal” and the rest of the recording is compared against them. Falls back to the whole file if the head segment yields fewer than eight frames. |
| Whole file | default | Exploration: find the relatively most unusual passages inside a single recording. |
Whichever mode is active, setting BaselineExportPath writes the baseline statistics to a
JSON file, so a baseline derived from a good unit can be captured once and reused later through
BaselineStatsPath.
The result is a score curve over time. Its single value is the 95th percentile of the
score, which is far more stable than the maximum and works well as a pass / fail criterion. The
annotation additionally reports the maximum score and the moment at which it occurred. An alarm is
raised when any frame exceeds AnomalyThreshold, and it states how many frames exceeded it
and where the worst one was.
| Parameter | Default | Notes |
|---|---|---|
FrameSize | 2048 | Analysis frame in samples; values below 256 fall back to the default |
Hop | 1024 (half the frame) | Advance between frames |
Window | Hanning | Applied before the FFT of the spectral features |
BaselineStatsPath | — | JSON baseline to load; takes precedence over the other modes |
BaselineSeconds | 0 (off) | Use the first N seconds of the recording as the baseline |
BaselineExportPath | — | Write the baseline in use to this JSON file |
AnomalyThreshold | 3 | Score above which a frame counts as anomalous |
An embedding is a fixed-length vector produced by a pretrained neural network, in which acoustically similar recordings end up close together. It turns “does this sound like that” into a distance computation, and it lets a classifier be trained on a handful of examples instead of thousands.
The analysis reuses the standardized Log-Mel front end with the
training-domain scaling ln(mel + 0.01) fixed, computes the mel matrix for a channel and
feeds it to the model given by OnnxModelPath. The first output of the model is flattened
into the embedding vector.
The front-end parameters must match the convention the model was trained with. The defaults correspond to the widely used 25 ms / 10 ms, 64-band, 125…7500 Hz layout.
Models declare their input differently — some expect frames first, some bands first, some carry a
batch dimension, some leave dimensions dynamic. The analysis reads the shape declared by the model
and fills it in: a dimension whose declared size equals the number of mel bands receives the bands,
other fixed dimensions are kept as declared, and dynamic dimensions are filled from the back with the
band count, then the frame count, then 1. If the model declares no shape at all, the tensor is built
as [1, frames, mels].
The embedding is displayed as a curve over the dimension index; its single value is the vector norm
|v|, and the annotation states the dimensionality. Two vectors can then be compared by
cosine similarity to find the nearest known sound.
No model file is shipped with the software. If OnnxModelPath is empty or the
file does not exist, the analysis reports this and finishes without an error — the engine is
ready and only waits for a model. Because the result is entirely determined by the model you supply,
this entry carries no verification stars in the Insert catalogue.
| Parameter | Default | Notes |
|---|---|---|
OnnxModelPath | required | Path to the ONNX model file |
NMels | 64 | Mel bands — must match the model's training convention |
FrameMs | 25 ms | Frame length of the front end |
HopMs | 10 ms | Hop of the front end |
FMin | 125 Hz | Lower edge of the filter bank |
FMax | 7500 Hz | Upper edge of the filter bank |
Many machine faults are invisible in an ordinary spectrum because their signature is not a line but a modulation: a high-frequency resonance whose amplitude is switched on and off at a low repetition rate. Cyclic spectral analysis separates the two frequencies — the carrier that is being excited and the cyclic frequency at which it is modulated — and shows them on two independent axes.
The signal is transformed by a strongly overlapping short-time Fourier transform. For each carrier
line f, the sequence of frame powers et = |Xt(f)|² is the
envelope of that line over time. Removing its mean and transforming it along the frame axis gives the
modulation content, normalized by the mean envelope so the result is a relative modulation depth
rather than an absolute level:
The factor 2 merges the positive and negative cyclic frequencies, so the value can be read directly as a modulation ratio. A stationary, unmodulated signal gives values close to 0; an amplitude modulated carrier produces a clear ridge at the modulation rate and weaker ridges at its harmonics.
Because the modulation is observed at the frame rate of the short-time transform, the accessible cyclic frequency range and its resolution follow directly from the window and hop settings:
where K is the number of frames used, truncated to the largest power of two available so
that the cyclic frequency grid is exact and no zero padding leakage occurs. This range comfortably
covers the modulation rates of bearing and gear faults, which lie between a few hertz and a few
hundred hertz. CscAlphaMaxHz can limit the displayed range further, which speeds up the
analysis when only low modulation rates are of interest.
The result is a colormap with the cyclic frequency α on one axis and the carrier frequency
f on the other:
The analysis also reports the cyclic frequency at which the coherence, averaged over all carrier lines, is highest — the dominant modulation rate of the recording. The first two cyclic bins are skipped in this search because they are dominated by slow level drift rather than by a genuine modulation.
| Parameter | Default | Notes |
|---|---|---|
CscWindowSize | 256 | STFT window in samples; sets the carrier frequency resolution. Values below 32 fall back to the default |
CscHop | 64 (a quarter of the window) | Frame advance; sets the frame rate and therefore the maximum cyclic frequency |
Window | Hanning | Applied before the FFT |
CscAlphaMaxHz | 0 (= frame rate / 2) | Upper limit of the displayed cyclic frequency range |
© 2026 Deepsona. All Rights Reserved.