def get_lnrdata(line0, line1, line2):
    """
    Get the lnr data assumimg a broadband noise signal is injected.
    The lnr data is the power of the input after applying the calibration
    constants (rf), and the negative of the constants (lo).    
    :param line0: line for first axis.
    :param line1: line for second axis.
    :param line1: line for third axis.
    :return: calibration data: a2, b2, and ab.
    """    
    # read data
    time.sleep(pause_time)
    rf = cd.read_interleave_data(roach, bram_rf,  bram_addr_width, 
                                 bram_word_width, pow_data_type)
    lo = cd.read_interleave_data(roach, bram_lo,  bram_addr_width, 
                                 bram_word_width, pow_data_type)


    # scale and dBFS data for plotting
    rf_plot = cd.scale_and_dBFS_specdata(rf, acc_len, dBFS)
    lo_plot = cd.scale_and_dBFS_specdata(lo, acc_len, dBFS)

    # compute lnr for plotting
    lnr_ratios = np.divide(lo, rf)

    # plot data
    line0.set_data(if_freqs, rf_plot)
    line1.set_data(if_freqs, lo_plot)
    line2.set_data(if_freqs, 10*np.log10(lnr_ratios))
    fig.canvas.draw()
    fig.canvas.flush_events()
        
    return rf, lo
Exemplo n.º 2
0
def get_caldata(rf_freqs, tone_sideband):
    """
    Sweep a tone through a sideband and get the calibration data.
    The calibration data is the power of each tone in both inputs (a and b)
    and the cross-correlation of both inputs as a complex number (ab*).
    The full sprecta measured for each tone is saved to data for debugging
    purposes.
    :param rf_freqs: frequencies of the tones to perform the sweep (in GHz).
    :param tone_sideband: sideband of the injected test tone. Either USB or LSB
    :return: calibration data: a2, b2, and ab.
    """
    fig.canvas.set_window_title(tone_sideband.upper() + " Tone Sweep")

    a2_arr = []; b2_arr = []; ab_arr = []
    for i, chnl in enumerate(test_channels):
        # set test tone
        freq = rf_freqs[chnl]
        rf_generator.ask("freq " + str(freq) + " ghz; *opc?")
        time.sleep(pause_time)

        # read data
        a2    = cd.read_interleave_data(roach, bram_a2,    bram_addr_width, 
                                        bram_word_width,   pow_data_type)
        b2    = cd.read_interleave_data(roach, bram_b2,    bram_addr_width, 
                                        bram_word_width,   pow_data_type)
        ab_re = cd.read_interleave_data(roach, bram_ab_re, bram_addr_width, 
                                        bram_word_width,   crosspow_data_type)
        ab_im = cd.read_interleave_data(roach, bram_ab_im, bram_addr_width, 
                                        bram_word_width,   crosspow_data_type)

        # append data to arrays
        a2_arr.append(a2[chnl])
        b2_arr.append(b2[chnl])
        ab_arr.append(ab_re[chnl] + 1j*ab_im[chnl])

        # scale and dBFS data for plotting
        a2_plot = cd.scale_and_dBFS_specdata(a2, acc_len, dBFS)
        b2_plot = cd.scale_and_dBFS_specdata(b2, acc_len, dBFS)

        # compute input ratios for plotting
        ab_ratios = np.divide(ab_arr, b2_arr)

        # plot data
        lines[0].set_data(if_freqs, a2_plot)
        lines[1].set_data(if_freqs, b2_plot)
        lines[2].set_data(if_test_freqs[:i+1], np.abs(ab_ratios))
        lines[3].set_data(if_test_freqs[:i+1], np.angle(ab_ratios, deg=True))
        fig.canvas.draw()
        fig.canvas.flush_events()
        
        # save data
        np.savez(cal_datadir+"/rawdata_tone_" + tone_sideband + "/chnl_" + 
        str(chnl), a2=a2, b2=b2, ab_re=ab_re, ab_im=ab_im)

    # compute interpolations
    a2_arr = np.interp(if_freqs, if_test_freqs, a2_arr)
    b2_arr = np.interp(if_freqs, if_test_freqs, b2_arr)
    ab_arr = np.interp(if_freqs, if_test_freqs, ab_arr)

    return a2_arr, b2_arr, ab_arr
