From Ettus Knowledge Base
Jump to: navigation, search

Device Overview

The TwinRX daughterboard for the USRP X Series SDR platform is a two-channel superheterodyne receiver designed for high performance spectrum monitoring and direction finding applications. The receiver is tunable from 10 MHz - 6 GHz and has 80 MHz of instantaneous bandwidth per channel, providing the versatility necessary to analyze a variety of signals in multiple bands of interest. Each channel has an independent RF signal chain with preampilifiers, preselectors, and two mixer stages for superior selectivity. Users can tune the two channels independently to simultaneously monitor uplink and downlink communication with a combined bandwidth of 160 MHz. The ability to share the LO between channels across multiple daughterboards enables the phase-aligned operation required to implement scalable multi-channel phased-arrays. The receiver is capable of fast frequency hopping to detect frequency agile emitters. Configurable RF attenuation and preamplication allow users to optimize dynamic range in favor of noise figure for faint signals, or IP3 for stronger signals. UHD automatically configures the RF signal path for optimized performance in the pre-defined use cases, and provides the flexibility to adjust settings manually. Support for RFNoC on the X Series motherboard enables deterministic FPGA-accelerated computations for real-time spectrum analysis.

TwinRX BlockDiagram.png

Key Features

  • Two-Channel Superheterodyne Receiver
  • Frequency Range: 10 MHz - 6 GHz
  • Bandwidth: 80 MHz per channel ( 160 MHz total )
  • RF shielding
  • Independent RF signal channels with optional LO sharing
TwinRX large.png

Daughterboard Specifications


  • 2 superheterodyne frontends (2 receive)
  • 80 MHz per channel
  • Independent tuning
  • LO Sharing Capability
  • Coherent and phase-aligned operation
  • Preselection Filters
  • RF Shielding


Receive: RX1 or RX2


  • Receive Gains Range: 0-95dB


  • TwinRX: 80 MHz per channel ( 160 MHz total )


  • lo_locked: boolean for LO lock state


The TwinRX has six MMCX RF connectors on it.

Connector Description Damage Threshold/Max Output
J1 LO2 Export 0 dBm output
J2 LO2 Input +20dBm input
J3 LO1 Export +5 dBm output
J4 LO1 Input +10dBm input
J5 Antenna 1 connector (RX1) +10 dBm input
J6 Antenna 2 connector (RX2) +10 dBm input

Preselector Filters

Band Range
LB1 10 - 500 MHz
LB2 500 - 800 MHz
LB3 800 - 1.2 GHz
LB4 1.2 - 1.8 GHz
HB1 1.8 - 3.0 GHz
HB2 3.0 - 4.1 GHz
HB3 4.1 - 5.1 GHz
HB4 5.1 - 6.0 GHz
TwinRX Normalized Preselector Response.png
  • Each preselector filter has a ±40 MHz band overlap.

RF Specifications

Freq Range

  • 10MHz - 6GHz

Noise Figure

Frequency Preamp Enabled
10 MHz - 3 GHz < 5
3 GHz - 5 GHz < 4
5 GHz - 6 GHz < 8

RX Third Order Intercept (dBm)

Frequency Full Scale = -45 dBm Full Scale = -30 dBm Full Scale = -20 dBm
10 MHz - 1.8 GHz -8 -2 16
1.8 GHz - 3 GHz -10 -1 14
3 GHz - 6 GHz -13 -1 12

Phase Noise (dBc/Hz)

Frequency Offset 0.9 GHz 2.4 GHz 5.8 GHz
10 kHz -88 -86 -82
100 kHz -105 -107 -103
1 MHz -124 -127 -127

Hardware Specifications

  • Ettus Research recommends to always use the latest stable version of UHD. Minimum UHD version is


  • Current Hardware Revision: 2
  • Minimum version of UHD required:
  • Minimum version of GNU Radio required: 3.7.10

Environmental Specifications

Operating Temperature Range

  • 0-40 °C

Operating Humidity Range

  • 10% to 90% non-condensing

USRP Compatibility

  • X Series only

Phase Synchronization

The TwinRX daughterboard is capable of phase-synchronous operation, and is recommended for phase-coherent applications. Please note that the TwinRX is receive-only. The SBX and UBX daughterboards are also recommended for phase-coherent applications, and are capable of both transmit and receive operations.


The TwinRX daughterboard is composed of two PCBs, the Intermediate Frequency (IF) board and the RF board. There are two functionally identical revisions of TwinRX at the moment. Please check the back of your TwinRX to see which you have. The schematics for TwinRX revision B should answer most possible questions. If you have any further questions please email

TwinRX Revision A - (159685A-01)

  • IF Board Revision B - (158671B-01L)
  • RF Board Revision C - (156263C-01L)

TwinRX Revision B - (159685B-01)

  • IF Board Revision C - (158671C-01L)
  • RF Board Revision D - (156263D-01L)

File:TwinRX IF Board Rev C.pdf

File:TwinRX RF Board Rev D.pdf

RF Connectors

