usrp-users@lists.ettus.com

Discussion and technical support related to USRP, UHD, RFNoC

View all threads

TwinRX + X300 Usage

CH
Christian Hahn
Wed, Jul 26, 2017 9:27 PM

Hey USRP-users,

I am doing some experiments that involve a USRP x300 + (2) TwinRX
daughtercards.  I am observing some degraded performance and would like
some advice on the manner in which I am configuring the receivers /
mainboard / daughtercards.

The experiment I am conducting involves collection of high-dynamic range
channel-estimates: similar requirements to a direction-finding problem.  In
my setup, I have 1 remote transmitter, and 4 receivers.

I am least confident about how I am configuring the daughtercards since
there are no examples that I could find which use these relatively new
daughtercards.

The observations I have made indicate abnormally high phase noise and poor
relative SNR between receivers.  For example, when injecting an identical
signal into all 4 receivers, receivers 0-1 and 2-3 are 45 dB matched,
respectively.  However, receivers across daughtercards are not!  This is
strange since in my configuration of the USRP I intended to share the same
LO across all four receivers.  Furthermore, the spectrum of each receiver
is quite spurious.  I am expecting more than 45 dB SNR, at least.  The
signal level into the receivers is -36 dBm (average).  The PAPR of the
signal is very low < 5 dB.

This is the code I am using to configure the USRP and take a capture of
samples.  It is using a thin wrapper written in Python around the
multi_usrp C++ API.

Thank you very much, any insight is much appreciated!

#########################

import uhd
import time

Some parameters

freq = 1600.e6
gain = 60.
num_samples = int(10.e6)

Create the USRP object

usrp = uhd.Uhd('type=x300,addr=192.168.50.2,second_addr=192.168.40.2')

Configure mainboard

usrp.set_clock_source('external')
usrp.set_rx_subdev_spec('A:0 A:1 B:0 B:1')
usrp.set_rx_rate(100.e6)

Configure receivers

source = ['internal', 'companion', 'external', 'external']
export = [True, False, False, False]
antenna = ['RX1', 'RX2', 'RX1', 'RX2']
for chan in range(usrp.get_rx_num_channels()):
usrp.set_rx_lo_source(source[chan], 'all', chan)
usrp.set_rx_lo_export_enabled(export[chan], 'all', chan)
usrp.set_rx_antenna(antenna[chan], chan)
usrp.set_rx_freq(freq, chan)
usrp.set_rx_gain(gain, chan)

time.sleep(1.)

Capture samples

samps = usrp.receive(num_samples, list(range(usrp.get_rx_num_channels())),
False)

Hey USRP-users, I am doing some experiments that involve a USRP x300 + (2) TwinRX daughtercards. I am observing some degraded performance and would like some advice on the manner in which I am configuring the receivers / mainboard / daughtercards. The experiment I am conducting involves collection of high-dynamic range channel-estimates: similar requirements to a direction-finding problem. In my setup, I have 1 remote transmitter, and 4 receivers. I am least confident about how I am configuring the daughtercards since there are no examples that I could find which use these relatively new daughtercards. The observations I have made indicate abnormally high phase noise and poor relative SNR between receivers. For example, when injecting an identical signal into all 4 receivers, receivers 0-1 and 2-3 are 45 dB matched, respectively. However, receivers across daughtercards are not! This is strange since in my configuration of the USRP I intended to share the same LO across all four receivers. Furthermore, the spectrum of each receiver is quite spurious. I am expecting more than 45 dB SNR, at least. The signal level into the receivers is -36 dBm (average). The PAPR of the signal is very low < 5 dB. This is the code I am using to configure the USRP and take a capture of samples. It is using a thin wrapper written in Python around the multi_usrp C++ API. Thank you very much, any insight is much appreciated! ######################### import uhd import time # Some parameters freq = 1600.e6 gain = 60. num_samples = int(10.e6) # Create the USRP object usrp = uhd.Uhd('type=x300,addr=192.168.50.2,second_addr=192.168.40.2') # Configure mainboard usrp.set_clock_source('external') usrp.set_rx_subdev_spec('A:0 A:1 B:0 B:1') usrp.set_rx_rate(100.e6) # Configure receivers source = ['internal', 'companion', 'external', 'external'] export = [True, False, False, False] antenna = ['RX1', 'RX2', 'RX1', 'RX2'] for chan in range(usrp.get_rx_num_channels()): usrp.set_rx_lo_source(source[chan], 'all', chan) usrp.set_rx_lo_export_enabled(export[chan], 'all', chan) usrp.set_rx_antenna(antenna[chan], chan) usrp.set_rx_freq(freq, chan) usrp.set_rx_gain(gain, chan) time.sleep(1.) # Capture samples samps = usrp.receive(num_samples, list(range(usrp.get_rx_num_channels())), False)
DK
Derek Kozel
Thu, Jul 27, 2017 10:00 PM

Hello Christian,

Your configuration of the LO sharing is all reasonable. You are not using
timed commands so you will not get repeatable phase offsets between the
channels due to the DDC's CORDIC and the RX frontend's IF downconverter not
being synchronously reset. The call to set_rx_freq for each channel should
be executed with the same command time.

Have you tuned the gain to maximize your signal? I do not have a signal
generator connected at the moment, but a gain of 60 sounds like you may
have some more headroom to increase your amplitude. This will improve noise
figure and usually SNR.

When you say that two channels are 45 dB matched, what are you measuring?

Thank you,
Derek

