Time Granularity of USRP N2XX

Since we can get receive time of rx_stream’s first sample via rx tags, I
have two questions about the time granularity. Given the internal clock
is 10Mhz, is the time granularity 0.1us? The fractional second is stored
double type. Does it mean the last digits of the fractional sec are

Hi Harry,

as far as I know, the granularity of a time stamp is the sample duration
at the downsampled side.
As for the 10MHz: The 10MHz clock is used to derive different other
clocks, especially the rx ADC and tx DAC clocks, which are an order of
magnitude higher; bear in mind that when you request e.g. “5MHz samle
rate” you still get the 100MHz* samples of the ADC, but downsampled by a
factor of 20.

Please also bear in mind that due to physics, processing etc the
timestamp of the rx side is delayed to the actual reception of “that
sample”, and that this delay is largely constant when receiving using
the same settings, but my change based on sampling rate and other


*for USRP2 arch, if I remember correctly.

Dear Marcus,
Thank you for your reply.
I’m confused about two concepts. Referring to the file
time_spec.hpp in UHD, fractional sec is calculated according to the
parameter ticks and tick_rate. So I think the time granularity is
‘1/tick_rate’ which is 0.1us using 10Mhz clock. But for the timestamp
of sample stream, the granularity is the sample duration. Is it


Hi Harry -

Actually, the name `tick_rate

Hi Harry -

Actually, the name tick_rate is somewhat confusing. The tick_rate
to the clock rate that the DSP chain runs at. Here is a bit of code
regarding the tick_rate from the USRP2 / N-Series implementation that
make things a little more clear:

    _tree->create<double>(mb_path / "tick_rate")

.subscribe(boost::bind(&usrp2_impl::update_tick_rate, this,

Marcus explained things correctly in his e-mail. So, on an N-Series
the time step between samples is 1/100e6 = 10 ns.