コード例 #1
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_ct(c, fpgas = [], offset = -1, setup_snap = True):
    """
    Read and return data from the corner turner. Both pols are returned.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['ct_64'])
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_ct)
        up = repeater.parse(d)
        fdata_p0 = []
        fdata_p1 = []
        for a in up:
            p0 = []
            p1 = []
            p0.append(bin2fp(a['p00_r'], 4, 3) + (1j * bin2fp(a['p00_i'], 4, 3)))
            p0.append(bin2fp(a['p01_r'], 4, 3) + (1j * bin2fp(a['p01_i'], 4, 3)))
            p0.append(bin2fp(a['p02_r'], 4, 3) + (1j * bin2fp(a['p02_i'], 4, 3)))
            p0.append(bin2fp(a['p03_r'], 4, 3) + (1j * bin2fp(a['p03_i'], 4, 3)))
            p1.append(bin2fp(a['p10_r'], 4, 3) + (1j * bin2fp(a['p10_i'], 4, 3)))
            p1.append(bin2fp(a['p11_r'], 4, 3) + (1j * bin2fp(a['p11_i'], 4, 3)))
            p1.append(bin2fp(a['p12_r'], 4, 3) + (1j * bin2fp(a['p12_i'], 4, 3)))
            p1.append(bin2fp(a['p13_r'], 4, 3) + (1j * bin2fp(a['p13_i'], 4, 3)))
            fdata_p0.extend(p0)
            fdata_p1.extend(p1)
        rd.append([fdata_p0, fdata_p1])
    return rd
コード例 #2
0
def get_snap_coarse_fft(c, fpgas=[], pol=0, setup_snap=True):
    """
    Read and return data from the coarse FFT.
    Returns a list of the data from only that polarisation.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(
            fpgas,
            register_fengine_control,
            debug_snap_select=snap_fengine_debug_select['coarse_72'])
        corr_functions.write_masked_register(fpgas,
                                             register_fengine_coarse_control,
                                             debug_pol_select=pol,
                                             debug_specify_chan=0)
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            for b in range(0, 2):
                num = bin2fp(a['d%i_r' % b], 18,
                             17) + (1j * bin2fp(a['d%i_i' % b], 18, 17))
                coarsed.append(num)
        rd.append(coarsed)
    return rd
コード例 #3
0
def get_snap_quant(c,
                   fpgas=None,
                   offset=-1,
                   wbc_compat=False,
                   debug_data=None,
                   setup_snap=True):
    """
    Read and return data from the quantiser snapshot. Both pols are returned.
    """
    if fpgas == None:
        fpgas = c.ffpgas
    if setup_snap:
        c.syslogger.debug(
            'get_snap_quant: setting debug snapblock to quantiser output.')
        corr_functions.write_masked_register(
            fpgas,
            register_fengine_control,
            debug_snap_select=snap_fengine_debug_select['quant_16'])
    data = []
    for fpga in fpgas:
        tempdata = _fpga_snap_quant(fpga=fpga,
                                    offset=offset,
                                    wbc_compat=wbc_compat,
                                    debug_data=debug_data)
        data.append(tempdata)
    return data
コード例 #4
0
def get_snap_fine_fft(c, fpgas=[], offset=-1, setup_snap=True):
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(
            fpgas,
            register_fengine_control,
            debug_snap_select=snap_fengine_debug_select['fine_128'])
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3,
                                   offset=offset)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_fine_fft)
        up = repeater.parse(d)
        fdata_p0 = []
        fdata_p1 = []
        for a in up:
            p0c = bin2fp(a['p0_r'], fine_fft_bitwidth,
                         17) + (1j * bin2fp(a['p0_i'], fine_fft_bitwidth, 17))
            p1c = bin2fp(a['p1_r'], fine_fft_bitwidth,
                         17) + (1j * bin2fp(a['p1_i'], fine_fft_bitwidth, 17))
            fdata_p0.append(p0c)
            fdata_p1.append(p1c)
        rd.append([fdata_p0, fdata_p1])
    return rd
コード例 #5
0
def get_snap_feng_10gbe(c,
                        fpgas=[],
                        offset=-1,
                        man_trigger=False,
                        man_valid=False):
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    corr_functions.write_masked_register(
        fpgas,
        register_fengine_control,
        debug_snap_select=snap_fengine_debug_select['gbetx0_128'])
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3,
                                   offset=offset,
                                   man_trig=man_trigger,
                                   man_valid=man_valid,
                                   circular_capture=False)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_gbe_tx)
        up = repeater.parse(d)
        for a in up:
            a['link_down'] = not a['link_up']
            a['hdr_valid'] = False
            a['mrst'] = False
            a['sync'] = False
        rd.append(up)
    return rd
コード例 #6
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_coarse_channel(c, fpgas = [], pol = 0, channel = -1, setup_snap = True):
    """
    Get data from a specific coarse channel - straight out of the FFT into the snap block, NOT via the buffer block.
    Returns a list of the data from only that polarisation.
    """
    if channel == -1:
        raise RuntimeError('Cannot get data from unspecified channel.')
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(fpgas, register_fengine_control,           debug_snap_select = snap_fengine_debug_select['coarse_72'])
        corr_functions.write_masked_register(fpgas, register_fengine_coarse_control,    debug_pol_select = pol, debug_specify_chan = 1, debug_chan = channel >> 1)
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            if channel & 1:
                num = bin2fp(a['d1_r'], 18, 17) + (1j * bin2fp(a['d1_i'], 18, 17))
            else:
                num = bin2fp(a['d0_r'], 18, 17) + (1j * bin2fp(a['d0_i'], 18, 17))
            coarsed.append(num)
        rd.append(coarsed)
    return rd
コード例 #7
0
def DONE_get_fine_fft_snap(correlator):
    # interpret the ant_string
    (ffpga_n, xfpga_n, fxaui_n, xxaui_n,
     feng_input) = correlator.get_ant_str_location(ant_str)
    # select the data from the fine fft
    fpga = correlator.ffpgas[ffpga_n]
    corr_functions.write_masked_register([fpga],
                                         register_fengine_fine_control,
                                         snap_data_select=0,
                                         quant_snap_select=0)
    data = fpga.snapshot_get(dev_name=fine_snap_name,
                             man_trig=False,
                             man_valid=False,
                             wait_period=3,
                             offset=-1,
                             circular_capture=False,
                             get_extra_val=False)
    unpacked = list(
        struct.unpack('>%iI' % (len(data['data']) / 4), data['data']))
    # re-arrange the data sensibly - for FFT data it's complex 16.15 fixed point signed data
    # make the actual complex numbers
    d = []
    for ctr in range(0, len(unpacked)):
        num = unpacked[ctr]
        numR = numpy.int16(num >> 16)
        numI = numpy.int16(num & 0x0000ffff)
        d.append(numR + (1j * numI))
    return d
コード例 #8
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def channel_select(c, freq_hz = -1, specific_chan = -1, selectchan = True):
    """
    Set the coarse channel based on a given center frequency, given in Hz.
    """
    if not c.is_narrowband():
        raise RuntimeError('This command cannot be run in the current mode.')
    if freq_hz != -1 and specific_chan != -1:
        raise RuntimeError('Specify a frequency in Hz OR a specific coarse channel, not both.')
    elif freq_hz == -1 and specific_chan == -1:
        raise RuntimeError('Specify frequency in Hz or specific coarse channel.')
    channel_bw = c.config['bandwidth']
    coarse_chans = c.config['coarse_chans']
    if specific_chan != -1:
        chan = specific_chan
        freq_hz = chan * channel_bw
    else:
        total_bw = c.config['rf_bandwidth']
        chan = int(round(freq_hz / total_bw * coarse_chans))
    if chan >= coarse_chans:
        raise RuntimeError('Coarse channel too large: %i >= %i' % (chan, coarse_chans))
    chan_cf = chan * channel_bw
    if selectchan:
        try:
            corr_functions.write_masked_register(c.ffpgas, register_fengine_coarse_control, channel_select = chan)
            c.config['center_freq'] = chan_cf
            c.config['current_coarse_chan'] = chan
            c.spead_narrowband_issue()
        except:
            errmsg = 'Something bad happened trying to write the coarse channel select register.'
            c.syslogger.error(errmsg)
            raise RuntimeError(errmsg)
    return chan_cf, chan, freq_hz - chan_cf
コード例 #9
0
def DONE_get_ct_snap(correlator, offset=-1):
    corr_functions.write_masked_register(correlator.ffpgas,
                                         register_fengine_fine_control,
                                         quant_snap_select=2)
    raw = snap.snapshots_get(correlator.ffpgas,
                             dev_names=fine_snap_name,
                             man_trig=False,
                             man_valid=False,
                             wait_period=3,
                             offset=offset,
                             circular_capture=False)
    chan_values = []
    for index, d in enumerate(raw['data']):
        up = list(struct.unpack('>%iI' % (len(d) / 4), d))
        values = [[], []]
        for value in up:
            # two freq channel values for the same freq-channel, both pols
            # will have to use the offset to get multiple freq channels
            p00 = value >> 24
            p10 = (value >> 16) & 0xff
            p01 = (value >> 8) & 0xff
            p11 = value & 0xff

            def extract8bit(v8):
                r = (v8 & ((2**8) - (2**4))) >> 4
                i = (v8 & ((2**4) - (2**0)))
                return r + (1j * i)

            values[0].append(value >> 24)
            values[0].append((value >> 8) & 0xff)
            values[1].append((value >> 16) & 0xff)
            values[1].append(value & 0xff)
        chan_values.append({'fpga_index': index, 'data': values})
    return chan_values
コード例 #10
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def fft_shift_fine_set_all(correlator, shift = -1):
    """
    Set the per-stage shift for the fine channelisation FFT on all correlator f-engines.
    """
    if shift < 0:
        shift = correlator.config['fft_shift_fine']
    corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, fft_shift = shift)
    correlator.syslogger.info('Set fine FFT shift patterns on all F-engines to 0x%x.' % shift)
コード例 #11
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_xaui(c, fpgas = [], offset = -1, man_trigger = False, man_valid = False, wait_period = 3):
    """
    Read the XAUI data out of the general debug snap block.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['xaui_128'])
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = wait_period, offset = offset, man_trig = man_trigger, man_valid = man_valid, circular_capture = False)
    return snap_data
コード例 #12
0
def fft_shift_fine_set_all(correlator, shift=-1):
    """
    Set the per-stage shift for the fine channelisation FFT on all correlator f-engines.
    """
    if shift < 0:
        shift = correlator.config['fft_shift_fine']
    corr_functions.write_masked_register(correlator.ffpgas,
                                         register_fengine_fine_control,
                                         fft_shift=shift)
    correlator.syslogger.info(
        'Set fine FFT shift patterns on all F-engines to 0x%x.' % shift)
コード例 #13
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_quant(c, fpgas = None, offset = -1, wbc_compat = False, debug_data = None, setup_snap = True):
    """
    Read and return data from the quantiser snapshot. Both pols are returned.
    """
    if fpgas == None:
        fpgas = c.ffpgas
    if setup_snap:
        c.syslogger.debug('get_snap_quant: setting debug snapblock to quantiser output.')
        corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['quant_16'])
    data = []
    for fpga in fpgas:
        tempdata = _fpga_snap_quant(fpga = fpga, offset = offset, wbc_compat = wbc_compat, debug_data = debug_data)
        data.append(tempdata)
    return data
コード例 #14
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_feng_10gbe(c, fpgas = [], offset = -1,  man_trigger = False, man_valid = False):
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['gbetx0_128'])
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset, man_trig = man_trigger, man_valid = man_valid, circular_capture = False)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_gbe_tx)
        up = repeater.parse(d)
        for a in up:
            a['link_down'] = not a['link_up']
            a['hdr_valid'] = False
            a['mrst'] = False
            a['sync'] = False
        rd.append(up)
    return rd
コード例 #15
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def DONE_get_fine_fft_snap(correlator):
    # interpret the ant_string
    (ffpga_n, xfpga_n, fxaui_n, xxaui_n, feng_input) = correlator.get_ant_str_location(ant_str)
    # select the data from the fine fft
    fpga = correlator.ffpgas[ffpga_n]
    corr_functions.write_masked_register([fpga], register_fengine_fine_control, snap_data_select = 0, quant_snap_select = 0)
    data = fpga.snapshot_get(dev_name = fine_snap_name, man_trig = False, man_valid = False, wait_period = 3, offset = -1, circular_capture = False, get_extra_val = False)
    unpacked = list(struct.unpack('>%iI' % (len(data['data']) / 4), data['data']))
    # re-arrange the data sensibly - for FFT data it's complex 16.15 fixed point signed data
    # make the actual complex numbers
    d  = []
    for ctr in range(0, len(unpacked)):
        num = unpacked[ctr]
        numR = numpy.int16(num >> 16)
        numI = numpy.int16(num & 0x0000ffff)
        d.append(numR + (1j * numI))
    return d
コード例 #16
0
def get_snap_ct(c, fpgas=[], offset=-1, setup_snap=True):
    """
    Read and return data from the corner turner. Both pols are returned.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(
            fpgas,
            register_fengine_control,
            debug_snap_select=snap_fengine_debug_select['ct_64'])
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3,
                                   offset=offset)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_ct)
        up = repeater.parse(d)
        fdata_p0 = []
        fdata_p1 = []
        for a in up:
            p0 = []
            p1 = []
            p0.append(
                bin2fp(a['p00_r'], 4, 3) + (1j * bin2fp(a['p00_i'], 4, 3)))
            p0.append(
                bin2fp(a['p01_r'], 4, 3) + (1j * bin2fp(a['p01_i'], 4, 3)))
            p0.append(
                bin2fp(a['p02_r'], 4, 3) + (1j * bin2fp(a['p02_i'], 4, 3)))
            p0.append(
                bin2fp(a['p03_r'], 4, 3) + (1j * bin2fp(a['p03_i'], 4, 3)))
            p1.append(
                bin2fp(a['p10_r'], 4, 3) + (1j * bin2fp(a['p10_i'], 4, 3)))
            p1.append(
                bin2fp(a['p11_r'], 4, 3) + (1j * bin2fp(a['p11_i'], 4, 3)))
            p1.append(
                bin2fp(a['p12_r'], 4, 3) + (1j * bin2fp(a['p12_i'], 4, 3)))
            p1.append(
                bin2fp(a['p13_r'], 4, 3) + (1j * bin2fp(a['p13_i'], 4, 3)))
            fdata_p0.extend(p0)
            fdata_p1.extend(p1)
        rd.append([fdata_p0, fdata_p1])
    return rd