On Wed, Jul 26, 2017 at 10:27 PM, Christian Hahn via USRP-users <
usrp-users@lists.ettus.com> wrote:

Hey USRP-users,

I am doing some experiments that involve a USRP x300 + (2) TwinRX
daughtercards.  I am observing some degraded performance and would like
some advice on the manner in which I am configuring the receivers /
mainboard / daughtercards.

The experiment I am conducting involves collection of high-dynamic range
channel-estimates: similar requirements to a direction-finding problem.  In
my setup, I have 1 remote transmitter, and 4 receivers.

I am least confident about how I am configuring the daughtercards since
there are no examples that I could find which use these relatively new
daughtercards.

The observations I have made indicate abnormally high phase noise and poor
relative SNR between receivers.  For example, when injecting an identical
signal into all 4 receivers, receivers 0-1 and 2-3 are 45 dB matched,
respectively.  However, receivers across daughtercards are not!  This is
strange since in my configuration of the USRP I intended to share the same
LO across all four receivers.  Furthermore, the spectrum of each receiver
is quite spurious.  I am expecting more than 45 dB SNR, at least.  The
signal level into the receivers is -36 dBm (average).  The PAPR of the
signal is very low < 5 dB.

This is the code I am using to configure the USRP and take a capture of
samples.  It is using a thin wrapper written in Python around the
multi_usrp C++ API.

Thank you very much, any insight is much appreciated!

#########################

import uhd
import time

Some parameters

freq = 1600.e6
gain = 60.
num_samples = int(10.e6)

Create the USRP object

usrp = uhd.Uhd('type=x300,addr=192.168.50.2,second_addr=192.168.40.2')

Configure mainboard

usrp.set_clock_source('external')
usrp.set_rx_subdev_spec('A:0 A:1 B:0 B:1')
usrp.set_rx_rate(100.e6)

Configure receivers

source = ['internal', 'companion', 'external', 'external']
export = [True, False, False, False]
antenna = ['RX1', 'RX2', 'RX1', 'RX2']
for chan in range(usrp.get_rx_num_channels()):
usrp.set_rx_lo_source(source[chan], 'all', chan)
usrp.set_rx_lo_export_enabled(export[chan], 'all', chan)
usrp.set_rx_antenna(antenna[chan], chan)
usrp.set_rx_freq(freq, chan)
usrp.set_rx_gain(gain, chan)

time.sleep(1.)

Capture samples

samps = usrp.receive(num_samples, list(range(usrp.get_rx_num_channels())),
False)


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Hello Christian, Your configuration of the LO sharing is all reasonable. You are not using timed commands so you will not get repeatable phase offsets between the channels due to the DDC's CORDIC and the RX frontend's IF downconverter not being synchronously reset. The call to set_rx_freq for each channel should be executed with the same command time. Have you tuned the gain to maximize your signal? I do not have a signal generator connected at the moment, but a gain of 60 sounds like you may have some more headroom to increase your amplitude. This will improve noise figure and usually SNR. When you say that two channels are 45 dB matched, what are you measuring? Thank you, Derek On Wed, Jul 26, 2017 at 10:27 PM, Christian Hahn via USRP-users < usrp-users@lists.ettus.com> wrote: > Hey USRP-users, > > I am doing some experiments that involve a USRP x300 + (2) TwinRX > daughtercards. I am observing some degraded performance and would like > some advice on the manner in which I am configuring the receivers / > mainboard / daughtercards. > > The experiment I am conducting involves collection of high-dynamic range > channel-estimates: similar requirements to a direction-finding problem. In > my setup, I have 1 remote transmitter, and 4 receivers. > > I am least confident about how I am configuring the daughtercards since > there are no examples that I could find which use these relatively new > daughtercards. > > The observations I have made indicate abnormally high phase noise and poor > relative SNR between receivers. For example, when injecting an identical > signal into all 4 receivers, receivers 0-1 and 2-3 are 45 dB matched, > respectively. However, receivers across daughtercards are not! This is > strange since in my configuration of the USRP I intended to share the same > LO across all four receivers. Furthermore, the spectrum of each receiver > is quite spurious. I am expecting more than 45 dB SNR, at least. The > signal level into the receivers is -36 dBm (average). The PAPR of the > signal is very low < 5 dB. > > This is the code I am using to configure the USRP and take a capture of > samples. It is using a thin wrapper written in Python around the > multi_usrp C++ API. > > Thank you very much, any insight is much appreciated! > > ######################### > > import uhd > import time > > # Some parameters > freq = 1600.e6 > gain = 60. > num_samples = int(10.e6) > > # Create the USRP object > usrp = uhd.Uhd('type=x300,addr=192.168.50.2,second_addr=192.168.40.2') > > # Configure mainboard > usrp.set_clock_source('external') > usrp.set_rx_subdev_spec('A:0 A:1 B:0 B:1') > usrp.set_rx_rate(100.e6) > > # Configure receivers > source = ['internal', 'companion', 'external', 'external'] > export = [True, False, False, False] > antenna = ['RX1', 'RX2', 'RX1', 'RX2'] > for chan in range(usrp.get_rx_num_channels()): > usrp.set_rx_lo_source(source[chan], 'all', chan) > usrp.set_rx_lo_export_enabled(export[chan], 'all', chan) > usrp.set_rx_antenna(antenna[chan], chan) > usrp.set_rx_freq(freq, chan) > usrp.set_rx_gain(gain, chan) > > time.sleep(1.) > > # Capture samples > samps = usrp.receive(num_samples, list(range(usrp.get_rx_num_channels())), > False) > > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > >