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.ndarrayElectro-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.
with , and . At low frequency its magnitude tends to , 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)]