Simulink Streaming Dsp logo

Simulink Streaming Dsp

OrganizationPopular
matlab
simulink-streaming-dsp

Building or editing Simulink (.slx) models that stream signals in frames using DSP System Toolbox — audio, vibration, radar, comms. Use when the prompt names a Simulink block (Discrete FIR Filter, Buffer, Unbuffer, Rate Transition, Downsample, Upsample, Sample-Rate Converter, FIR Decimation, Time Scope, Spectrum Analyzer, From Multimedia File) or an action (frame-based processing, InputProcessing, buffering, overlap, windowing, STFT, short-time Fourier, decimate, downsample, upsample, resample, multirate, anti-aliasing, tunable filter). Prevents silent numerical errors from sample-vs-frame mismatch, wrong block choice, or missing anti-aliasing.

Overview

Publishermatlab
Repositorysimulink-agentic-toolkit
Skill namesimulink-streaming-dsp
Stars
1.2K
Forks
112
Bundled files
7
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 7 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by matlab on GitHub. Read the source before you install it.

Installation

Install the Simulink Streaming Dsp AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/matlab/simulink-agentic-toolkit/tree/main/skills-catalog/signal-processing/simulink-streaming-dsp
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/matlab/simulink-agentic-toolkit.git /tmp/simulink-agentic-toolkit
mkdir -p .claude/skills
cp -r /tmp/simulink-agentic-toolkit/skills-catalog/signal-processing/simulink-streaming-dsp .claude/skills/simulink-streaming-dsp
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Simulink Streaming Dsp in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Simulink Streaming Dsp on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Simulink Streaming Dsp is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Simulink Streaming DSP

Build streaming (frame-based) signal processing models in Simulink using DSP System Toolbox. This skill prevents silent errors from wrong block selection, missed parameter settings, and outdated filter architectures.

The most damaging failures here are silent: the model compiles, simulates, and produces output — but the numbers are wrong, with no error or warning. Apply the Block Selection and Frame-Based Configuration rules on every build, even for tasks a strong model would usually get right — they are the cheap insurance against silent corruption and they hold across models and effort levels.

When to Use

  • Building a Simulink model that processes signals in frames (not sample-at-a-time)
  • Choosing source, sink, or visualization blocks for a DSP pipeline
  • Adding filters to a streaming model (FIR, IIR, tunable)
  • Buffering signals (scalar→frame, frame resizing, overlapping windows, unbuffering)
  • Converting sample/frame rates (decimate, interpolate, fractional resample)
  • Building multirate models (dual-path, different frame sizes, mixed rates)
  • Working with variable-size signals (packet-based, adaptive frame sizes)
  • Building a tunable/adjustable filter with runtime parameter control
  • Visualizing signals or filter responses (Time Scope, Spectrum Analyzer, Filter Visualizer)
  • Computing buffering latency or frame timing

When NOT to Use

  • MATLAB-only scripting (no Simulink model) — use standard MATLAB functions
  • Continuous-time Simulink modeling (no discrete/DSP blocks)

Model Construction — Use the MCP Model Tools Only (mandatory)

Build and edit every model through the MATLAB MCP model tools — model_edit (add/connect/configure/delete), model_read, model_check, model_test. Never construct or modify a model with raw MATLAB commands (add_block, add_line, set_param, delete_line, new_system, …) run through evaluate_matlab_code. The MCP tools handle autolayout, undo tracking, and error recovery; the raw-command fallback is slow (block-by-block round-trips), skips layout, and is prohibited. Use evaluate_matlab_code only to run/verify a model (sim, reading logged signals, rebuffer_delay, filter design math) — never to build one.

Get the schema right the first time — guessing field names wastes turns. The add-block field is type (a full library path), and connections use target:

add_block:  {"op":"add_block", "type":"dspsrcs4/Sine Wave", "ref":"src", "name":"SineWave", "params":{"SamplesPerFrame":"256"}}
connect:    {"op":"connect", "target":"#src.y1 -> #buf.u1"}          // #ref within the same call
configure:  {"op":"configure", "target":"blk_3", "params":{"InputProcessing":"Columns as channels (frame based)"}}
  • type (NOT source, path, or block) names the block; ref is your handle for chaining, and the response returns ref → blk_id.
  • connect uses target: "src.y1 -> dst.u1" (NOT from/to); y1 = output port 1, u1 = input port 1. Within one call reference just-added blocks as #ref; across calls use the returned blk_N id.
  • Model-level settings (solver, display overlays) go through a configure op targeting config:<ModelName>, not set_param:
    {"op":"configure", "target":"config:MyModel", "params":{"ShowLineDimensions":"on","SampleTimeColors":"on"}}

Wrong field names fail with a misleading Unrecognized field name "type" — that error means the operation was missing type, not that the tool is broken.

Build Workflow

Build a streaming DSP model in this order. Each step has a verification.

  1. Source — pick the DSP source block (see Block Selection). Set SamplesPerFrame.

  2. Frame configuration — confirm the signal is [FrameSize × NumChannels] (column-oriented). See the Frame-Based Configuration Checklist.

  3. Processing — add filters / rate conversion / buffering. For each filter, set/inherit frame-based InputProcessing.

  4. Sink — pick a DSP display/output block (Time Scope, Spectrum Analyzer — never Scope).

  5. Solver — Fixed-step, Discrete (no continuous states).

  6. Verify — turn on the model's information overlays so dimensions and rates are visible on the diagram, then confirm signal dimensions read [N×1]/[N×C], not [1×N]. Confirm output against a reference where possible.

    • Non-scalar signals → enable signal dimensions via a configure op: {"op":"configure","target":"config:<model>","params":{"ShowLineDimensions":"on"}}. Wires then annotate their size — a [1×N] label flags a wrong orientation at a glance.
    • Multirate models (any two blocks running at different sample times) → enable sample time colors via a configure op: {"op":"configure","target":"config:<model>","params":{"SampleTimeColors":"on"}}. Each rate draws in a distinct color, so an unintended rate transition or a block stuck at the wrong rate is immediately obvious.

For the task at hand, load the matching reference (see Task References below) once the block-level details are needed.

Block Selection

Select blocks using this table. Never use the generic Simulink equivalent — it lacks frame-based processing support and silently corrupts framed signals.

Source Blocks

User intentCorrect blockLibraryKey parameter
Read audio/video fileFrom Multimedia Filedspsrcs4AudioFrameSize (dialog: "Samples per audio channel")
Load workspace signal (framed)Signal From Workspacedspsrcs4SamplesPerFrame, SignalName
Generate sine/cosine test signalSine Wave (DSP)dspsrcs4SamplesPerFrame, Frequency
Generate chirp test signalChirp (DSP)dspsrcs4SamplesPerFrame
Generate noiseRandom Sourcedspsrcs4SamplesPerFrame, SourceType

Never use From Workspace (Simulink built-in) — outputs [1×N] row vectors, not [N×1] column frames.

Sink Blocks

User intentCorrect blockLibrary
View time-domain waveformTime Scopedspsnks4
View frequency spectrumSpectrum Analyzerdspsnks4
View filter frequency responseFilter Visualizerdspsnks4
View vector/array snapshotArray Plotdspsnks4
Write audio/video to fileTo Multimedia Filedspsnks4

Discouraged use Scope (Simulink built-in) — no frame-based support, staircase display, no DSP measurements. This applies even when display is a secondary part of the task ("…and show the output").

Filter Blocks

NeedUseAvoid
FIR filteringdsparch4/Discrete FIR Filter (frame-based default)simulink/Discrete/Discrete FIR Filter (sample-based default)
IIR via cascaded biquadsSecond-Order Section Filter (R2023b+)Biquad Filter (legacy)
Tunable filtertwo-block Design→Implementation patternmonolithic / MATLAB Function

