SKA PST DSP Architecture

The Digital Signal Processing (DSP) component of the Pulsar Timing (PST) product is responsible for performing the digital signal processing of the channelised voltages in the tied-array beam data generated by the Correlator Beam Former (CBF) producing reduced data products that will be transmitted to the Science Data Processor (SDP) for subsequent secondary analysis.

The PST DSP component is configured, controlled, and monitored by via a gRPC interface with PST LMC.

DSP will consist of signal processing functionality that will be incrementally released throughout the array released schedule and will be delivered in the following order:

  1. AA0.5 Disk Voltage Recorder

  2. AA1 Flow Through Mode

  3. AA2 Detected Filterbank Mode (limited channelisation)

  4. AA3 Pulsar Timing Mode (limited channelisation)

  5. AA4 Detected Filterbank and Pulsar Timing Modes (complete)

State Model

PST DSP applications interface with the shared memory ring buffer as depicted in the following sequence diagram.

@startuml
actor User
participant StreamReader as Disk
participant DataBlockRead as Reader
participant ipcbuf_t as header
participant ipcio_t as data

activate Disk
User -> Disk: Call perform_configure_beam()
Disk -> Reader: Create DataBlockRead instance
activate Reader
Reader -> header: Create ipcbuf_t instance
activate header
Reader -> data: Create ipcio_t instance
activate data

Disk -> Reader: Call connect()
Reader -> header: Call connect()
Reader -> data: Call connect()

Disk -> Reader: Call lock()
Reader -> header: Call lock_read()

User -> Disk: Call perform_configure_scan()
Disk -> Reader: Call read_config()
Reader -> header: Call get_next_read()
Reader -> header: Call mark_cleared()

loop For each scan
    User -> Disk: Call perform_scan()

    Disk -> Reader: Call read_header()
    Reader -> header: Call get_next_read()
    Reader -> header: Call mark_cleared()

    Disk -> Reader: Call open()
    Reader -> data: Call open('R')

    loop Until end of data
        Disk -> Reader: Call open_block()
        Reader -> data: Call open_block_read()
        Disk -> Reader: Call close_block()
        Reader -> data: Call close_block_read()
    end

    Disk -> Reader: Call close()
    Reader -> data: Call close()

    User -> Disk: Call perform_stop_scan()
end

User -> Disk: Call perform_deconfigure_scan()
Disk -> Reader: Call clear_config()

User -> Disk: Call perform_deconfigure_beam()
Disk -> Reader: Call unlock()
Reader -> header: Call unlock_read()

Disk -> Reader: Call disconnect()
Reader -> header: Call disconnect()
Reader -> data: Call disconnect()

deactivate Reader
deactivate data
deactivate header
@enduml

Sequence diagram showing interaction with the ring buffer