Source code for u_shaped_lib.CSH

"""
Module for analyzing Coherent Self-Heterodyne (CSH) measurements.

This module provides functionality to load and process CSH measurement data,
including noise floor analysis and linewidth calculations for modified data
that has been divided by the propagation factor.
"""

import numpy as np
from .file_management_lib import get_paths

#For modified data. Having been divided by prop factor in main script
""""
    data_ESA = plot_ESA_fast(plot=False)
    freqs = data_ESA[0,:] - center 
    ps_raw = 10**(data_ESA[1,:]/10)
    k=1.06
    n=1.5
    c = 3e8
    carrier_power = max(ps_raw)
    time_delay = abs(delay - 3)*n/c
    prop_factor = 2*np.pi**2 * time_delay**2 * k * rbw *carrier_power
    ps = ps_raw / prop_factor
"""

[docs]def get_csh_paths(directory): """ Get paths to all CSH measurement files in a directory. Parameters ---------- directory : str Path to the directory containing measurement files Returns ------- list List of paths to CSH measurement files """ csh_paths = [p for p in get_paths(directory) if 'esa' in p] return csh_paths
[docs]def load_csh_data(path): """ Load CSH measurement data from a file. Parameters ---------- path : str Path to the measurement file Returns ------- tuple Three values containing: - freqs : array of frequencies - ps : array of power values """ data = np.loadtxt(path, skiprows=1) freqs = data[:, 0] ps = data[:, 1] # lw = np.min(ps) return freqs, ps
[docs]def get_noise_floor_csh(freqs, ps, floor_range): """ Calculate the noise floor from CSH data in a specified range. Parameters ---------- freqs : numpy.ndarray Array of frequencies ps : numpy.ndarray Array of power values Returns ------- float Mean power value in the specified range """ condition = (freqs > floor_range[0]) & (freqs < floor_range[1]) return np.mean(ps[condition])
[docs]def get_data(directory, floor_range=[9e5,1e6]): """ Load and process all CSH measurements in a directory. Parameters ---------- directory : str Path to the directory containing measurement files floor_range : list, optional Range for noise floor calculation [lower_freq, upper_freq], by default [9e5,1e6] Returns ------- tuple Three lists containing: - lw_all : list of calculated linewidths - freqs_all : list of frequency arrays - ps_all : list of power arrays """ paths = get_csh_paths(directory) number = len(paths) freqs_all = [[]]*number ps_all = [[]]*number lw_all = [0]*number print('Linewidths found from average between',floor_range[0]*1e-3,'kHz and',floor_range[1]*1e-3,'kHz') for i,path in enumerate(paths): freqs, ps = load_csh_data(path) freqs_all[i] = freqs ps_all[i] = ps floor = get_noise_floor_csh(freqs,ps,floor_range) lw_all[i] = np.pi*floor return lw_all,freqs_all,ps_all