Exemplo n.º 3
0
def get_srrdata(rf_freqs, tone_sideband):
    """
    Sweep a tone through a sideband and get the srr data.
    The srr data is the power of each tone after applying the calibration
    constants for each sideband (usb and lsb).
    The full sprecta measured for each tone is saved to data for debugging
    purposes.
    :param rf_freqs: frequencies of the tones to perform the sweep (in GHz).
    :param tone_sideband: sideband of the injected test tone. Either USB or LSB
    :return: srr data: usb and lsb.
    """
    fig.canvas.set_window_title(tone_sideband.upper() + " Tone Sweep")

    usb_arr = []
    lsb_arr = []
    for i, chnl in enumerate(test_channels):
        # set test tone
        freq = rf_freqs[chnl]
        rf_generator.ask("freq " + str(freq) + " ghz; *opc?")
        time.sleep(pause_time)

        # read data
        usb = cd.read_interleave_data(roach, bram_usb, bram_addr_width,
                                      bram_word_width, pow_data_type)
        lsb = cd.read_interleave_data(roach, bram_lsb, bram_addr_width,
                                      bram_word_width, pow_data_type)

        # append data to arrays
        usb_arr.append(usb[chnl])
        lsb_arr.append(lsb[chnl])

        # scale and dBFS data for plotting
        usb_plot = cd.scale_and_dBFS_specdata(usb, acc_len, dBFS)
        lsb_plot = cd.scale_and_dBFS_specdata(lsb, acc_len, dBFS)

        # compute srr for plotting
        if tone_sideband == 'usb':
            srr = np.divide(usb_arr, lsb_arr)
        else:  # tone_sideband=='lsb
            srr = np.divide(lsb_arr, usb_arr)

        # define sb plot line
        line_sb = lines[2] if tone_sideband == 'usb' else lines[3]

        # plot data
        lines[0].set_data(if_freqs, usb_plot)
        lines[1].set_data(if_freqs, lsb_plot)
        line_sb.set_data(if_test_freqs[:i + 1], 10 * np.log10(srr))
        fig.canvas.draw()
        fig.canvas.flush_events()

        # save data
        np.savez(srr_datadir+"/rawdata_tone_" + tone_sideband + "/chnl_" + \
        str(chnl), usb=usb, lsb=lsb)

    # compute interpolations
    usb_arr = np.interp(if_freqs, if_test_freqs, usb_arr)
    lsb_arr = np.interp(if_freqs, if_test_freqs, lsb_arr)

    return usb_arr, lsb_arr
def get_lnrdata(rf_freqs, tone_sideband):
    """
    Sweep a tone through a sideband and get the lnr data.
    The lnr data is the power of each tone after applying the calibration
    constants (rf), and the negative of the constants (lo).
    The full sprecta measured for each tone is saved to data for debugging
    purposes.
    :param rf_freqs: frequencies of the tones to perform the sweep.
    :param tone_sideband: sideband of the injected test tone. Either USB or LSB
    :return: lnr data: rf and lo.
    """
    fig.canvas.set_window_title(tone_sideband.upper() + " Sweep")

    rf_arr = []; lo_arr = []
    for i, chnl in enumerate(test_channels):
        # set test tone
        freq = rf_freqs[chnl]
        rf_generator.ask("freq " + str(freq*1e6) + ";*opc?") # freq must be in Hz
        time.sleep(pause_time)

        # read data
        rf = cd.read_interleave_data(roach, bram_rf,  bram_addr_width, 
                                     bram_word_width, pow_data_type)
        lo = cd.read_interleave_data(roach, bram_lo,  bram_addr_width, 
                                     bram_word_width, pow_data_type)

        # append data to arrays
        rf_arr.append(rf[chnl])
        lo_arr.append(lo[chnl])

        # scale and dBFS data for plotting
        rf_plot = cd.scale_and_dBFS_specdata(rf, acc_len, dBFS)
        lo_plot = cd.scale_and_dBFS_specdata(lo, acc_len, dBFS)

        # compute lnr for plotting
        lnr = np.divide(lo_arr, rf_arr)

        # define sb plot line
        line_sb = line2 if tone_sideband=='usb' else line3

        # plot data
        line0.set_data(if_freqs, rf_plot)
        line1.set_data(if_freqs, lo_plot)
        line_sb.set_data(if_test_freqs[:i+1], 10*np.log10(lnr))
        fig.canvas.draw()
        fig.canvas.flush_events()
        
        # save data
        np.savez(datadir+"/rawdata_tone_" + tone_sideband + "/chnl_" + str(chnl), 
            rf=rf, lo=lo)

    # compute interpolations
    rf_arr = np.interp(if_freqs, if_test_freqs, rf_arr)
    lo_arr = np.interp(if_freqs, if_test_freqs, lo_arr)

    return rf_arr, lo_arr