コード例 #17
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_fine_fft(c, fpgas = [], offset = -1, setup_snap = True):
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['fine_128'])
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_fine_fft)
        up = repeater.parse(d)
        fdata_p0 = []
        fdata_p1 = []
        for a in up:
            p0c = bin2fp(a['p0_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p0_i'], fine_fft_bitwidth, 17))
            p1c = bin2fp(a['p1_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p1_i'], fine_fft_bitwidth, 17))
            fdata_p0.append(p0c)
            fdata_p1.append(p1c)
        rd.append([fdata_p0, fdata_p1])
    return rd
コード例 #18
0
def get_snap_buffer_pfb(c, fpgas=[], pol=0, setup_snap=True, pfb=False):
    '''This DOESN'T EXIST in regular F-engines. Only in specific debug versions.
    '''
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        if pfb:
            corr_functions.write_masked_register(
                fpgas,
                register_fengine_control,
                debug_snap_select=snap_fengine_debug_select['pfb_72'])
        else:
            corr_functions.write_masked_register(
                fpgas,
                register_fengine_control,
                debug_snap_select=snap_fengine_debug_select['buffer_72'])
        corr_functions.write_masked_register(fpgas,
                                             register_fengine_coarse_control,
                                             debug_pol_select=pol)
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            num = bin2fp(a['d%i_r' % pol], 18,
                         17) + (1j * bin2fp(a['d%i_i' % pol], 18, 17))
            coarsed.append(num)
        rd.append(coarsed)
    return rd
コード例 #19
0
def get_snap_coarse_channel(c, fpgas=[], pol=0, channel=-1, setup_snap=True):
    """
    Get data from a specific coarse channel - straight out of the FFT into the snap block, NOT via the buffer block.
    Returns a list of the data from only that polarisation.
    """
    if channel == -1:
        raise RuntimeError('Cannot get data from unspecified channel.')
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(
            fpgas,
            register_fengine_control,
            debug_snap_select=snap_fengine_debug_select['coarse_72'])
        corr_functions.write_masked_register(fpgas,
                                             register_fengine_coarse_control,
                                             debug_pol_select=pol,
                                             debug_specify_chan=1,
                                             debug_chan=channel >> 1)
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            if channel & 1:
                num = bin2fp(a['d1_r'], 18,
                             17) + (1j * bin2fp(a['d1_i'], 18, 17))
            else:
                num = bin2fp(a['d0_r'], 18,
                             17) + (1j * bin2fp(a['d0_i'], 18, 17))
            coarsed.append(num)
        rd.append(coarsed)
    return rd
