Hi Rob,

The signal is actually sweeping over 4MHz, but is just super zoomed into a
small piece to show the time delta so it looks CW. The time difference
appears to be the same (within my ability to measure) across the band so I
am assuming it is a time delay offset.

Any suggestions on how to reduce this time delay offset?

Thanks,

Michael Toussaint


On Mon, Jun 5, 2023 at 8:51 PM Rob Kossler <rkoss...@nd.edu> wrote:

> Hi Michael,
> Either a delay offset OR a phase offset will show itself as a relative
> phase.  In order to distinguish between a delay offset and a phase offset,
> your signal must have appreciable bandwidth.  It appears that your signal
> is CW.  It is entirely possible that your delay offset is zero.  Does this
> make sense?
> Rob
>
> On Mon, Jun 5, 2023 at 5:32 PM Michael Toussaint <mtoussa...@chaosinc.com>
> wrote:
>
>> Could you share how you're setting up LO sharing in your code, as well as
>> how you're setting the system clock on the N321?
>>
>> The functions "configure_channels" and "set_lo_hw_exports" are used to
>> set up the LO sharing.
>>
>> The functions "sync_sources" and "sync_all_devices" are used to set up
>> the system clock on the N321.
>>
>> How do you measure the relative delay?
>>
>> We are measuring the offset of the LO's by just measuring the phase
>> difference of the RF coming out of the Ettus with an Oscilloscope (picture
>> attached as
>> Scope_Trace_SingleStream_LO.png
>>
>> <https://mail.google.com/mail/u/0?ui=2&ik=34abf4583b&attid=0.1&permmsgid=msg-a:r-1207093291428225864&view=att&disp=safe&realattid=f_lijcykt50>).
>> Yellow is Channel 1, Green is Channel 2; using a single streamer we still
>> appear to have a 2.64ns delta or ~135 degree phase shift.
>>
>> Thanks Marcus and Rob for your assistance.
>>
>> Michael Toussaint
>>
>> def sync_sources(usrp):
>>     logging.info('Setting Sync Sources')
>>
>>     usrp.set_sync_source(clock_source = 'gpsdo',
>>                          time_source = 'gpsdo')
>>
>> def sync_all_devices(hw_info):
>>     logging.info('Syncing All Devices')
>>
>>     mb_with_gps_locked = -1
>>
>>     while 1:
>>         time.sleep(1.0)
>>
>>         all_ref_locked = True
>>
>>         for board in range(hw_info.usrp.get_num_mboards()):
>>             all_ref_locked = all_ref_locked and \
>>                 hw_info.usrp.get_mboard_sensor('ref_locked',
>>                                                board).to_bool()
>>
>>             if (mb_with_gps_locked == -1) and \
>>                 hw_info.usrp.get_mboard_sensor('gps_locked',
>>                                                board).to_bool():
>>                 mb_with_gps_locked = board
>>
>>         if all_ref_locked:
>>             logging.info('All Devices are REF locked')
>>             break
>>
>>     logging.info('GPS Locked on MB #%d', mb_with_gps_locked)
>>
>>     time.sleep(1.0)
>>     hw_info.usrp.set_time_next_pps(
>>         uhd.types.TimeSpec(
>>         hw_info.usrp.get_mboard_sensor('gps_time',
>>                                        mb_with_gps_locked).to_int() +
>>                                        1.0)
>>     )
>>     time.sleep(1.0)
>>
>>
>> def configure_channels(usrp, rf_type, hw_info):
>>     rf_channel_index = None
>>     set_rf_rate = None
>>     set_rf_freq = None
>>     set_rf_gain = None
>>     set_rf_lo_source = None
>>     get_rf_lo_source = None
>>     get_rf_lo_freq = None
>>     get_rf_lo_freq_range = None
>>
>>     if (rf_type == 'rx'):
>>         if (len(hw_info.rx_channel_index) > 0):
>>             rf_channel_index = hw_info.rx_channel_index
>>             set_rf_rate = usrp.set_rx_rate
>>             set_rf_freq = usrp.set_rx_freq
>>             set_rf_gain = usrp.set_rx_gain
>>             set_rf_lo_source = usrp.set_rx_lo_source
>>             get_rf_lo_source = usrp.get_rx_lo_source
>>             get_rf_lo_freq = usrp.get_rx_lo_freq
>>             get_rf_lo_freq_range = usrp.get_rx_lo_freq_range
>>         else:
>>             return
>>     elif (rf_type == 'tx'):
>>         if (len(hw_info.tx_channel_index) > 0):
>>             rf_channel_index = hw_info.tx_channel_index
>>             set_rf_rate = usrp.set_tx_rate
>>             set_rf_freq = usrp.set_tx_freq
>>             set_rf_gain = usrp.set_tx_gain
>>             set_rf_lo_source = usrp.set_tx_lo_source
>>             get_rf_lo_source = usrp.get_tx_lo_source
>>             get_rf_lo_freq = usrp.get_tx_lo_freq
>>             get_rf_lo_freq_range = usrp.get_tx_lo_freq_range
>>         else:
>>             return
>>
>>     logging.info('Configuring %s Channels', rf_type.upper())
>>
>>     for rf_ch_name, rf_ch_index in rf_channel_index.items():
>>         logging.info('Configuring %s channel %s (channel #%d)',
>>                      rf_type.upper(), rf_ch_name, rf_ch_index)
>>
>>         ch_def = hw_info.channel_def[rf_ch_name]
>>
>>         # LO Channel Setup
>>         current_lo_name = 'unknown'
>>         current_lo_src = 'unknown'
>>
>>         if ch_def.lo_inputs is not None:
>>             logging.info('  Setting %s LO for Channel %s (#%d)',
>>                          rf_type.upper(), rf_ch_name, rf_ch_index)
>>
>>             set_rf_lo_source(ch_def.lo_inputs.source,
>>                              ch_def.lo_inputs.name,
>>                              rf_ch_index)
>>             current_lo_name = ch_def.lo_inputs.name
>>
>>             logging.info('    (#%d) Requested %s LO name %s, src %s',
>>                          rf_ch_index,
>>                          rf_type.upper(),
>>                          ch_def.lo_inputs.name,
>>                          ch_def.lo_inputs.source)
>>         else:
>>             logging.info('  No %s LO inputs for Channel %s (#%d)',
>>                          rf_type.upper(), rf_ch_name, rf_ch_index)
>>
>>             current_lo_name = 'lo1'
>>
>>         current_lo_src = get_rf_lo_source(current_lo_name,
>>                                           rf_ch_index)
>>
>>         logging.info('    (#%d) Current %s LO name %s, src %s',
>>                      rf_ch_index,
>>                      rf_type.upper(),
>>                      current_lo_name,
>>                      current_lo_src)
>>
>>         rf_lo_freq = get_rf_lo_freq(current_lo_name,
>>                                     rf_ch_index)
>>
>>         logging.info('    (#%d) [%s] Current %s LO freq %d',
>>                          rf_ch_index,
>>                          current_lo_name,
>>                          rf_type.upper(),
>>                          rf_lo_freq)
>>
>>         rf_lo_freq_range = get_rf_lo_freq_range(
>>             current_lo_name, rf_ch_index)
>>
>>         temp = '    (#%d) [%s] Current %s LO freq range' + \
>>             ' [%d, %d] step %d'
>>
>>         logging.info(temp,
>>                      rf_ch_index,
>>                      current_lo_name,
>>                      rf_type.upper(),
>>                      rf_lo_freq_range.start(),
>>                      rf_lo_freq_range.stop(),
>>                      rf_lo_freq_range.step())
>>
>>         logging.info('  Setting Sampling Rate %s', hw_info.fs)
>>         set_rf_rate(hw_info.fs, rf_ch_index)
>>
>>         logging.info('  Setting Center Freq %s', hw_info.fc)
>>         tr = set_rf_freq(uhd.libpyuhd.types.tune_request(hw_info.fc),
>>                          rf_ch_index)
>>
>>         logging.info('    (#%d) %s Tune Result:',
>>                      rf_ch_index, rf_type.upper())
>>         log_tune_result(tr)
>>
>>         logging.info('  Setting %s Gain: %2.3f db',
>>                      rf_type.upper(),
>>                      ch_def.gain)
>>         set_rf_gain(ch_def.gain, rf_ch_index)
>>
>> def set_lo_hw_exports(usrp, node_name, dirx, lo_enabled, output_array):
>>     """Set LO HW Exports"""
>>     if (lo_enabled is None) or (output_array is None):
>>         return
>>
>>     logging.info('Setting %s LO Export Enabled for %s',
>>                  dirx.upper(), node_name)
>>
>>     if dirx.lower() == 'rx':
>>         usrp.set_rx_lo_export_enabled(lo_enabled, 'lo1', 0)
>>         enable_val = usrp.get_rx_lo_export_enabled('lo1')
>>     elif dirx.lower() == 'tx':
>>         usrp.set_tx_lo_export_enabled(lo_enabled, 'lo1', 0)
>>         enable_val = usrp.get_tx_lo_export_enabled('lo1')
>>     else:
>>         logging.warning('Invalid direction %s', dirx)
>>         return
>>
>>     logging.info('  %s LO Export Enabled = %s, requested %s',
>>                  dirx.upper(), enable_val, lo_enabled)
>>
>>     temp_path = 'blocks/0/Radio#0/dboard/' + \
>>         f'{dirx.lower()}_frontends/' + \
>>         '0/los/lo1/lo_distribution/LO_OUT_{}/export'
>>
>>     logging.info('Setting %s LO HW Outputs for %s',
>>                  dirx.upper(), node_name)
>>
>>     for out_num in range(len(output_array)):
>>         hw_lo_export_path = temp_path.format(out_num)
>>
>>         if usrp.get_tree().exists(hw_lo_export_path):
>>             usrp.get_tree().access_bool(hw_lo_export_path).set(
>>                 output_array[out_num])
>>
>>             logging.info('  %s LO HW Export Out[%d] = %s, %s %s',
>>                          dirx.upper(), out_num,
>>                          usrp.get_tree().access_bool(
>>                             hw_lo_export_path).get(),
>>                         'requested',
>>                         output_array[out_num])
>>         else:
>>             logging.warning('  %s LO HW Export Out[%d] does not exist',
>>                             dirx.upper(), out_num)
>>
>>
>> On Thu, May 25, 2023 at 6:45 AM Rob Kossler <rkoss...@nd.edu> wrote:
>>
>>> On Thu, May 25, 2023 at 3:54 AM Michael Toussaint
>>> <mtoussa...@chaosinc.com> wrote:
>>> >
>>> > Used a single streamer and saw the delay slightly improve to between
>>> 2.5 - 3 ns.
>>> >
>>> > Any other suggestions to improve the delay to match the results from
>>> the knowledge base, https://kb.ettus.com/USRP_N320/N321_LO_Distribution?
>>>
>>> How do you measure the relative delay?
>>>
>>
>>
>>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to