Source code for piel.analysis.electro_optic.modulation
import numpy as np
[docs]
def effective_index_product(n_eff, L_nm, L_active, L_thermal):
"""
Calculate the effective index product for a segment.
Parameters:
n_eff (float): Effective index of the material.
L_nm (float): Non-modulated length of the segment (m).
L_active (float): Active length of the segment (m).
L_thermal (float): Thermal length of the segment (m).
Returns:
float: Effective index product.
Formula:
.. math::
n_{eff, i} L_i = n_{eff, i} L_{nm, i} + n_{eff, i}(V) L_{active, i} + n_{eff, i}(T) L_{thermal, i}
"""
return n_eff * L_nm + n_eff * L_active + n_eff * L_thermal
[docs]
def relative_phase(phi2, phi1):
"""
Calculate the relative phase difference.
Parameters:
phi2 (float): Phase at point 2 (radians).
phi1 (float): Phase at point 1 (radians).
Returns:
float: Relative phase difference.
Formula:
.. math::
\Delta \phi = \phi_2 - \phi_1
"""
return phi2 - phi1
[docs]
def phase_difference(n_eff2, L2, n_eff1, L1, wavelength):
"""
Calculate the phase difference between two segments.
Parameters:
n_eff2 (float): Effective index of segment 2.
L2 (float): Length of segment 2 (m).
n_eff1 (float): Effective index of segment 1.
L1 (float): Length of segment 1 (m).
wavelength (float): Wavelength of light (m).
Returns:
float: Phase difference (radians).
Formula:
.. math::
\Delta \phi = \frac{2 \pi (n_{eff, 2}L_2 - n_{eff, 1}L_1)}{\lambda_0}
"""
return (2 * np.pi * (n_eff2 * L2 - n_eff1 * L1)) / wavelength
[docs]
def balanced_mzi_phase_difference(delta_n_eff, L, wavelength):
"""
Calculate the phase difference in a balanced Mach-Zehnder Interferometer (MZI).
Parameters:
delta_n_eff (float): Difference in effective indices between the arms.
L (float): Arm length (m).
wavelength (float): Wavelength of light (m).
Returns:
float: Phase difference (radians).
Formula:
.. math::
\Delta \phi = \beta L = \frac{2 \pi \Delta n_{eff} L }{\lambda_0}
"""
return (2 * np.pi * delta_n_eff * L) / wavelength
[docs]
def free_spectral_range(wavelength, n_g, delta_L):
"""
Calculate the free spectral range (FSR).
Parameters:
wavelength (float): Wavelength of light (m).
n_g (float): Group index.
delta_L (float): Path length difference (m).
Returns:
float: Free spectral range (m).
Formula:
.. math::
FSR = \frac{\lambda^2}{n_{g} \Delta L}
"""
return (wavelength**2) / (n_g * delta_L)
[docs]
def insertion_loss(P_in_dBm, P_max_dBm):
"""
Calculate the insertion loss of a device in decibels (dB).
Parameters:
P_in_dBm (float): Input power (dBm).
P_max_dBm (float): Maximum transmitted power (dBm).
Returns:
float: Insertion loss (dB).
Formula:
.. math::
IL = P_{in, dBm} - P_{max, dBm}
"""
return P_in_dBm - P_max_dBm
[docs]
def extinction_ratio(P_max, P_min):
"""
Calculate the extinction ratio in decibels (dB).
Parameters:
P_max (float): Maximum power (W).
P_min (float): Minimum power (W).
Returns:
float: Extinction ratio (dB).
Formula:
.. math::
ER = 10 \cdot \log_{10} \left( \frac{P_{max}}{P_{min}} \right)
"""
if P_min == 0:
raise ValueError("Minimum power must be non-zero.")
return 10 * np.log10(P_max / P_min)
[docs]
def modulated_extinction_ratio(P_H, P_L):
"""
Calculate the modulated extinction ratio in decibels (dB).
Parameters:
P_H (float): High power level (W).
P_L (float): Low power level (W).
Returns:
float: Modulated extinction ratio (dB).
Formula:
.. math::
ER_{mod} = 10 \cdot \log_{10} \left( \frac{P_{H}}{P_{L}} \right)
"""
if P_L == 0:
raise ValueError("Low power level must be non-zero.")
return 10 * np.log10(P_H / P_L)