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
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>> 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>>> 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>>
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>
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com