[USRP-users] Exact alignment between gnuradio sample stream and USRP time

Lukas Haase lukashaase at gmx.at
Thu Jan 23 12:32:23 EST 2020


Hi,

TO MY UNDERSTANDING, the USRP has an internal clock that is different from host clock when running gnuradio (which makes sense because there are buffers etc in between).
Example: I transmit a CW at f=1001, receive it at f=1000 and then use gnuradio to downconvert the remaining 1 MHz I run into trouble (tried it...).

For this reason, there exist timed commands and the tune_request object with which I can execute commands (LO tuning) at a precice time. For example, with these commands I can phase align tuning between TX/RX at different center frequencies:

  tune_req_tx = uhd.tune_request(fcenter-1e6, 1e6)
  tune_req_rx = uhd.tune_request(2*fcenter)
  tune_req_rx.args=uhd.device_addr(','.join(["mode_n=integer", "int_n_step=1000e3",]))
  tune_req_tx.args=uhd.device_addr(','.join(["mode_n=integer", "int_n_step=1000e3",]))

  now = self.uhd_usrp_sink_0.get_time_now()
  self.uhd_usrp_sink_0.set_command_time(now + uhd.time_spec(0.1))
  self.uhd_usrp_source_0.set_command_time(now + uhd.time_spec(0.1))

  self.uhd_usrp_sink_0.set_center_freq(  tune_req_tx, 0)
  self.uhd_usrp_source_0.set_center_freq(tune_req_rx, 0)

  self.uhd_usrp_source_0.clear_command_time()
  self.uhd_usrp_sink_0.clear_command_time()

The commands execute execatly at get_time_now() plus 100ms. As far as I understand, these 100ms are to ensure that the host computer has enough time until the USRP processes the clear_command_time function. But it does not relate the exact point in time with anything that exists in gnuradio.

MY QUESTION: What I am unsure is how to align samples in gnuradio with the time on the USRP. For example, suppose I have an ideal clock signal in gnuradio and I want to perform a timed command EXACTLY at a particular sampling point (e.g. rising edge). How would I go about this?

The actions I want to execute exactly time aligned with gnuradio include: tuning requests, reading out sensors (PLL sensor when it settled), switching IO pins through the GPIO interface.
For example, I would like to switch a GPIO port exactly once per period of a signal in gnuradio and exactly at the same time (clearly there will be delays but that's OK as long as the delay is fixed).
As another example, I would like to re-tune exactly once in every period of a gnuradio signal. Then I would like to read out when the PLL has settled and generate a binary indicator signal out of it. Plotting the original signal and the indicator signal should tell me exactly (at least sample accuracy) how long the PLL took to settle *relative* to the signal in gnuradio.


Thank you very much,
Luke




More information about the USRP-users mailing list