You should use a tune_request_t to manually specify the DSP frequency.
The issue is that only the master (LO source) channel knows about the
actual frequency error in the LO and will automatically use the DDC to
compensate for that error. The other channels must have the same
correction applied manually.
http://files.ettus.com/manual/page_general.html#general_tuning
The GNU Radio UHD interface automatically does this. It is in Python,
but the concept is fairly well illustrated.
https://github.com/gnuradio/gnuradio/blob/34f7e66e82079ef25b72ba6d6931fac05cfb968a/gr-uhd/apps/uhd_app.py#L219
Regards,
Derek
On Mon, Jun 4, 2018 at 1:14 PM, Fabian Schwartau via USRP-users
<usrp-users@lists.ettus.com <mailto:usrp-users@lists.ettus.com>> wrote:
Hi Derek,
I think I got that. Is the DDC frequency + offset aligned
automatically if I use a timed command for usrp->set_rx_freq()? Or
is there some other command I missed?
Best regards,
Fabian
Am 04.06.2018 um 13:20 schrieb Derek Kozel:
Fabian,
Timed commands, carefully and correctly used along with common
10 MHz and 1PPS, can give you time aligned reception with an
accuracy of one sample clock period. They are used by many
projects for this. To have repeatable phase relationships
between channels you must also use timed commands to set the DDC
frequency offset and decimation. This ensures that you have
exactly matching frequency on all channels and exactly the
number of samples produced on each stream so they stay inline.
With the TwinRX you must use LO sharing between all channels to
have repeatable phase offsets.
The LOs take approximately 5mS to settle on the TwinRX, so for
your application you can issue a tune command for time X, then a
stream command for X + 5mS.
https://github.com/EttusResearch/uhd/blob/maint/host/examples/twinrx_freq_hopping.cpp
<https://github.com/EttusResearch/uhd/blob/maint/host/examples/twinrx_freq_hopping.cpp>
Regards,
Derek
On Mon, Jun 4, 2018 at 11:47 AM, Fabian Schwartau via USRP-users
<usrp-users@lists.ettus.com <mailto:usrp-users@lists.ettus.com>
<mailto:usrp-users@lists.ettus.com
<mailto:usrp-users@lists.ettus.com>>> wrote:
Hello Derek,
thank you very much.
So is it correct, that the timing using the set_comman_time()
function is so precise that I can do MIMO with it? That
would be
great :)
Best regards,
Fabian
Am 04.06.2018 um 10:52 schrieb Derek Kozel:
Hello Fabien,
Yes, it is possible to queue commands, however there
are two
important things to keep in mind. The commands will
block any
other commands in the same queue from executing until the
current one's time is reached. So commands must be sent
in order
(100, then 120, 140 ...). Second, the queue has finite
length
and if too many commands are sent it will backup into
the host.
The TwinRX frequency hopping example will be a good
reference
for you to look at. It implements a different strategy
where
only one channel is used to receive and the second
channel is
used as a secondary LO source, but its inner loop shows
how to
use burst receiving and timed commands to have sample
accurate
timing and do a precise sweep across a list of frequencies.
Regards,
Derek
On Mon, Jun 4, 2018 at 8:40 AM, Fabian Schwartau via
USRP-users
<usrp-users@lists.ettus.com
<mailto:usrp-users@lists.ettus.com>
<mailto:usrp-users@lists.ettus.com
<mailto:usrp-users@lists.ettus.com>>
<mailto:usrp-users@lists.ettus.com
<mailto:usrp-users@lists.ettus.com>
<mailto:usrp-users@lists.ettus.com
<mailto:usrp-users@lists.ettus.com>>>> wrote:
Hi,
thanks for the great answer.
One more question: Is it possible to send multiple
commands for
different times right after each other? So for
example if the
current time is 100, I execute the code you
provided for
120, 140
and 160 at once without waiting for the command at
120 to
be executed.
Best regards,
Fabian
Am 03.06.2018 um 12:44 schrieb Marcus Müller:
Hello Fabian,
the issue can be overcome using what we call timed
commands – simply
tell your USRP to tune that LO at time X, and
it'll do
exactly that!
A bit of example code:
//we will tune the frontends in 500ms from now
uhd::time_spec_t cmd_time = usrp->get_time_now() +
uhd::time_spec_t(0.5);
//sets command time on all devices
//the next commands are all timed
usrp->set_command_time(cmd_time);
//tune channel 0 and channel 1
usrp->set_rx_freq(1.03e9, 0); // Channel 0
usrp->set_rx_freq(1.03e9, 1); // Channel 1
//end timed commands
usrp->clear_command_time();
You can also instruct the RX streamer to start
streaming at a
specific
time, so that you either know beforehand, at which
sample count the
tuning happened.
Alternatively, the rx_metadata coming from the
USRP
contains
timestamps
of the first sample in the sample packet,
so you can
use that to
calculate at which sample the tuning happens.
Best regards,
Marcus
On Sun, 2018-06-03 at 11:35 +0200, Fabian
Schwartau via
USRP-users
wrote:
Hello everyone,
I have a question about frequency hopping in a
synchronized
scenario.
I
have two USRP X310, each equipped with two
TwinRX.
The LOs are
generated
by one of the TwinRX and are distributed
to all the
others (even
across
the two motherboards). 10 MHz and 1PPS are
also
coming from
a single
source. Then I use the "unknown PPS"
method to sync the
ADCs. This
works
perfectly.
Now I listen to a single frequency on all
channels and
change this
frequency frequently. I would like to hop
the frequency
every 20ms or
faster. In order not to loose the ADC
synchronization, I start a
continuous stream and switch the frequency
while
receiving. This
works
in principle, but I am not able to
identify at which
frequency the
data
that currently comes in was recorded. I
tried using a
constant time
from
setting the new frequency to when I assume
the new
data to
be at the
new
frequency. But even with a timeout of
~50ms the
results in data
indicate
the the delay was not enough in a very few
cases.
I know there is the locked_lo sensor, but
this also
does not
help. I
guess this is caused by buffers which
cause a more
or less
random
delay
between setting the frequency and
receiving the
data. This
depends on
CPU load and other things, so it is quite
random.
Is there a way to solve this issue? E.g.
by embedding
information
about
the LO state in the data. Or defining an
exact time
when to
execute
the
frequency switch, so that I can use the
metadata
timestamp
in the
receive stream to identify the exact point
when the
frequency was
switched (I know that the locking can take
a few ms
- so I would
discard
the data between the switch and the
signalling+locking
offset). Or is
it
possible to perform multiple time limited
captures
without
having to
sync the ADCs again?
In an ideal situation I would like the
FPGA to switch
frequency, wait
for LOs to lock, take a single shot
synchronized
measurement
(~1ms of
data), transmit the data to the PC (I am
using 10G
link) and
continue
with the next frequency. Is that possible
without
touching
the FPGA
code?
Best regards,
Fabian
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com <mailto:USRP-users@lists.ettus.com>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>>>
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>>>
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com <mailto:USRP-users@lists.ettus.com>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>>>
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>>>
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com <mailto:USRP-users@lists.ettus.com>
<mailto:USRP-users@lists.ettus.com
<mailto:USRP-users@lists.ettus.com>>
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>>
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com <mailto:USRP-users@lists.ettus.com>
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
<http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com>