DigitalDownConverter — Pipeline
Architecture
graph TD
recv["mkrecv\n(SPEAD2 capture)"]
ibuf["Input DADA\nring buffer"]
ddc["ddc_processing\n(GPU kernel)"]
obuf["Output DADA\nring buffer"]
mksend["mksend\n(SPEAD2 sender)"]
diskwriter["disk writer"]
recv -->|"time-domain heaps"| ibuf
ibuf --> ddc
ddc -->|"subband data"| obuf
obuf --> mksend
obuf --> diskwriter
The pipeline uses three processes sharing two PSRDADA ring buffers pinned to GPU-local NUMA memory:
mkrecv captures SPEAD2 heaps from the network and writes them into the input ring buffer. It is assigned to cores on the NIC’s NUMA node.
ddc_processing reads blocks from the input buffer, applies the polyphase filter bank and digital down-conversion on GPU, and writes interleaved lower/upper sideband output into the output ring buffer. Up/downsampling factors are computed from the ratio of input to output sample rate.
mksend (one instance per
output_type: networkentry) reads from the output buffer and transmits SPEAD2 multicast streams. A disk writer handlesoutput_type: disk.
Buffer slot sizes are derived from the DDCProcessorDataModel properties
(input_buffer_size, output_buffer_size) and must satisfy alignment constraints for the
resampling filter.
KATCP State Machine
stateDiagram-v2
[*] --> idle
idle --> configuring : configure
configuring --> configured : success
configuring --> error : failure
configured --> capturing : capture_start
capturing --> running : internal
running --> capturing : capture_stop
capturing --> configured : stop
configured --> idle : deconfigure
error --> idle : reset
Configuration
Key |
Type |
Default |
Description |
|---|---|---|---|
|
int |
|
|
|
int |
|
Option to configure the minimum size of the input buffer. |
|
int |
|
|
|
list |
|
The local oscillations for selecting the center frequencies of the sidebands. The length of the list is the number of channels*2 (lower and upper sideband per oscillation) |
|
int |
|
The samplerate per sideband in Hz. It is usually set to 2e6,4e6,…, 512e6 |
|
bool |
|
|
|
list |
|
Options are ‘network’, ‘disk’ or any. 1. Use ‘network’ for streaming VDIF to the network. 2. Use ‘disk’ to store the data. 3. Use any arbitary stream to forward the output to /dev/null |
|
str |
|
|
|
str |
`` |
|
|
int |
|
|
|
int |
|
|
|
int |
|
sets the number of dada slots per ringbuffer |
|
int |
|
Notes
f_lodetermines the number of output channels: each entry produces two streams (lower and upper sideband), solen(output_data_streams)must equal2 × len(f_lo).output_sampleratemust be a valid subband rate (2e6, 4e6, …, 512e6 Hz).dada_nslotscontrols ring buffer depth; reduce if host memory is limited.output_typeaccepts"network","disk", or both as a list.
KATCP Sensors
Sensor |
Type |
Description |
|---|---|---|
|
string |
State machine state (nominal / error / panic) |
|
string |
Active configuration as JSON |
|
string |
Package version |
|
string |
edd-core package version |
|
float |
Output data rate [Gbps] |