Exemplo n.º 5
0
def animate(i):
    data0 = calandigital.read_interleave_data(fpga, ['dout0_0', 'dout0_1', 'dout0_2',
                                    'dout0_3', 'dout0_4', 'dout0_5', 'dout0_6', 'dout0_7'],
                                    awidth=9, dwidth=64, dtype='>512Q')

    data1 = calandigital.read_interleave_data(fpga, ['dout1_0', 'dout1_1', 'dout1_2',
                                    'dout1_3', 'dout1_4', 'dout1_5', 'dout1_6', 'dout1_7'],
                                    awidth=9, dwidth=64, dtype='>512Q')

    
    data[0].set_data(freq, 10*np.log10(data0+1.))
    data[1].set_data(freq, 10*np.log10(data1+1.))
    return data
Exemplo n.º 6
0
def get_caldata(rf_freqs):
    """
    Sweep a tone through a sideband and get the complex ratio of first (a) and
    second (b) input. It is later used to compute the adc delay using the angle
    difference information.
    :param rf_freqs: frequencies of the tones to perform the sweep (GHz).
    :return ab_ratios: complex ratios between a and b.
    """
    a2_arr = []
    b2_arr = []
    ab_arr = []
    for i, chnl in enumerate(sync_channels):
        # set test tone
        freq = rf_freqs[chnl]
        rf_generator.ask("freq " + str(freq) + " ghz; *opc?")
        time.sleep(pause_time)

        # read data
        a2 = cd.read_interleave_data(roach, bram_a2, bram_addr_width,
                                     bram_word_width, pow_data_type)
        b2 = cd.read_interleave_data(roach, bram_b2, bram_addr_width,
                                     bram_word_width, pow_data_type)
        ab_re = cd.read_interleave_data(roach, bram_ab_re, bram_addr_width,
                                        bram_word_width, crosspow_data_type)
        ab_im = cd.read_interleave_data(roach, bram_ab_im, bram_addr_width,
                                        bram_word_width, crosspow_data_type)

        # append data to arrays
        a2_arr.append(a2[chnl])
        b2_arr.append(b2[chnl])
        ab_arr.append(ab_re[chnl] + 1j * ab_im[chnl])

        # scale and dBFS data for plotting
        a2_plot = cd.scale_and_dBFS_specdata(a2, acc_len, dBFS)
        b2_plot = cd.scale_and_dBFS_specdata(b2, acc_len, dBFS)

        # compute input ratios for plotting
        ab_ratios = np.divide(np.conj(ab_arr),
                              a2_arr)  # (ab*)* /aa* = a*b / aa* = b/a

        # plot data
        lines[0].set_data(if_freqs, a2_plot)
        lines[1].set_data(if_freqs, b2_plot)
        lines[2].set_data(if_sync_freqs[:i + 1], np.abs(ab_ratios))
        lines[3].set_data(if_sync_freqs[:i + 1], np.angle(ab_ratios, deg=True))
        fig.canvas.draw()
        fig.canvas.flush_events()

    return ab_ratios
Exemplo n.º 7
0
 def animate(_):
     for line, specbrams in zip(lines, specbrams_list):
         # update acc_len
         acc_len = roach.read_uint(acc_len_reg)
         # get spectral data
         specdata = cd.read_interleave_data(roach, specbrams,
                                            spec_addr_width,
                                            spec_word_width, spec_data_type)
         specdata = cd.scale_and_dBFS_specdata(specdata, acc_len, dBFS)
         line.set_data(freqs, specdata)
     return lines
Exemplo n.º 8
0
 def save():
     specdata_list = []
     for specbrams in specbrams_list:
         specdata = cd.read_interleave_data(roach, specbrams,
                                            spec_addr_width,
                                            spec_word_width, spec_data_type)
         specdata_list.append(specdata)
     np.savez("filter_data",
              prim=specdata_list[0],
              ref=specdata_list[1],
              output=specdata_list[2])
     print("Data saved")