The Discrete FIR Filter exists in two libraries with the same name — see Checklist Rule 1.

For exact library paths and parameter names of any block, see references/block-inventory.md — the master lookup; load it when you need a path for model_edit or need to confirm a parameter name.

Frame-Based Configuration Checklist

These settings produce silent wrong output if left at defaults. The agent typically knows these facts when asked directly but fails to apply them while building — run this checklist on every model.

Rule 1: Use the DSP Discrete FIR Filter, not Simulink's

LibraryInputProcessing defaultUse for streaming?
dsparch4/Discrete FIR Filter (DSP System Toolbox)"Columns as channels (frame based)"YES
simulink/Discrete/Discrete FIR Filter (Simulink built-in)"Elements as channels (sample based)"NO

If you must use any block whose InputProcessing defaults to sample-based, set:

InputProcessing = "Columns as channels (frame based)"

Affected blocks with sample-based defaults: simulink/Discrete/Discrete FIR Filter, Discrete Filter, Biquad Filter.

Why it matters: "Elements as channels (sample based)" treats each element in the frame as a separate channel. A 256-sample frame becomes 256 single-sample channels filtered independently — output is garbage, no error thrown.

Exceptions: Second-Order Section Filter, FIR Decimation, FIR Interpolation default to frame-based — no action needed. And when input is genuinely multichannel sample-based (e.g. [1×8] from 8 sensors at one instant), "Elements as channels" is the correct choice — do not reflexively force frame-based.

Rule 2: FrameBasedProcessingString on Time Scope

After connecting a frame-based signal to Time Scope, set:

FrameBasedProcessingString = "Columns as channels (frame based)"

Same mechanism as Rule 1 — the default shows a staircase display instead of a smooth waveform.

Rule 3: Signal Dimension Convention

DSP signals are column vectors: [FrameSize × NumChannels].

  • [256×1] = 256-sample frame, 1 channel — CORRECT
  • [1×256] = 1 sample, 256 channels — WRONG for streaming DSP
  • [512×2] = 512-sample frame, 2 channels (stereo) — CORRECT

A [1×N] line means something upstream is wrong (a From Workspace block or a transposing MATLAB Function).

For any model with non-scalar signals, turn on ShowLineDimensions via a configure op ({"op":"configure","target":"config:<model>","params":{"ShowLineDimensions":"on"}}) so every wire is annotated with its size — this makes a stray [1×N] visible on the diagram instead of only discoverable by clicking each signal.

Rule 4: Solver Configuration

Apply via a configure op targeting config:<model> (not set_param): {"op":"configure","target":"config:<model>","params":{"SolverType":"Fixed-step","Solver":"FixedStepDiscrete","FixedStep":"auto"}}

  • Solver type: Fixed-step
  • Solver: Discrete (no continuous states) — unless mixing with continuous blocks
  • Fixed-step size: auto (Simulink derives the base rate from block sample times)

Task References

When the build reaches one of these task domains, load the matching reference for block-level detail, parameters, and timing math. SKILL.md covers the cross-cutting rules above; these cover the specifics.

TaskReferenceLoad when
Block / library lookupreferences/block-inventory.mdNeed the exact library path or parameter name for any DSP block referenced in the tables above
Buffering / multiratereferences/buffering-multirate.mdChanging frame size, overlap windows, unbuffering, dual-path, multirate timing, buffering latency
Rate conversionreferences/rate-conversion.mdDecimate / interpolate / resample; choosing FIR Decimation vs Downsample; setting RateOptions (single-rate vs multirate)
Tunable filteringreferences/tunable-filtering.mdBuilding any runtime-tunable filter; the 8 Design blocks, two-block pattern, SOS vs Biquad, Parameter Smoother
Variable-size signalsreferences/variable-size-signals.mdFrame size changes during simulation; variable→fixed conversion; the Buffer/variable-rate traps
Visualizationreferences/visualization.mdConfiguring Spectrum Analyzer (NumInputPorts, spectrogram), Filter Visualizer wiring, Array Plot, Time Scope frame config

