DSP Pipeline
In Ham Cockpit, the plugins that process I/Q and audio data in real time are organized in a DSP Pipeline. This article describes the architecture of DSP Pipeline and is intended for the plugin developers. Please see the article in User's Guide that explains DSP Pipeline from the user's perspective.
Data Flow
DSP Pipeline consists of a data input plugin, several data processing
plugins, and a data output plugin. Operation of the pipeline
is based on the data-pull model. The output plugin, typically
Audio Output to Soundcard,
calls the
Read(Single[], Int32, Int32)
method of the last processing plugin when it needs more data, e.g,
when the soundcard requests another block of samples for playback.
All processing plugins, connected in a chain, call the Read
method of the preceding plugin, process received data, and return it
to the caller. The data input plugin, when its Read
method is called,
returns the data received from the radio.
Data Format
The data are passed between the plugins as an array of float
values,
but the actual data format, described by the
Format property, varies from plugin to plugin. The signal
processing plugins receive and return I/Q data, while audio processing
plugins have real-valued audio data at input and output. The
demodulator plugins receive I/Q data and return the audio.
IDspPipeline Interface
The data processed in the DSP Pipeline are available outside of the pipeline via the IDspPipeline interface exposed by the plugin host object. The S-Meter plugin, published with source code, is one of the plugins that make use of these data.
The
IDspPipeline
interface
exposes the properties
InputSignal
, ProcessedSignal
, DemodulatedAudio
and
ProcessedAudio
of type
ISampleStreamTap
that allow the client
plugins to tap the pipeline at different points.
The data are delivered via the data-push model: to receive the data,
the plugins subscribe to the
SamplesAvailable
event exposed by the pipeline taps.
In addition to the data taps, the DspPipeline
exposes the
ModeSwitch
, Transmitter
and Tuner
properties that allow reading
and changing the transmitter and receiver settings. See the
Frequency Display plugin, also available with
source code, for an example that reads and displays these settings.