Also known as: UHD, USRP Hardware Driver
UHD (the USRP Hardware Driver) is the free, open-source driver and host-side API that connects a computer to Ettus Research’s USRP family of software-defined radios.1 It is the single supported way to move IQ samples between a host program and a USRP, whether that USRP is a $300 bus-powered B200 or a rack-mounted X310 on 10-gigabit Ethernet. Applications link against UHD’s library, and UHD hides the differences between USRP models behind one consistent set of calls.
How it works
At the center of UHD is the multi_usrp object, a handle that represents one or more
USRP devices as a single logical radio. A program constructs it from a device-address
string (type=b200, addr=192.168.10.2, and so on), then issues uniform calls: set the
center frequency, set the sample rate, choose a gain, pick an
antenna port, and open a streamer to pull IQ buffers. The same code drives a USB-3 B-series
board and an Ethernet-attached X-series chassis; UHD selects the right transport and
negotiates the sample format underneath.
A USRP splits work between host and hardware. On the device, an FPGA runs a digital down-converter and interpolator so it can resample and frequency-shift on-board, delivering exactly the rate the host asked for; the host then does the protocol-specific DSP. UHD manages that division:
- Streaming and flow control — it moves fixed-size sample packets across USB or Ethernet, handling back-pressure, sequence numbers, and overflow (“O”) / underflow (“U”) reporting so the host learns when it fell behind.
- Timed commands and timestamps — every sample burst carries a timestamp from the device clock, and commands can be scheduled for a future time, which is what makes coherent multi-channel and MIMO capture possible.
- Clock and time synchronization — UHD disciplines the USRP to an internal, GPSDO, or external 10 MHz / PPS reference so several radios share one time base.
- Calibration and daughterboards — it loads per-board gain, DC-offset, and IQ-imbalance corrections and abstracts the interchangeable RF daughterboards that set a USRP’s frequency coverage.
Higher-end USRPs also expose RFNoC (RF Network-on-Chip), a framework for loading custom DSP blocks into the FPGA; UHD carries the control and data streams to and from those blocks, so heavy processing can run on the device rather than the host.
Relevance to SDR
UHD is the foundation of the USRP ecosystem and, by extension, a large amount of research
and production SDR. GNU Radio talks to USRPs through its
gr-uhd blocks; gr-osmosdr and
SoapySDR both offer UHD back ends so a USRP looks like any other
source; and countless standalone tools — spectrum monitors, cellular test beds, radio-astronomy
receivers, and passive-radar rigs — link UHD directly. Because UHD exposes device timestamps
and a shared clock, it is the usual choice whenever an experiment needs phase-coherent
multichannel capture, which cheaper single-chip dongles cannot provide. It runs on Linux,
Windows, and macOS and ships both C++ and Python bindings.
GopherTrunk does not link UHD. GopherTrunk is a pure-Go decoder whose front-end support targets inexpensive receive-only radios (RTL-SDR, Airspy, and network sources), so it has no dependency on the USRP toolchain and ships as a single static binary. A USRP is overkill for receiving one trunking control channel, but UHD matters to the broader context GopherTrunk lives in: it is the reference example of a well-designed host driver — uniform API, explicit overflow signaling, device timestamps, and a clean split of DSP between hardware and host — the same concerns GopherTrunk handles in Go for its own supported radios.
Sources
-
UHD manual — Ettus Research, documenting the
multi_usrpAPI, streaming and flow control, timed commands and timestamps, clock synchronization, and RFNoC. ↩