Skip to content

eo_s21

eo_s21(
frequencies: collections.abc.Sequence[
typing.Annotated[float, minimum=0, units='Hz']
],
*,
length: Annotated[float, exclusiveMinimum=0, units='μm'],
n_group: Annotated[float, exclusiveMinimum=0],
n_rf: complex | photonforge.Interpolator,
z0: Annotated[complex, units='Ω'] | photonforge.Interpolator = 50.0,
z_load: Annotated[complex, units='Ω'] | photonforge.Interpolator = 50.0,
z_source: Annotated[complex, units='Ω']
| photonforge.Interpolator = 50.0,
rf_propagation_loss: Annotated[float, minimum=0, units='dB/μm']
| photonforge.Interpolator = 0,
) -> numpy.ndarray

Electro-optic response of a terminated traveling-wave modulator.

The response is the drive voltage seen by the optical wave, averaged over its transit through the line, relative to the source voltage. It accounts for the RF loss, the walk-off between the RF and optical waves, and the reflections at the source and the load. This is the response that TerminatedModTimeStepper applies to its drive signal.

S21(f)=−2ZinZin+ZS(ZL+Z0)F++(ZL−Z0)F−(ZL+Z0)eγL+(ZL−Z0)e−γLS_{21}(f) = -\frac{2 Z_\text{in}}{Z_\text{in} + Z_S} \frac{(Z_L + Z_0) F_+ + (Z_L - Z_0) F_-} {(Z_L + Z_0) e^{\gamma L} + (Z_L - Z_0) e^{-\gamma L}}

with γ=α+jωnRF/c\gamma = \alpha + j \omega n_\text{RF} / c, F±=1−e±γL−jωngL/c±γL−jωngL/cF_\pm = \frac{1 - e^{\pm\gamma L - j\omega n_g L / c}} {\pm\gamma L - j\omega n_g L / c} and Zin=Z0ZL+Z0tanh⁡γLZ0+ZLtanh⁡γLZ_\text{in} = Z_0 \frac{Z_L + Z_0 \tanh\gamma L}{Z_0 + Z_L \tanh\gamma L}. At low frequency its magnitude tends to 2ZL/(ZL+ZS)2 Z_L / (Z_L + Z_S), so dividing by its low-frequency value gives the usual normalized EO response.

Args

  • frequencies: RF frequencies at which to evaluate the response.
  • length: Length of the traveling-wave section.
  • n_group: Optical group index.
  • n_rf: RF effective index of the line.
  • z0: Characteristic impedance of the line.
  • z_load: Impedance terminating the line.
  • z_source: Impedance of the source driving the line.
  • rf_propagation_loss: RF loss of the line.

Returns

Complex response at each frequency.

Example

>>> frequencies = np.linspace(0.1e9, 60e9, 600)
>>> s21 = pf.eo_s21(
... frequencies,
... length=2000,
... n_group=4.0,
... n_rf=3.8,
... rf_propagation_loss=2e-3,
... )
>>> response = 20 * np.log10(np.abs(s21 / s21[0]))
>>> bandwidth = frequencies[np.argmax(response < -3)]