コード例 #20
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_coarse_fft(c, fpgas = [], pol = 0, setup_snap = True):
    """
    Read and return data from the coarse FFT.
    Returns a list of the data from only that polarisation.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        corr_functions.write_masked_register(fpgas, register_fengine_control,           debug_snap_select = snap_fengine_debug_select['coarse_72'])
        corr_functions.write_masked_register(fpgas, register_fengine_coarse_control,    debug_pol_select = pol, debug_specify_chan = 0)
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            for b in range(0,2):
                num = bin2fp(a['d%i_r'%b], 18, 17) + (1j * bin2fp(a['d%i_i'%b], 18, 17))
                coarsed.append(num)
        rd.append(coarsed)
    return rd
コード例 #21
0
def get_snap_xaui(c,
                  fpgas=[],
                  offset=-1,
                  man_trigger=False,
                  man_valid=False,
                  wait_period=3):
    """
    Read the XAUI data out of the general debug snap block.
    """
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    corr_functions.write_masked_register(
        fpgas,
        register_fengine_control,
        debug_snap_select=snap_fengine_debug_select['xaui_128'])
    snap_data = snap.snapshots_get(fpgas=fpgas,
                                   dev_names=snap_debug,
                                   wait_period=wait_period,
                                   offset=offset,
                                   man_trig=man_trigger,
                                   man_valid=man_valid,
                                   circular_capture=False)
    return snap_data
コード例 #22
0
def channel_select(c, freq_hz=-1, specific_chan=-1, selectchan=True):
    """
    Set the coarse channel based on a given center frequency, given in Hz.
    """
    if not c.is_narrowband():
        raise RuntimeError('This command cannot be run in the current mode.')
    if freq_hz != -1 and specific_chan != -1:
        raise RuntimeError(
            'Specify a frequency in Hz OR a specific coarse channel, not both.'
        )
    elif freq_hz == -1 and specific_chan == -1:
        raise RuntimeError(
            'Specify frequency in Hz or specific coarse channel.')
    channel_bw = c.config['bandwidth']
    coarse_chans = c.config['coarse_chans']
    if specific_chan != -1:
        chan = specific_chan
        freq_hz = chan * channel_bw
    else:
        total_bw = c.config['rf_bandwidth']
        chan = int(round(freq_hz / total_bw * coarse_chans))
    if chan >= coarse_chans:
        raise RuntimeError('Coarse channel too large: %i >= %i' %
                           (chan, coarse_chans))
    chan_cf = chan * channel_bw
    if selectchan:
        try:
            corr_functions.write_masked_register(
                c.ffpgas, register_fengine_coarse_control, channel_select=chan)
            c.config['center_freq'] = chan_cf
            c.config['current_coarse_chan'] = chan
            c.spead_narrowband_issue()
        except:
            errmsg = 'Something bad happened trying to write the coarse channel select register.'
            c.syslogger.error(errmsg)
            raise RuntimeError(errmsg)
    return chan_cf, chan, freq_hz - chan_cf
コード例 #23
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def DONE_get_ct_snap(correlator, offset = -1):
    corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, quant_snap_select = 2)
    raw = snap.snapshots_get(correlator.ffpgas, dev_names = fine_snap_name, man_trig = False, man_valid = False, wait_period = 3, offset = offset, circular_capture = False)
    chan_values = []
    for index, d in enumerate(raw['data']):
        up = list(struct.unpack('>%iI' % (len(d) / 4), d))
        values = [[], []]
        for value in up:
            # two freq channel values for the same freq-channel, both pols
            # will have to use the offset to get multiple freq channels
            p00 = value >> 24
            p10 = (value >> 16) & 0xff
            p01 = (value >> 8) & 0xff
            p11 = value & 0xff
            def extract8bit(v8):
                r = (v8 & ((2**8) - (2**4))) >> 4
                i = (v8 & ((2**4) - (2**0)))
                return r + (1j * i)
            values[0].append(value >> 24)
            values[0].append((value >> 8) & 0xff)
            values[1].append((value >> 16) & 0xff)
            values[1].append(value & 0xff)
        chan_values.append({'fpga_index': index, 'data': values})
    return chan_values
コード例 #24
0
ファイル: corr_nb.py プロジェクト: MESAProductSolutions/corr
def get_snap_buffer_pfb(c, fpgas = [], pol = 0, setup_snap = True, pfb = False):
    '''This DOESN'T EXIST in regular F-engines. Only in specific debug versions.
    '''
    if len(fpgas) == 0:
        fpgas = c.ffpgas
    if setup_snap:
        if pfb:
            corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['pfb_72'])
        else:
            corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['buffer_72'])
        corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select = pol)
    snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3)
    rd = []
    for ctr in range(0, len(snap_data['data'])):
        d = snap_data['data'][ctr]
        repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft)
        up = repeater.parse(d)
        coarsed = []
        for a in up:
            num = bin2fp(a['d%i_r'%pol], 18, 17) + (1j * bin2fp(a['d%i_i'%pol], 18, 17))
            coarsed.append(num)
        rd.append(coarsed)
    return rd