Source code for skrf.vi.sa



'''
.. module:: skrf.vi.sa
++++++++++++++++++++++++++++++++++++++++++++++++++++
Spectrum Analyzers  (:mod:`skrf.vi.sa`)
++++++++++++++++++++++++++++++++++++++++++++++++++++


.. autosummary::
    :toctree: generated/

    HP8500
'''


import numpy as npy


from ..frequency import Frequency
from ..network import Network
from .. import mathFunctions as mf

from . ivihack import Driver

[docs]class HP8500(Driver): ''' HP8500's series Spectrum Analyzers Examples ----------- Get trace, and store in a Network object >>> from skrf.vi.sa import HP >>> my_sa = HP() # default address is 18 >>> trace = my_sa.get_ntwk() Activate single sweep mode, get a trace, return to continuous sweep >>> my_sa.single_sweep() >>> my_sa.sweep() >>> trace_a = my_sa.trace_a >>> my_sa.cont_sweep() '''
[docs] def __init__(self, address=18, *args, **kwargs): ''' Initializer Parameters -------------- address : int GPIB address \*args, \*\*kwargs : passed to ``ivi.Driver.__init__`` ''' Driver.__init__(self,'GPIB::'+str(address),*args,**kwargs)
@property def frequency(self): ''' ''' f = Frequency(self.f_start, self.f_stop, len(self.trace_a),'hz') f.unit = 'ghz' return f
[docs] def get_ntwk(self, trace='a', goto_local=False, *args, **kwargs): ''' Get a trace and return the data in a :class:`~skrf.network.Network` format This will save instrument stage to reg 1, activate single sweep mode, sweep, save data, then recal state from reg 1. Returning the data in a the form of a :class:`~skrf.network.Network` allows all the plotting methods and IO functions of that class to be used. Not all the methods of Network make sense for this type of data (scalar), but we assume the user knows this. Parameters ------------ trace : ['a', 'b'] save trace 'a' or trace 'b' goto_local : Boolean Go to local mode after taking a sweep \*args,\*\*kwargs : passed to :func:`~skrf.network.Network.__init__` ''' trace = trace.lower() if trace not in ['a','b']: raise ValueError('\'trace\' should be \'a\' or \'b\'') self.save_state() self.single_sweep() self.sweep() #TODO: ask if magnitude is in linear (LN) or log (LG) mode if trace== 'a': s = self.trace_a elif trace == 'b': s = self.trace_b self.recall_state() s = mf.db_2_magnitude(npy.array(s)) freq = self.frequency n = Network(s=s, frequency=freq, z0=1, *args, **kwargs) if goto_local: self.goto_local() return n
@property def f_start(self): ''' starting frequency ''' return float(self.ask('fa?')) @property def f_stop(self): ''' stopping frequency ''' return float(self.ask('fb?')) @property def trace_a(self): ''' trace 'a' ''' return self.ask_for_values("tra?") @property def trace_b(self): ''' trace 'b' ''' return self.ask_for_values("trb?")
[docs] def sweep(self): ''' trigger a sweep, return when done ''' self.write('ts') return self.ask('done?')
[docs] def single_sweep(self): ''' Activate single sweep mode ''' self.write('sngls')
[docs] def cont_sweep(self): ''' Activate continuous sweep mode ''' self.write('conts')
[docs] def goto_local(self): ''' Switches from remote to local control ''' pass#visa.vpp43.gpib_control_ren(self.vi,0)
[docs] def save_state(self, reg_n=1): ''' Save current state to a given register ''' self.write('saves %i'%reg_n)
[docs] def recall_state(self, reg_n=1): ''' Recall current state to a given register ''' self.write('rcls %i'%reg_n)