/*! \page page_twinrx TwinRX Daughterboard

\tableofcontents

\section twinrx_dboards TwinRX Properties


The TwinRX 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 preamplifiers, 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.

The TwinRX daughterboard only works with the X300/X310 series of USRPs.

\subsection twinrx_dboards_mcr Master Clock Rate, Tick Rate, and Sampling Rate

Due to the specific configuration of the analog filters, the TwinRX only
supports a master clock rate of 200 MHz. Since the X300/X310 only has a single
master clock, this means that the only valid tick rate for the X300/X310 is
200 MHz, even if there is another daughterboard in the same device which could
support a different tick rate.

The maximum supported sample rate is 200 Msps if using one channel and
100 Msps if using both channels.  TwinRX only supports instantaneous
bandwidth up to 80 MHz, so a sample rate of 100 Msps or less is sufficient
for all applications.  Decimation from the 200 Msps tick rate to the desired
sample rate is handled automatically when using the default FPGA images
either by setting the sample rate (if using the multi_usrp API) or by
setting the output rate of the DDC (if using the RFNoC API).

IMPORTANT NOTE:  If building a custom RFNoC image and using both channels
of the TwinRX, the 400 Msps produced by the Radio block (2 channels at
200 Msps each) exceeds the 200 Msps throughput capacity of the crossbar
in the RFNoC framework. To resolve this, a block that consumes the 400 Msps
and produces less than 200 Msps must be statically connected to the Radio
block.  The default X300 and X310 FPGA images have a DDC block statically
connected to the Radio block which handles the decimation automatically by
setting the output rate on each channel of the DDC to 100 Msps or less.
It is recommended to leave the DDC statically connected to the Radio for
custom RFNoC FPGA images, but the DDC can be replaced by a custom block
as long as it consumes the 400 Msps and produces an aggregate of less than
200 Msps.

Starting with UHD release 4.1, the X310/X300 FPGA images no longer contain a
halfband anti-aliasing filter directly after the ADC when using TwinRX. The
filter was left out because the radio no longer decimates the sampling rate for
TwinRX, instead relying on the DDC RFNoC block to adjust the sampling rate, and
the DSP utilization of the filter was permanent, even when no TwinRX daughtercard
was used. This means the output of the radio block (which produces a 200 Msps
output signal when using TwinRX) contains aliases of the signal. The following
image shows the output of the X310+TwinRX when configuring it to run at 200 Msps.
The center frequency is set to 2.1 GHz, and a signal is applied at approx. 2.13 GHz.

\image html twinrx_alias.png "TwinRX Signal Aliases"

Due to aliasing, a mirrored alias signal will also appear at 2.17 GHz. The
statically connected DDC block will remove these aliases.

\image html TwinRX_Block_Diagram.png "TwinRX Block Diagram"

\subsection twinrx_frequency_bands Frequency Bands

The receive filter banks uses switches to select between the available filters. These paths are also dependent on the
antenna switch settings. Incorrectly setting the switches generally results in attenuated input / output power. Receive
filters are band pass (series high & low pass filters).

Source code related to controlling the filter band and antenna switches resides in twinrx_experts.cpp. Specifically,
refer to the `twinrx::twinrx_freq_path_expert` class. Generally, these methods set the switches depending on the state
of the receive streams.

The following sections provide switch setting tables for antenna and filter selection for frontend's receive paths. For
further details refer to the schematics.

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

\subsection twinrx_lo_sharing Local Oscillator Sharing

The TwinRX has the ability to export the two Local Oscillator (LO) signals from one channel to the companion channel
on the same daughterboard and/or to one or more other TwinRXs in order to form a phase-synchronous multi-channel
receiver.

|  Connector  |  Description |  Min     |  Nominal  |  Damage      |
|-------------|--------------|----------|-----------|--------------|
|  J1         |  LO2 Export  |  0 dBm   |  3 dBm    |  NA (Output) |
|  J2         |  LO2 Input   |  0 dBm   |  2 dBm    |  20 dBm      |
|  J3         |  LO1 Export  |  -12 dBm |  5 dBm    |  NA (Output) |
|  J4         |  LO1 Input   |  -10 dBm |  -5 dBm   |  10 dBm      |

\subsection twinrx_antenna_routing Antenna Routing

The TwinRX has two external antenna connectors (RX1 and RX2) which can be switched internally to either
receiver channel. By default RX1 is connected to the first channel and RX2 to the second.

When routing the antennas in any configuration other than the default there are some behavioral changes to be aware of.
As can be seen in the block diagram above the signal path from each antenna can be switched into a resistive divider
and then to either or both of the receive channels. If the divider is in use the incoming signal will be slightly
attenuated when compared to the direct passthrough. If both receive channels are configured to use the same antenna
the first two amplifiers and are a variable attenuator are shared. The effect of this is that the first channel's gain
settings for those amplifiers will override the second channel's. If both channels are tuned to the same frequency band
and at similar gain settings the effect will be minimal, but if the frequency or gain difference is large the resulting
gain on the second channel could be significantly lower or higher than expected. Additionally the signal path length
will increase in comparison to the direct antenna mapping so the phase of the received signal will be different
depending on the antenna mapping.

\subsection twinrx_power_cal Power Calibration

The X300/X310 motherboards support power-calibrating the daughterboards, and
therefore TwinRX can also make use of this calibration API (see also \ref page_power).

However, unlike other daughterboards, the relationship between actual, received
power, and power measured at the ADC depend on more parameters than with the
other daughterboards. First of all, the TwinRX has two complete analog receiver
chains, unlike all the other daughterboards. Both receiver chains can be connected
to any RF input, which already increases the number of combinations that need to
be calibrated. Furthermore, the RF paths inside the daughterboard have an
optional switch, which allows both receivers to receive from the same input, at
different frequencies.


single chan

x3xx_power_cal_rx_rx1 + serial:{0, 1}
x3xx_power_cal_rx_rx2 + serial:{0, 1}

dual chan


x3xx_power_cal_rx_rx1 + serial:{00, 11}
x3xx_power_cal_rx_rx2 + serial:{00, 11}



*/
// vim:ft=doxygen:
