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:

  1. 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.

  2. 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.

  3. mksend (one instance per output_type: network entry) reads from the output buffer and transmits SPEAD2 multicast streams. A disk writer handles output_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

samples_per_heap

int

2048

minimum_size

int

16777216

Option to configure the minimum size of the input buffer.

output_bit_depth

int

32

f_lo

list

[256000000]

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)

output_samplerate

int

128000000

The samplerate per sideband in Hz. It is usually set to 2e6,4e6,…, 512e6

nonfatal_numacheck

bool

False

output_type

list

[network]

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

input_type

str

network

input_file

str

``

channel_id_start

int

0

file_duration

int

60

dada_nslots

int

16

sets the number of dada slots per ringbuffer

slots_skip

int

0

Notes

  • f_lo determines the number of output channels: each entry produces two streams (lower and upper sideband), so len(output_data_streams) must equal 2 × len(f_lo).

  • output_samplerate must be a valid subband rate (2e6, 4e6, …, 512e6 Hz).

  • dada_nslots controls ring buffer depth; reduce if host memory is limited.

  • output_type accepts "network", "disk", or both as a list.

KATCP Sensors

Sensor

Type

Description

pipeline-status

string

State machine state (nominal / error / panic)

current-config

string

Active configuration as JSON

pipeline-version

string

Package version

edd-core-version

string

edd-core package version

output-rate

float

Output data rate [Gbps]