Source code for piel.models.logic.electro_optic.signal_map

"""
TODO implement this function.
In this function we implement different methods of mapping electronic signals to phase.

One particular implementation of phase mapping would be:

.. list-table:: Example Basic Phase Mapping
   :header-rows: 1

   * - Bit
     - Phase
   * - b0
     - :math:`\\phi_0 \\to 0`
   * - b1
     - :math:`\\phi_1 \\to \\pi`

We can define the two corresponding angles that this would be.

A more complex implementation of phase mapping can be similar to a DAC mapping: a bitstring within a converter
bit-size can map directly to a particular phase space within a particular mapping."""

import numpy as np
from ..electronic.digital import bits_array_from_bits_amount
from ....types.digital_electro_optic import BitPhaseMap


[docs] def linear_bit_phase_map( bits_amount: int, final_phase_rad: float, initial_phase_rad: float = 0, quantization_error: float = 0.000001, **kwargs, ) -> BitPhaseMap: """ Returns a linear direct mapping of bits to phase. Args: bits_amount(int): Amount of bits to generate. final_phase_rad(float): Final phase to map to. initial_phase_rad(float): Initial phase to map to. quantization_error(float): Error in the phase mapping. Returns: BitPhaseMap: Mapping of bits to phase. """ # Generate the binary combinations for the specified bit amount bits_array = bits_array_from_bits_amount(bits_amount) # Calculate the number of divisions in the phase space phase_division_amount = len(bits_array) - 1 # Calculate the step size for each phase division, adjusting for quantization error phase_division_step = ( final_phase_rad - initial_phase_rad ) / phase_division_amount - quantization_error # Generate the phase array using numpy's arange linear_phase_array = np.arange( initial_phase_rad, final_phase_rad, phase_division_step ) # Ensure that we have enough phases for all bits; handle edge cases where rounding might cause fewer steps if len(linear_phase_array) < len(bits_array): linear_phase_array = np.append(linear_phase_array, final_phase_rad) # Create the BitPhaseMap object bit_phase_mapping = BitPhaseMap(bits=bits_array, phase=linear_phase_array) return bit_phase_mapping