Use this skill when conditioning, loading, preparing, or labeling signal data for analysis or ML training. Covers: cleaning a single signal (fill gaps, remove drift, deoutlier, denoise, resample/align a time base) BEFORE analysis; building a `signalDatastore` pipeline; creating a `labeledSignalSet` for Signal Labeler; deriving labels (filename, folder, in-file, ROI, time-frequency ROI); stratified train/val/test splits; framing long signals; parallel processing; and shaping datastore output f...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add matlab/matlab-agentic-toolkit --skill matlab-prepare-signal-data --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Matlab Prepare Signal Data?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/matlab-matlab-prepare-signal-data)More formats (shields.io, HTML) on the badges page.
---
name: matlab-prepare-signal-data
description: |
Use this skill when conditioning, loading, preparing, or labeling signal
data for analysis or ML training. Covers: cleaning a single signal (fill
gaps, remove drift, deoutlier, denoise, resample/align a time base) BEFORE
analysis; building a `signalDatastore` pipeline; creating a `labeledSignalSet`
for Signal Labeler; deriving labels (filename, folder, in-file, ROI,
time-frequency ROI); stratified train/val/test splits; framing long signals;
parallel processing; and shaping datastore output for `trainnet`.
Triggers include "clean up this signal", "remove drift / detrend", "fill
gaps", "remove spikes / outliers", "denoise", "resample to a uniform rate",
"align channels", "labels from filenames", "stratified split", "prepare for
Signal Labeler", and function names like `fillgaps`, `fillmissing`,
`detrend`, `filloutliers`, `smoothdata`, `resample`, `synchronize`,
`signalDatastore`, `labeledSignalSet`, `filenames2labels`, `folders2labels`,
`splitlabels`, `framesig`, `framelbl`, `createDatastores`.
license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md
metadata:
author: MathWorks
version: "1.1"
---
# Prepare Signal Data
> **Look in Signal Processing Toolbox first.** The conditioning, labeling,
> splitting, framing, and partitioning helpers here live in Signal Processing
> Toolbox — not in Stats & ML Toolbox or generic-MATLAB string utilities.
The arc: **condition** a raw signal (clean it) -> **load** a folder into a
datastore -> **label** -> **split / frame** -> **hand off** to `trainnet`. Each
stage is a workflow file; this page routes you to the right one.
## When to Use
- Cleaning a single signal before analysis: fill gaps, remove drift, deoutlier,
denoise, put it on a uniform time base, align multiple channels.
- Loading / preparing signal data for ML training: datastores, labels from
filenames or folders, stratified splits, framing, parallel processing.
- Structured labeling: `labeledSignalSet` for Signal Labeler, all label types.
## When NOT to Use
- **Raw `.wav` audio classification with Audio Toolbox available.**
`audioDatastore` is the canonical path (this skill's custom-`ReadFcn`
workflow handles `.wav` only when Audio Toolbox is absent —
references/wf-custom-readfcn.md).
- **Frequency-selective filter DESIGN** (band isolation, notch, custom FIR/IIR)
— see the `matlab-design-digital-filter` skill. This skill's conditioning is
about cleaning, not designing filters.
- **Computing per-frame features** (RMS, crest factor, spectral / bandwidth,
time-frequency features) from an already-conditioned signal — see the
`matlab-extract-signal-features` skill. This skill's `framesig` / `framelbl`
are for manual per-window labeling / supervision, not for deriving a feature
table; the `signal*FeatureExtractor` objects window internally and emit the
table.
## Best practices
- **Deliverable is a runnable `.m` script** the user can save, version, and
re-run — not workspace state.
- **Prefer the highest-level function that does the job.** `detrend` /
`smoothdata` / `fillmissing` / `resample` read cleanly and are easy for a
non-expert to follow. Drop to a lower-level / more-configurable path
(`designfilt` + `filtfilt`, a hand-built AR model, a named primitive) only
when you need control the high-level call cannot give, or when the user asks.
Readability first; escalate to low-level for necessity, not by default.
- The high-level call usually exposes the control you think you need. In
particular `smoothdata(x, "sgolay", fl)` takes the frame length `fl` as an
argument — it does NOT hide it — so prefer it over calling `sgolayfilt`
directly. Reach for `sgolayfilt` only for what the dispatcher genuinely
lacks (derivative output via `dn`, or an unusual polynomial order).
## 0. Common reflexes
If your first instinct is one of these, the canonical replacement is one row away.
| Reflex | Canonical | Detail |
|---|---|---|
| Hand-design a highpass/`designfilt` to remove a smooth drift | `detrend(x, n)` — escalate `n` = 1 -> 2 -> 3 before reaching for a filter; polynomial detrend has unity passband gain | references/fn-detrend.md |
| Invent a gap-filler (`regularizeNaNs`, `inpaintn` — not real) | `fillmissing` (interp) for short gaps; `fillgaps` (SPT, AR) for long gaps in oscillatory signals | references/wf-repair-missing.md |
| Hand-roll `retime` + shift + `retime` + concat to align channels | `synchronize(A, B, ...)` — one call to a shared grid | references/wf-align-channels.md |
| Custom `ReadFcn` for a `.csv` | `signalDatastore` default reader + `SignalVariableNames` | references/fn-signaldatastore.md |
| `cvpartition` for a datastore split | `splitlabels` + `subset(ds, idx{k})` | references/fn-splitlabels.md |
| `regexp` / `extractBefore` / `fileparts` for labels from filenames | `filenames2labels(sds, Extract=...)` | references/fn-filenames2labels.md |
| `regexp` / nested `fileparts` for labels from subfolders | `folders2labels(sds.Files)` | references/fn-folders2labels.md |
| Manual framing loop with `(i-1)*hop+1` | `framesig(x, fl, OverlapLength=...)` | references/wf-frame-and-label.md |
| Manual ROI-to-frame vote with `containers.Map` | `framelbl(rois, ...)` | references/wf-frame-and-label.md |
| `for` loop `load(file)` to read in-file label variables | `signalDatastore(folder, SignalVariableNames=["x","label"])` | references/fn-signaldatastore.md |
| `signalMask` when you need Signal Labeler interop | `labeledSignalSet` with ROI labels (signalMask can't import) | references/fn-labeledsignalset.md |
| `signalLabeler(lss)` (pass the set as an arg) | Launch bare `signalLabeler` (zero args), then Import -> From Workspace or From File | references/wf-label-and-export.md |
> **SPT-specialized functions exist — reach for them, don't reinvent.**
> `fillgaps` (AR gap fill), `medfilt1` / `hampel` (impulse handling),
> `sgolayfilt` / `smoothdata(...,"sgolay")` (feature-preserving smoothing) are
> in Signal Processing Toolbox.
## 1. Workflows
Each workflow file is the entry point and lists the functions it uses. Start here.
| Workflow | Use when | Reference |
|---|---|---|
| **Repair missing samples** | NaN gaps / dropouts to fill. | references/wf-repair-missing.md |
| **Detrend, smooth, deoutlier** | Drift, spikes, and/or broadband noise on one signal (smoothing/denoising lives here). | references/wf-detrend-smooth-deoutlier.md |
| **Align multi-rate / offset channels** | Several channels onto a shared time base. | references/wf-align-channels.md |
| **Put one channel on a uniform rate** | One channel -> uniform grid at a chosen rate: jittery timestamps to regularize, OR already uniform but the wrong rate to `resample`. | references/wf-uniform-rate.md |
| **Wavelet denoising (escalation)** | Non-stationary/multi-scale noise a tuned `sgolayfilt` can't remove; `wdenoise` (Wavelet TB). | references/wf-denoise.md |
| **Envelope extraction** | Amplitude outline (AM demod, peak hull) — not cleaning. | references/wf-envelope.md |
| **Load + label + split** | Folder of files -> datastore for training. | references/wf-load-and-split.md |
| **Frame long signals + per-frame labels** | Long signals, per-window supervision. | references/wf-frame-and-label.md |
| **Label + export (all label types)** | Structured labels (attribute/ROI/point/TF-ROI), export to Signal Labeler / DL. | references/wf-label-and-export.md |
| **Parallel processing across a parpool** | Per-signal work across workers. | references/wf-parallel-process.md |
| **Custom ReadFcn (only when needed)** | Format isn't `.mat` / `.csv`, or has a metadata prelude. | references/wf-custom-readfcn.md |
| **Hand-off to `trainnet`** | Datastore ready; shape for `trainnet` / `combine`. | references/wf-handoff-to-dl.md |
> Each workflow file names the `fn-` reference pages for the functions it uses;
> there is no separate function index — enter through the workflow that matches
> your task, or the reflex table above.
## 2. Ordering when a signal needs several conditioning steps
**The governing principle (this is the real rule):** order the steps so an
earlier operation does not corrupt the input to a later one. Spikes bias
least-squares fits and get smeared by filters/resamplers; an un-removed trend
gets averaged into the signal by a smoother; most operations choke on `NaN`.
Reason from that for the signal in front of you — do not follow a fixed chain
blindly.
**Default heuristic** (a good starting order, not a universal law):
**outliers -> detrend -> smooth**, with fill and align placed by the principle above.
- **outliers -> detrend -> smooth** is the verified core: remove spikes before
a polynomial `detrend` (a spike biases the fit) and before a smoother (a
smoother spreads the spike across its window); detrend before smooth so the
smoother isn't averaging across a trend.
- **Fill** `NaN` before any step that can't handle missing data (detrend,
filters, most smoothers).
- **Align / resample:** putting a signal on a new grid (`retime`/`synchronize`)
*creates* `NaN` at non-overlapping times, so fill after aligning. BUT if the
signal has spikes, deoutlier *before* resampling — `resample`'s anti-alias
filter will smear an un-removed spike. So align-vs-outliers order depends on
the signal; the principle decides, not a fixed sequence.
Not every signal needs every step — identify which apply, order them by the
principle, and each workflow file has an off-ramp if your problem is actually a
different family.
----
Copyright 2026 The MathWorks, Inc.
----
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!