DVB-S2 Downlink + OPV 64-Channel Receiver ACI (haifuraiya_opv)
Transmit IP network traffic over a DVB-S2 RF link while simultaneously demodulating the Opulent Voice (OPV) 64-channel uplink and capturing a receive spectrum snapshot, with both the decoded OPV frames and the spectrum embedded in the downlink.
Description
haifuraiya_opv extends DVB-S2 Downlink + Spectrum Monitor ACI (haifuraiya_aci) by adding the full
OPV folded 64-channel demodulator on the receive path. It depends on the
ocpi.opulent-voice project, which supplies the OPV workers
(channelizer, decimate3, bd_x16, cr_x16, ted_x16,
dsd_x16, fs_x16, msk_decode_x16, frame_merge4).
Transmit (unchanged from haifuraiya_aci): IP packets arriving on a Linux
TUN interface are GSE-encapsulated (ETSI TS 102 606), packed into DVB-S2
Baseband (BB) frames, and streamed to the FPGA dvbs2_encoder via the OpenCPI
ACI, then transmitted by the DRC.
Receive: the ADC stream is decimated by two cascaded half-band decimators
(÷4) and split. One branch runs the OPV channelizer and the folded demod chain
(four ports of bd_x16 → cr_x16 → ted_x16 → dsd_x16 → fs_x16 →
msk_decode_x16), merged by frame_merge4 into a single decoded-frame DMA.
The other branch feeds the triggered-sampler → windower → FFT spectrum path.
Both receive products are sent out as UDP through the TUN interface, so they are themselves GSE-encapsulated and transmitted over the DVB-S2 carrier:
OPV frames — demultiplexed by
abs_bin(from each frame’s metadata message) and sent toopv_base_port + abs_bin(default base6000), so a monitor binding6000 + Nreceives channel N (one 134-byte frame per datagram). The host toolopv_udp_monitor.py(or therx-dashboard/tile_monitor.py --udp) displays them.FFT spectrum — a 4096-point log-power snapshot serialised as JSON
{"s":[dB,…]}and sent to the FFT destination at a configurable rate.
Thread architecture: a TUN reader thread (TX BB frames), an FFT UDP
thread, an OPV UDP thread (reads opv_out, demuxes abs_bin, fans out
per channel), and the main thread that pumps BB frames into the encoder
(sending a GSE null-packet padding frame when idle to keep the encoder fed).
The FPGA application (haifuraiya_opv.xml) is built by the
haifuraiya_opv_asm HDL assembly with the cfg_1rx_1tx container (both
transmit and receive active).
Execution
Command(s)
haifuraiya_opv [fft_dest_ip [fft_dest_port [opv_base_port [fft_rate_hz]]]]
Arguments (all optional, positional):
fft_dest_ip— IP reachable via tun0 to receive spectrum data (default10.0.0.2)fft_dest_port— UDP port for spectrum JSON (default5005)opv_base_port— OPV channel-0 UDP port; channel N →base + N(default6000)fft_rate_hz— spectrum update rate in Hz (default1.0)
Prerequisites
Build the ocpi.opulent-voice dependency, the haifuraiya_opv_asm assembly,
and the bitstream for the target platform, then run the executable on the target
hardware with a configured tun0 interface.
Verification
Decoded OPV frames appear on opv_base_port + N and the spectrum JSON on the
FFT destination port; confirm with opv_udp_monitor.py and an FFT/spectrum
viewer (or the unified rx-dashboard).