[USRP-users] What makes sense and what doesn't in the way carrier frequency is set for TwinRX currently?

Piotr Krysik perper at o2.pl
Wed Mar 13 09:48:21 EDT 2019

Hello everyone,

TwinRXes requires special treatment when setting frequency in order to
keep co-channel phase differences across multiple executions of a
program communicating with USRP.

What exactly 'treatment' I mean can be seen for example here:

or here:


The procedure is following (correct configuration of LO export and LO
sources is assumed):

1. set the frequency for the channel exporting LOs, and store result,
2. set the frequency for the rest of the channels using the result saved
previously and POLICY_MANUAL for rf and dsp,
3. set the frequency again for all channels with use of timed commands.

In uhd_app's constructor there is also call to set_time_unknown_pps
between points 2 and 3. In twinrx_usrp_source.py set_time_unknown_pps is
called before point 1. The placement of this function call after the
first setting of the carrier frequency seems to be crucial. Without it
there are random 180 degree changes of phase differences between
channels from one run to another. And this issue can be observed for
twinrx_usrp_source.py, because it calls set_time_unknown_pps before
setting the frequency (checked on UHD_3.15.0.git-13-g52138314).

I also changed different settings to see what effects they have. I
didn't notice any effect of POLICY_MANUAL setting in point 2. Setting
the frequency in regular way seems to work just as well. Also removing
point 3 completely (setting freq. with use of timed commands) seems to
not have any effect for TwinRX (I checked this with use of sine wave as
the input signal, in case it is important).

In the end what I did was configuring LO export/sources in GNU Radio and
adding usrp.set_time_unknown_pps(..) at the end of the of the
constructor. As a result co-channel phase differences were (~) constant
across multiple runs.

My question:
1. What is the rationale for all of the steps of frequency setting for
TwinRX? Did I have luck that most of them didn't have any effect for me?
2. Why is the call to set_time_unknown_pps required at all? And why when
it is called after the first setting of carrier frequency in all
channels, it fixes the issue with 180 degree phase shifts from one run
to another? If it's called before, it doesn't seem to have this positive

Best Regards,
Piotr Krysik

More information about the USRP-users mailing list