Source
%matplotlib widget
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from ipywidgets import *
plt.style.use('dark_background')
fontsize = 14
mpl.rcParams.update(
{
"text.usetex": False,
"figure.figsize": (9, 6),
# "figure.autolayout": True,
# "font.family": "serif",
# "font.serif": "georgia",
# 'mathtext.fontset': 'cm',
"lines.linewidth": 1.5,
"font.size": fontsize,
"xtick.labelsize": fontsize,
"ytick.labelsize": fontsize,
"legend.fancybox": True,
"legend.fontsize": fontsize,
"legend.framealpha": 0.7,
"legend.handletextpad": 0.5,
"legend.labelspacing": 0.2,
"legend.loc": "best",
"axes.edgecolor": "#b0b0b0",
"grid.color": "#707070", # grid color"
"xtick.color": "#b0b0b0",
"ytick.color": "#b0b0b0",
"savefig.dpi": 80,
"pdf.compression": 9,
}
)In the previous two lectures, we studied two crucial interferometers: the Fabry-Perot and Michelson.
From these basic building blocks, we will eventually build the complex interferometer which is Advanced LIGO.\
However, before we build Advanced LIGO, we need a little more technology.
This tech will revolve around different frequencies of light interacting with our interferometers.
We have already touched on the idea of multiple frequencies at several moments,
but now we will formalize it in the form of Scattering Matrices, Transfer Functions, and Modulations.
1Modulations¶
The modulation picture emphasizes the different frequencies of light that are created by different interactions. GWs are detected as infinitesimal modulations applied to highly stabilized laser light. Noise in the laser light, whether quantum or classical, is modulations not caused by GWs.
A perfectly noiseless electric field is known as the carrier:
where is the carrier frequency, is the carrier amplitude, and is time.
1.1Phase Modulation¶
A phase modulation of amplitude at frequency can be applied to the carrier light:
This can be thought of as splitting the carrier power, which is always a sine wave at , off into sidebands at frequencies . Using the Jacobi-Anger expansion on Eq.~(2) yields:
where is the Bessel function of the first kind.
If we assume is small, then we can ignore the higher-order sidebands , and write Eq.~(3) as
Finally, using , , and , we write the final phase modulation in terms of the carrier , upper sideband and lower sideband :
The key observation of Eq.~(5) is the relative phase of the sidebands compared with the carrier.
The sidebands are aligned with one another when they are orthogonal to the carrier.
Calculating the power in the field,
The sidebands push and pull the phase of the carrier by , but to first order do not alter the amplitude. Figure illustrates the sideband and quadrature picture of phase modulation.

Phase Modulation Scheme
Solution to Exercise 1 #
With three terms in the input electric field, multiplied by three terms of the complex conjugate,
we end up with nine total terms in the power expression, which simplifies down to Equation (6):
Note we still have our power oscillation here.
Adding in the second order terms in helps us avoid “adding power” to final term, but does not completely eliminate our issue.
Integrating the right hand side over one period of the oscillation eliminates the exponetial terms, yielding
which is pretty good power conservation for small .
1.2Frequency noise¶
Frequency noise is mathematically equivalent to a phase modulation. Using the definition of frequency as the time derivative of phase, , and the phase from Eq.(2), we calculate the relationship between frequency noise and phase modulation \cite{HeinzelThesis}:
The frequency can be broken down into the carrier term and the noise term , where
where is the amplitude of the frequency swing.
We can substitute Eq.(11) into Eq.(5) with no change in the final result (except an arbitrary phase advance of for both sidebands):
Here we recall the distinction between , , and . The carrier frequency is , this is a constant, (The Advanced LIGO laser wavelength ). The modulation frequency itself is , this is how fast the carrier frequency changes. The frequency modulation amplitude is how much the carrier frequency changes.
1.3Amplitude modulation¶
An amplitude modulation of amplitude at frequency can be applied to the carrier light:
Again, the key observation of Eq.(13) is the relative phase of the sidebands compared with the carrier. This time, the sidebands are aligned with one another when they are also aligned with the carrier. Calculating the power in the field,
The sidebands push and pull the amplitude of the carrier by , but do not alter the phase. Figure illustrates the sideband and quadrature picture of amplitude modulation.