Each reference is self-contained and loaded on demand — read only the one relevant to the current step.

Common Mistakes

What the agent does wrongWhy it failsCorrect approach
Uses From Workspace for audio/signal inputOutputs [1×N] row vector, not [N×1] column frameUse From Multimedia File or Signal From Workspace
Uses Scope for signal displayNo frame-based processing, staircase displayUse Time Scope (dspsnks4)
Uses simulink/Discrete/Discrete FIR FilterSample-based default — silent wrong outputUse dsparch4/Discrete FIR Filter
Leaves InputProcessing at default on a sample-based filter blockSilent wrong output — runs but garbageSet "Columns as channels (frame based)" or use the DSP block
Adds a Buffer before Spectrum Analyzer for scalar inputSA buffers internally — extra Buffer is unnecessaryConnect scalar directly to SA
Uses Downsample/Upsample for a rate changeNo anti-aliasing/anti-imaging — aliases or imagesUse FIR Decimation / FIR Interpolation (or Sample-Rate Converter)
Reverses RateOptions single-rate vs multirate semanticsWrong output frame size or frame rate, silentlySingle-rate → frame size changes; multirate → frame rate changes (see rate-conversion.md)
Builds TFE+ArrayPlot or FFT workaround for filter responseOver-engineered, noisy, needs excitationUse Filter Visualizer (1 block, exact response)
Uses Biquad Filter for IIRLegacy block, not tunable, no Design-block integrationUse Second-Order Section Filter (R2023b+)
Calls the two-block pattern "old" and monolithic "new"Inverted — two-block IS the modern R2023b+ patternDesign block → Implementation block is correct
Treats the plain Buffer as a variable-size→fixed converterBuffer requires a fixed compile-time input sizeUse dsp.AsyncBuffer (in a MATLAB Function)
Models a variable frame size as a variable rateFrame-size change does not alter the sample periodVariable-size needs only a discrete sample time
Uses Variable FIR Decimation to convert arbitrary variable-size→fixed framesIt accepts variable-size input, but its Output frame length mode only rebuffers when each input frame length is an integer multiple of Po — fails for chunk sets like {240,480,960}→256Use dsp.AsyncBuffer (write variable chunks, read fixed frames) + a separate anti-alias filter
Computes buffer latency manuallyMisses tasking-mode edge casesUse rebuffer_delay()
Tries to reconcile rebuffer_delay against a hand-measured impulse latencyThey answer different questions; overlap changes the output rate, so the numbers legitimately differ — chasing the gap is a time sinkrebuffer_delay returns input-rate samples and is an alignment delay, not an impulse-peak position; report it as the buffer latency and add downstream filter group delay separately (see buffering-multirate.md)

Copyright 2026 The MathWorks, Inc.


Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Simulink Streaming Dsp AI skill do?

Building or editing Simulink (.slx) models that stream signals in frames using DSP System Toolbox — audio, vibration, radar, comms. Use when the prompt names a Simulink block (Discrete FIR Filter, Buffer, Unbuffer, Rate Transition, Downsample, Upsample, Sample-Rate Converter, FIR Decimation, Time Scope, Spectrum Analyzer, From Multimedia File) or an action (frame-based processing, InputProcessing, buffering, overlap, windowing, STFT, short-time Fourier, decimate, downsample, upsample, resample, multirate, anti-aliasing, tunable filter). Prevents silent numerical errors from sample-vs-frame...

Why use Simulink Streaming Dsp on TypingMind?

Because you install it once and use it with any model. Simulink Streaming Dsp is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Simulink Streaming Dsp in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/matlab/simulink-agentic-toolkit/tree/main/skills-catalog/signal-processing/simulink-streaming-dsp. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Simulink Streaming Dsp?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Simulink Streaming Dsp?

As many as you like. As long as a model supports skills, you can use Simulink Streaming Dsp with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Simulink Streaming Dsp AI skill free?

It is published on GitHub by matlab. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