The antenna ports are MMCX connectors with 50 ohm input impedance. By default Antenna 1 (RX1) is routed to Channel 1 and Antenna 2 (RX2) to Channel 2. This routing can be changed to swap the antennas or to share a single antenna to both channels. The damage threshold for the antenna inputs is 10 dBm. In practice the available gain makes much lower input powers recommended for achieving the best dynamic range and noise figure.

TwinRX 80 Inputs.jpg

Local Oscillator Connectors

Note: LO sharing cables are not required for a single TwinRX setup. LO sharing cables are only required with two TwinRX daughterboards in a single USRP X300/X310.

Connector Description Min Nominal Damage
J1 LO2 Export 0 dBm 3 dBm NA (Output)
J2 LO2 Input 0 dBm 2 dBm 20dBm
J3 LO1 Export -12 dBm 5 dBm NA (Output)
J4 LO1 Input -10 dBm -5 dBm 10dBm
Antenna 1 connector RX 1 10 dBm
Antenna 2 connector RX 2 10 dBm
TwinRX 80 LOs.jpg

LO Sharing with Neighbour TwinRXs

TwinRX (A Slot) TwinRX (B Slot)
J1 LO2 Export J2 LO2 Input
J2 LO2 Input J1 LO2 Export
J3 LO1 Export J4 LO1 Input
J4 LO1 Input J3 LO1 Export

Software API

New Multi USRP Functions

The advanced functionalities of the TwinRX will be exposed through new functions implemented in Multi-USRP.

Antenna Mapping

The two channels of the TwinRX can be independently configured to use either of the two antenna ports, RX1 and RX2 using the standard antenna selection function in multi_usrp.

   virtual void set_rx_antenna(const std::string &ant, size_t chan = 0) = 0;

Select the RX antenna on the frontend.

  • ant the antenna name
  • chan the channel index 0 to N-1

Local Oscillator Control and Routing

The TwinRX has two channels, CH1 and CH2 and each channel has two local oscillators, LO1 and LO2. The local oscillators for a channel can be sourced from that channel's internal synthesizers, the companion channel's synthesizers, or external inputs. The value multi_usrp::ALL_LOS can be used to specify that the command be run on both synthesizers for a channel. The defaults are to operate on

   virtual std::vector<std::string> get_rx_lo_names(size_t chan = 0) = 0;

Get a list of possible LO stage names

  • chan the channel index 0 to N-1
  • Returns a vector of strings for possible LO names

   virtual void set_rx_lo_source(const std::string &src, const std::string &name = ALL_LOS, size_t chan = 0) = 0;

Set the LO source for the usrp device. For USRPs that support selectable LOs, this function allows switching between them. Supported options for source: internal, external, companion.

  • src a string representing the LO source
  • name the name of the LO stage to update
  • chan the channel index 0 to N-1

   virtual const std::string get_rx_lo_source(const std::string &name = ALL_LOS, size_t chan = 0) = 0;

Get the currently set LO source.

  • name the name of the LO stage to query
  • chan the channel index 0 to N-1
  • Returns the configured LO source

   virtual std::vector<std::string> get_rx_lo_sources(const std::string &name = ALL_LOS, size_t chan = 0) = 0;

Get a list of possible LO sources.

  • name the name of the LO stage to query
  • chan the channel index 0 to N-1
  • Returns a vector of strings for possible settings

   virtual double set_rx_lo_freq(double freq, const std::string &name, size_t chan = 0) = 0;

Set the RX LO frequency.

  • freq the frequency to set the LO to
  • name the name of the LO stage to update
  • chan the channel index 0 to N-1
  • Returns a coerced LO frequency

   virtual double get_rx_lo_freq(const std::string &name, size_t chan = 0) = 0;

Get the current RX LO frequency.

  • name the name of the LO stage to query
  • chan the channel index 0 to N-1
  • Returns the configured LO frequency

   virtual freq_range_t get_rx_lo_freq_range(const std::string &name, size_t chan = 0) = 0;

Get the LO frequency range of the RX LO.

  • name the name of the LO stage to query
  • chan the channel index 0 to N-1
  • Returns a frequency range object

Exporting Local Oscillators

   virtual void set_rx_lo_export_enabled(bool enabled, const std::string &name = ALL_LOS, size_t chan = 0) = 0;

Set whether the LO used by the usrp device is exported For USRPs that support exportable LOs, this function configures if the LO used by chan is exported or not.

  • enabled if true then export the LO
  • name the name of the LO stage to update
  • chan the channel index 0 to N-1 for the source channel

   virtual bool get_rx_lo_export_enabled(const std::string &name = ALL_LOS, size_t chan = 0) = 0;

Returns true if the currently selected LO is being exported.

  • name the name of the LO stage to query
  • chan the channel index 0 to N-1




As of December 1st, 2010 all Ettus Research products are RoHS compliant unless otherwise noted. More information can be found at

China RoHS

Management Methods for Controlling Pollution Caused by Electronic Information Products Regulation

Chinese Customers

National Instruments is in compliance with the Chinese policy on the Restriction of Hazardous Substances (RoHS) used in Electronic Information Products. For more information about the National Instruments China RoHS compliance, visit


FPGA Resources

UHD Stable Binaries

UHD Source Code on Github