Amplitude Modulation Scheme
1.4Intensity noise¶
Relative intensity noise (RIN) is mathematically equivalent to amplitude modulation. From Eq.(14), we can relate relative intensity noise to relative amplitude noise (RAN). Dividing Eq.(14) by , we define the relative intensity noise in terms of amplitude modulation:
Going back to the expression for amplitude modulation Eq.(13), we can express the electric field and power in terms of relative intensity noise :
def carrier(phi, mod_depth):
return (1 - mod_depth**2 / 4) * np.exp(1j * phi)
def upper_phase_sideband(phi, theta, mod_depth):
return 1j * mod_depth / 2 * np.exp(1j * (theta + phi))
def lower_phase_sideband(phi, theta, mod_depth):
return 1j * mod_depth / 2 * np.exp(-1j * (theta - phi))
def upper_amp_sideband(phi, theta, mod_depth):
return mod_depth / 2 * np.exp(1j * (theta + phi))
def lower_amp_sideband(phi, theta, mod_depth):
return mod_depth / 2 * np.exp(-1j * (theta - phi))Source
fig1 = plt.figure(figsize=(12,8))
ax1 = fig1.add_subplot()
phis = np.linspace(-np.pi, np.pi, 100)
phi0 = 0
theta0 = 0
mod_depth = 0.5
# Arc
plot_carriers = carrier(phis, mod_depth)
plot_carriers_real = np.real(plot_carriers)
plot_carriers_imag = np.imag(plot_carriers)
# Vectors
plot_carrier = carrier(phi0, mod_depth)
plot_usb = upper_amp_sideband(phi0, theta0, mod_depth)
plot_lsb = lower_amp_sideband(phi0, theta0, mod_depth)
plot_total = plot_carrier + plot_usb + plot_lsb
plot_carrier_real = np.real(plot_carrier)
plot_carrier_imag = np.imag(plot_carrier)
plot_usb_real = np.real(plot_usb)
plot_usb_imag = np.imag(plot_usb)
plot_lsb_real = np.real(plot_lsb)
plot_lsb_imag = np.imag(plot_lsb)
plot_total_real = np.real(plot_total)
plot_total_imag = np.imag(plot_total)
arc1, = ax1.plot(plot_carriers_real, plot_carriers_imag, label="Carrier Phasor")
# line1, = ax1.plot([0, plot_carrier_real], [0, plot_carrier_imag], 'o-', label="Carrier")
# line2, = ax1.plot([0, plot_usb_real], [0, plot_usb_imag], 'o-', label="Upper Sideband")
# line3, = ax1.plot([0, plot_lsb_real], [0, plot_lsb_imag], 'o-', label="Lower Sideband")
# line4, = ax1.plot([0, plot_total_real], [0, plot_total_imag], 'o-', label="Total Electric Field")
arrow1 = ax1.arrow(0, 0, plot_carrier_real, plot_carrier_imag, shape='full', color="C1", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Carrier")
arrow2 = ax1.arrow(plot_carrier_real, plot_carrier_imag, plot_usb_real, plot_usb_imag, shape='full', color="C2", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Upper Sideband")
arrow3 = ax1.arrow(plot_carrier_real, plot_carrier_imag, plot_lsb_real, plot_lsb_imag, shape='full', color="C3", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Lower Sideband")
arrow4 = ax1.arrow(0, 0, plot_total_real, plot_total_imag, shape='full', color="C4", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Total Electric Field")
ax1.set_xlabel("Real")
ax1.set_ylabel("Imaginary $i$")
ax1.set_xlim([-1.5, 1.5])
ax1.set_ylim([-1.5, 1.5])
ax1.grid()
ax1.set_title("Amplitude Modulation")
ax1.legend(bbox_to_anchor=(1.01, 0.6))
ax1.set_aspect('equal')
# plt.tight_layout()
def update_amplitude_modulation(
phi0_slider_value=phi0,
theta0_slider_value=theta0,
mod_depth_slider_value=mod_depth
):
"""
Create waves plot with synchronized cosine and sine displays.
"""
new_phi0 = np.pi / 180 * phi0_slider_value
new_theta0 = np.pi / 180 * theta0_slider_value
new_mod_depth = mod_depth_slider_value
# Arc
new_plot_carriers = carrier(phis, new_mod_depth)
new_plot_carriers_real = np.real(new_plot_carriers)
new_plot_carriers_imag = np.imag(new_plot_carriers)
# Vectors
new_plot_carrier = carrier(new_phi0, new_mod_depth)
new_plot_usb = upper_amp_sideband(new_phi0, new_theta0, new_mod_depth)
new_plot_lsb = lower_amp_sideband(new_phi0, new_theta0, new_mod_depth)
new_plot_total = new_plot_carrier + new_plot_usb + new_plot_lsb
new_plot_carrier_real = np.real(new_plot_carrier)
new_plot_carrier_imag = np.imag(new_plot_carrier)
new_plot_usb_real = np.real(new_plot_usb)
new_plot_usb_imag = np.imag(new_plot_usb)
new_plot_lsb_real = np.real(new_plot_lsb)
new_plot_lsb_imag = np.imag(new_plot_lsb)
new_plot_total_real = np.real(new_plot_total)
new_plot_total_imag = np.imag(new_plot_total)
# line1.set_xdata(new_xx0)
# line1.set_ydata(new_yy0)
arc1.set_xdata(new_plot_carriers_real)
arc1.set_ydata(new_plot_carriers_imag)
arrow1.set_data(x=0, y=0, dx=new_plot_carrier_real, dy=new_plot_carrier_imag)
arrow2.set_data(x=new_plot_carrier_real, y=new_plot_carrier_imag, dx=new_plot_usb_real, dy=new_plot_usb_imag)
arrow3.set_data(x=new_plot_carrier_real, y=new_plot_carrier_imag, dx=new_plot_lsb_real, dy=new_plot_lsb_imag)
arrow4.set_data(x=0, y=0, dx=new_plot_total_real, dy=new_plot_total_imag)
# ax1.set_title(r"$(r, \theta)$ = " + f"({new_plot_rr0:.3f}, {180/np.pi*new_plot_theta0:.3f}"+r"$^\circ$)")
fig1.canvas.draw_idle()
return
# Create interactive widget
phi0_slider1 = FloatSlider(
value=phi0,
min=0,
max=180,
step=0.1,
description=r"$\phi_0$ [deg]:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
theta0_slider1 = FloatSlider(
value=theta0,
min=0,
max=360,
step=0.1,
description=r"$\omega t$ [deg]:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
mod_depth_slider1 = FloatSlider(
value=mod_depth,
min=0,
max=1,
step=0.01,
description=r"$\Gamma$:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
interact(
update_amplitude_modulation,
phi0_slider_value=phi0_slider1,
theta0_slider_value=theta0_slider1,
mod_depth_slider_value=mod_depth_slider1,
)
plt.show()Source
fig2 = plt.figure(figsize=(12,8))
ax2 = fig2.add_subplot()
phis = np.linspace(-np.pi, np.pi, 100)
phi0 = 0
theta0 = 0
mod_depth = 0.5
# Arc
plot_carriers = carrier(phis, mod_depth)
plot_carriers_real = np.real(plot_carriers)
plot_carriers_imag = np.imag(plot_carriers)
# Vectors
plot_carrier = carrier(phi0, mod_depth)
plot_usb = upper_phase_sideband(phi0, theta0, mod_depth)
plot_lsb = lower_phase_sideband(phi0, theta0, mod_depth)
plot_total = plot_carrier + plot_usb + plot_lsb
plot_carrier_real = np.real(plot_carrier)
plot_carrier_imag = np.imag(plot_carrier)
plot_usb_real = np.real(plot_usb)
plot_usb_imag = np.imag(plot_usb)
plot_lsb_real = np.real(plot_lsb)
plot_lsb_imag = np.imag(plot_lsb)
plot_total_real = np.real(plot_total)
plot_total_imag = np.imag(plot_total)
arc12, = ax2.plot(plot_carriers_real, plot_carriers_imag, label="Carrier Phasor")
# line1, = ax2.plot([0, plot_carrier_real], [0, plot_carrier_imag], 'o-', label="Carrier")
# line2, = ax2.plot([0, plot_usb_real], [0, plot_usb_imag], 'o-', label="Upper Sideband")
# line3, = ax2.plot([0, plot_lsb_real], [0, plot_lsb_imag], 'o-', label="Lower Sideband")
# line4, = ax2.plot([0, plot_total_real], [0, plot_total_imag], 'o-', label="Total Electric Field")
arrow12 = ax2.arrow(0, 0, plot_carrier_real, plot_carrier_imag, shape='full', color="C1", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Carrier")
arrow22 = ax2.arrow(plot_carrier_real, plot_carrier_imag, plot_usb_real, plot_usb_imag, shape='full', color="C2", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Upper Sideband")
arrow32 = ax2.arrow(plot_carrier_real, plot_carrier_imag, plot_lsb_real, plot_lsb_imag, shape='full', color="C3", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Lower Sideband")
arrow42 = ax2.arrow(0, 0, plot_total_real, plot_total_imag, shape='full', color="C4", lw=2,
length_includes_head=True, head_width=.025, zorder=2, label="Total Electric Field")
ax2.set_xlabel("Real")
ax2.set_ylabel("Imaginary $i$")
ax2.set_xlim([-1.5, 1.5])
ax2.set_ylim([-1.5, 1.5])
ax2.grid()
ax2.set_title("Phase Modulation")
ax2.legend(bbox_to_anchor=(1.01, 0.6))
ax2.set_aspect('equal')
# plt.tight_layout()
def update_phase_modulation(
phi0_slider_value=phi0,
theta0_slider_value=theta0,
mod_depth_slider_value=mod_depth
):
"""
Create waves plot with synchronized cosine and sine displays.
"""
new_phi0 = np.pi / 180 * phi0_slider_value
new_theta0 = np.pi / 180 * theta0_slider_value
new_mod_depth = mod_depth_slider_value
# Arc
new_plot_carriers = carrier(phis, new_mod_depth)
new_plot_carriers_real = np.real(new_plot_carriers)
new_plot_carriers_imag = np.imag(new_plot_carriers)
# Vectors
new_plot_carrier = carrier(new_phi0, new_mod_depth)
new_plot_usb = upper_phase_sideband(new_phi0, new_theta0, new_mod_depth)
new_plot_lsb = lower_phase_sideband(new_phi0, new_theta0, new_mod_depth)
new_plot_total = new_plot_carrier + new_plot_usb + new_plot_lsb
new_plot_carrier_real = np.real(new_plot_carrier)
new_plot_carrier_imag = np.imag(new_plot_carrier)
new_plot_usb_real = np.real(new_plot_usb)
new_plot_usb_imag = np.imag(new_plot_usb)
new_plot_lsb_real = np.real(new_plot_lsb)
new_plot_lsb_imag = np.imag(new_plot_lsb)
new_plot_total_real = np.real(new_plot_total)
new_plot_total_imag = np.imag(new_plot_total)
# line1.set_xdata(new_xx0)
# line1.set_ydata(new_yy0)
arc12.set_xdata(new_plot_carriers_real)
arc12.set_ydata(new_plot_carriers_imag)
arrow12.set_data(x=0, y=0, dx=new_plot_carrier_real, dy=new_plot_carrier_imag)
arrow22.set_data(x=new_plot_carrier_real, y=new_plot_carrier_imag, dx=new_plot_usb_real, dy=new_plot_usb_imag)
arrow32.set_data(x=new_plot_carrier_real, y=new_plot_carrier_imag, dx=new_plot_lsb_real, dy=new_plot_lsb_imag)
arrow42.set_data(x=0, y=0, dx=new_plot_total_real, dy=new_plot_total_imag)
# ax2.set_title(r"$(r, \theta)$ = " + f"({new_plot_rr0:.3f}, {180/np.pi*new_plot_theta0:.3f}"+r"$^\circ$)")
fig2.canvas.draw_idle()
return
# Create interactive widget
phi0_slider2 = FloatSlider(
value=phi0,
min=0,
max=180,
step=0.1,
description=r"$\phi_0$ [deg]:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
theta0_slider2 = FloatSlider(
value=theta0,
min=0,
max=360,
step=0.1,
description=r"$\omega t$ [deg]:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
mod_depth_slider2 = FloatSlider(
value=mod_depth,
min=0,
max=1,
step=0.01,
description=r"$\Gamma$:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
interact(
update_phase_modulation,
phi0_slider_value=phi0_slider2,
theta0_slider_value=theta0_slider2,
mod_depth_slider_value=mod_depth_slider2,
)
plt.show()1.5Modulation of a reflection off a mirror¶
Now, we want to relate the above modulations to a real system.
Suppose we have a mirror oscillating at a frequency with a small amplitude .
An electric field is incident on that mirror over a propogation distance .
What is the total reflected electric field ?
The below diagram illustrates the above situation.
We have the incident electric field on the mirror:
and the electric field reflected off and traveling back along that distance again:
Looking at Equation (2), we can identify the similarities between it and Eq. (18) above.
In short, our phase modulation term , where the 2 comes from the double-pass through the length modulation .
Following the same Jacobi-Anger math as above, we can write Eq. (18) as
Now we have three electric fields from our initial single carrier: carrier still at , but some sidebands at .
For mirror reflections, normally will be in the audio frequencies of 10 - 10000 kHz,
but in general could be any frequency.

Mirror Reflection Phase Modulation
1.6Review of Modulations¶
The key to all of the modulations above are the creation of the additional phasors at and .
These represent entirely different frequencies of light.
Typically, is the carrier frequency, which is a huge number, on the 100 terrahertz scale.
is either in the audio band of 10 - 10000 Hz or radio-frequency band of a few megahertz.
So, the frequencies are fairly close in absolute terms (100 THz ± 10 MHz is a fairly small difference.)
This helps us understand how the light carrier and sidebands interact with optical elements in a similar way.
Modulations can be created by specific interactions of the laser carrier with optical elements, including power or frequency fluctuations from the laser, thermal fluctuations of the mirror surface, “popsical” modes of mirror mounts, or seismic motion of a suspended mirror.
Anything that interacts with the laser imposes some modulations upon it, but these can be measured and controlled.
1.7Modulations in the Quadrature Picture¶
Amplitude and phase quadratures offer a convenient way of representing light. Instead of upper and lower sidebands, modulations are broken down into how they affect the carrier.
The quadrature operators can be written as a vector representing the modulations of the total electric field:
where is the amplitude quadrature and is the phase quadrature.
This representation is a bit different than our previous quadrature representation of the real (cosine) and imaginary (sine) quadratures.
This amplitude and phase quadrature representation can be well-motivated by Carlton Caves two photon formalism.
While I won’t go into this here, quantum optics textbooks, and several LIGO papers and theses give a nice overview of the two photon formalism relationship between the sideband and quadrature picture.
We can express the sideband amplitude and phase modulations from ()[#eq:intensity_modulation] and ()[#eq:frequency_modulation] in quadrature representation using ()[#eq:quadrature_vector].
We break up the total electric field into a ``static’’ component centered around the carrier frequency and a modulation, or Fourier, component at the relative signal frequencies . Expressing an electric field modulated in both intensity and frequency from Eqs (16) and (12) in quadrature representation yields
Here, we add our upper and lower sidebands from Eqs.~(16) and (12) together to produce the quadrature scalers.
For example, we recover intensity noise from Eq.~(16). Let for in Eq.~(21), and take the dot product of with itself to get power :
2Demodulations¶
Above, we’ve been calculating the effects of modulations on electric fields and power quantities for phase and amplitude modulations.
Some of the information we’ll care about for interferometers, especially relative lengths, will be caught up in the beatnote between our carrier frequency and sideband frequency .
Demodulation is the process of extracting that information.
Demodulation is simply the process of integrating a power signal over one cycle of the frequency of interest.
So if I have some power signal and I care about the signal at frequency ,
I would integrate over one full cycle of :
where is the constant DC power on the diode, and and are the power signals measured in the I-quadrature (cosine quadrature) and Q-quadrature (sine quadrature). Normally demodulations are written as an integral over all time , but if the power signal is stationary the power signals should remain the same over one cycle .
Basically, what Eq. (23) allows us to “pick-out” the signals of the total electric field quadratures incident on the photodiode at the beatnote frequency .
Imagine that the time signal .
When we multiply by , we get
Integrating the above over one cycle of will give
so we’d get the constant out of that integral.
Multiplying by similarly picks out .
In this way, demodulation allows us to reconstruct the total electric field incident on a photodetector, simply by measuring the power signal and comparing it to some oscillator at .
This can be an incredibly powerful tool, as we will see when we study Pound-Drever-Hall laser locking.
2.2Example: Length Estimation using two frequencies of light¶

Solution to Exercise 2 #
First, our input phasors for our lasers light will be
and after the propogate a distance , they will have accrued a different phase , where and :
The total electric field is
where in the last line we factor out the common phasor .
The total power is
Then, our demodulation integrals become
remember that
These results points to a clear way of reconstructing , as well as isolating .
We can get our complex phasor back by looking at :
which is the non-time-dependent part of the beatnote term of .\
By finding the argument of , that will be equal to . If we know the frequency , we can estimate :
The issue arises from phase-wrapping: if , we’ll underestimate .
One can alter to make ,
or use other methods to find the correct order-of-magnetude for that makes sense.

