How do these timed commands work exactly when using USRP Source together with 
USRP Sink? (I need to phase-align RX and TX hence use timed commands at the 
same time).
Since they are both internally use the same hardware device (and board) I feel 
timed commands sent to both blocks result in some unpredictable results (at 
least for me).

For simplicity, consider this simple test setup: Loopback configuration (TX 
into RX via 30dB attentuator); transmit a 1MHz baseband signal into USRP Sink. 
Then, use just retuning via DSP:

    # dsp_freq changes every time this code is called:
    #dsp_freq = 0
    dsp_freq = 100e3
    tune_req_tx = uhd.tune_request()
    tune_req_tx.rf_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_tx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_tx.rf_freq = 900e6
    tune_req_tx.dsp_freq = -dsp_freq

    tune_req_rx = uhd.tune_request()
    tune_req_rx.rf_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_rx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_rx.rf_freq = 900e6
    tune_req_rx.dsp_freq = dsp_freq

    res1 = uhd_usrp_sink_0.set_center_freq(  tune_req_tx, 0)
    res2 = uhd_usrp_source_0.set_center_freq(tune_req_rx, 0)

This code works exactly as expected ... my received baseband signal always 
stays at 1 MHz (the retuning is transparent to my baseband!) but the phase 
always changes.
This makes sense because I do not use timed commands and hence the DUC/DDC is 
not aligned properly.

Now I change to this code:

    tune_req_tx = uhd.tune_request()
    tune_req_tx.rf_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_tx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_tx.rf_freq = rf_freq
    tune_req_tx.dsp_freq = -dsp_freq

    tune_req_rx = uhd.tune_request()
    tune_req_rx.rf_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_rx.dsp_freq_policy = uhd.tune_request.POLICY_MANUAL
    tune_req_rx.rf_freq = rf_freq
    tune_req_rx.dsp_freq = dsp_freq

    # create timed command:
    now = usrp_sink.get_time_now()
    uhd_usrp_sink_0.set_command_time(now + uhd.time_spec(0.2))
    uhd_usrp_source_0.set_command_time(now + uhd.time_spec(0.2))
    res1 = uhd_usrp_sink_0.set_center_freq(  tune_req_tx, 0)
    res2 = uhd_usrp_source_0.set_center_freq(tune_req_rx, 0)
    uhd_usrp_sink_0.clear_command_time()
    uhd_usrp_source_0.clear_command_time()

Suddenly my frequency is offset by 100kHz. This makes totally no sense!

As I mentioned above, I assume the reason is that all these timed commands 
eventually arrive on the same hardware and maybe overwrite themselves in a way 
creating unpredictable behavior.

So, what is the correct way to do it (with USRP Source/Sink blocks in 
gnuradio)??

Thanks
Lukas


PS: If it's multiple receiver blocks I can use the same USRP Source block with 
Num Channels > 1. I guess that would make live easier. But I have TX+RX to 
phase align.



_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to