def get_caldata():
    """
    Get the calibration data assumimg a broadband noise signal is injected.
    The calibration data is the power of each input (a and b)
    and the cross-correlation of both inputs as a complex number (ab*).
    :return: calibration data: a2, b2, and ab.
    """
    # read data
    time.sleep(pause_time)
    a2 = cd.read_interleave_data(roach, bram_a2, bram_addr_width,
                                 bram_word_width, pow_data_type)
    b2 = cd.read_interleave_data(roach, bram_b2, bram_addr_width,
                                 bram_word_width, pow_data_type)
    ab_re = cd.read_interleave_data(roach, bram_ab_re, bram_addr_width,
                                    bram_word_width, crosspow_data_type)
    ab_im = cd.read_interleave_data(roach, bram_ab_im, bram_addr_width,
                                    bram_word_width, crosspow_data_type)

    # get crosspower as complex values
    ab = ab_re + 1j * ab_im

    # scale and dBFS data for plotting
    a2_plot = cd.scale_and_dBFS_specdata(a2, acc_len, dBFS)
    b2_plot = cd.scale_and_dBFS_specdata(b2, acc_len, dBFS)

    # compute input ratios for plotting
    ab_ratios = np.divide(ab, b2)

    # plot data
    line0.set_data(if_freqs, a2_plot)
    line1.set_data(if_freqs, b2_plot)
    line2.set_data(if_freqs, np.abs(ab_ratios))
    line3.set_data(if_freqs, np.angle(ab_ratios, deg=True))
    fig.canvas.draw()
    fig.canvas.flush_events()

    return a2, b2, ab
Exemplo n.º 10
0
def plot_stability_data():
    global a2_arr, b2_arr, anglediff_arr, magratios_arr, srr_arr, time_arr

    tone_sideband = 'usb'
    a2_arr = []
    b2_arr = []
    magratios_arr = []
    anglediff_arr = []
    srr_arr = []
    time_arr = []
    start_time = time.time()

    try:
        while True:
            time.sleep(pause_time)
            time_arr.append(time.time() - start_time)
            # read cal data
            a2 = cd.read_interleave_data(roach, bram_a2, bram_addr_width,
                                         bram_word_width, pow_data_type)
            b2 = cd.read_interleave_data(roach, bram_b2, bram_addr_width,
                                         bram_word_width, pow_data_type)
            ab_re = cd.read_interleave_data(roach, bram_ab_re, bram_addr_width,
                                            bram_word_width,
                                            crosspow_data_type)
            ab_im = cd.read_interleave_data(roach, bram_ab_im, bram_addr_width,
                                            bram_word_width,
                                            crosspow_data_type)

            # read syn data
            usb = cd.read_interleave_data(roach, bram_usb, bram_addr_width,
                                          bram_word_width, pow_data_type)
            lsb = cd.read_interleave_data(roach, bram_lsb, bram_addr_width,
                                          bram_word_width, pow_data_type)

            # scale and dBFS data for plotting
            a2_plot = cd.scale_and_dBFS_specdata(a2, acc_len, dBFS)
            b2_plot = cd.scale_and_dBFS_specdata(b2, acc_len, dBFS)

            ab = ab_re[stab_chnl] + 1j * ab_im[stab_chnl]

            # compute input ratios for plotting
            if tone_sideband == 'usb':
                ab_ratio = np.divide(np.conj(ab),
                                     a2)  # (ab*)* /aa* = a*b / aa* = b/a
            else:  # tone_sideband=='lsb
                ab_ratio = np.divide(ab, b2)  # ab* / bb* = a/b

            # append data to arrays
            a2_arr.append(a2_plot[stab_chnl])
            b2_arr.append(b2_plot[stab_chnl])
            magratios_arr.append(np.abs(ab_ratio[stab_chnl]))
            anglediff_arr.append(np.angle(ab_ratio[stab_chnl], deg=True))

            # compute srr
            if tone_sideband == 'usb':
                srr = np.divide(usb, lsb)
            else:  # tone_sideband=='lsb
                srr = np.divide(lsb, usb)

            srr_arr.append(10 * np.log10(srr[stab_chnl]))

            # plot data
            if show_plots:
                lines[0].set_data(time_arr, a2_arr)
                lines[1].set_data(time_arr, b2_arr)
                lines[2].set_data(time_arr, magratios_arr)
                lines[3].set_data(time_arr, anglediff_arr)
                lines[4].set_data(time_arr, srr_arr)

                # update axes
                axes[0].set_ylim(np.min(a2_arr), np.max(a2_arr))
                axes[1].set_ylim(np.min(b2_arr), np.max(b2_arr))
                axes[2].set_ylim(np.min(magratios_arr), np.max(magratios_arr))
                axes[3].set_ylim(np.min(anglediff_arr), np.max(anglediff_arr))
                axes[4].set_ylim(np.min(srr_arr), np.max(srr_arr))
                axes[4].set_xlim(0, time_arr[-1])

                fig.canvas.draw()
                fig.canvas.flush_events()

    except:
        make_post_measurements_actions()