A Fabry-Perot two-mirror optical cavity is the fundamental building block of laser physics.
With it, we have built the first lasers and masers,
created optical clocks
and detected gravitational waves.
Here we will dive deeply into the basics of a Fabry-Perot.
We will come back to this formalism a dozen times throughout this course,
and develop some matrix mechanics and other math required to understand it.
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,
}
)
Fabry-Perot illustration
A Fabry-Perot cavity is two mirrors aligned with some space between them.
The mirrors are labeled and , which represents their amplitude reflectivity,
and and which are the amplitude transmission.
The amplitude coefficients are related to our more commonly reported power reflectivity and power transmission like
The red arrows represent electric fields, which act as nodes on a directed graph.
The arrow direction illustrates the transitions on the graph.
We have one input above: , which represents the input laser.
represents all the field strength that will interact with the cavity.
will have two transitions: one to , and another to . These represent the intracavity field and the cavity reflected field. These will be influenced by the reflectivity of the mirrors, as we will see.
Note we have two outputs from our system: and .
represets the total cavity transmitted field.
Because power must be conserved, we can write the following:
The above power conservation assumes no loss inside the Fabry-Perot cavity.
We will assume that our incident is a plane-wave, and we’ll find the plane-wave solutions to the Fabry-Perot cavity below.
1Scattering Matrices¶
Before we dive into the analysis of the Fabry Perot, we need to understand its parts. We will investigate the effect of mirrors and propogation distances on electric fields, and how these can be described with scattering matrices.
1.1General Scattering Matrix¶
Suppose we have two electric fields and incident on an general optical object .
and are both electric field phasors with the same optical axis, frequency, and polarization,
but opposite wavenumbers .

We can describe their interaction like
The components and describe the action of the object on the beam transmitted through the object:
This can include phase changes, absorption, and transmission coefficients.
However, the object may partially or totally reflect the incident beams back along the optical axis.
This is described by the and components.
In this manner, we have described a general scattering matrix for our beams travelling in two directions.
One can imagine that we can add many different bases to make an scattering matrix,
describing changes to the electric field frequencies, polarization, or direction.
The scattering matrix is good enough for our plane-wave Fabry-Perot solutions, as we’ll see below.
1.2Propogation Distance¶
First we describe a simple length propogation matrix over a distance .
In this case, travels an additional distance , accruing an extra phase delay .
Additionally, travels an additional distance , but in the direction, yielding the same positive phase accrued .
No exchange between and occurs, so we get the final *length propogating matrix$:

1.3Mirror Matrix¶
A mirror matrix defines our first non-trivial interaction between and .
A reflection can occur at any interface between two materials with different indices of refraction , .
Our drawing indicates that is incident on the front surface of the mirror.
In other words, is traveling from a lower index of refraction to a higher one .
The reflectivity of the mirror causes some of the incident field to be reemitted back in the direction it came, toward .
Due to the Fresnel relations, incurs a phase flip, giving the full reflection coefficient to be
.
If we add in the transmission of to , we get the full expression for .
A similar process can be performed for as well, only this time we use because we are going from high index to low index :

Solution to Exercise 1 #
Here is one option for the beamsplitter matrix.
Note that we label the front of the beamsplitter with a minus sign to help us put down correct Fresnel relations signs on our reflected signals.

Solution to Exercise 2 #
Let the input phasors
Then
Recalling
Similarly for :
Then yields
So power incident on the mirror is conserved iff
This derivation is very dense, so we’ll unpack some important results here.
First, notice the importance of our Fresnel conditions giving and coefficients of reflection. Power would not be conserved without it.
Second, the individual power terms and exhibit clear interference. Without adjusting any input power levels, I can switch the power coming out of the mirror from one side to the other by adjusting the relative phase .
Equation (14) is an extremely important power conservation condition never achieved for real mirrors.
There is always some loss, either from direct absorption of the incident light, or scattering of light away from normal incidence by surface imperfections.
We call anything that causes our laser to lose power loss , and this can be incorporated into Eq (14) via
where we have written and in terms of their more-commonly-used power coefficients.
To see a plot of and as a function of , open the lower two Source and Output tabs.
Source
phis = np.linspace(-np.pi, np.pi, 1000)
rr = np.sqrt(0.5) # mirror amplitude reflection
tt = np.sqrt(0.5) # mirror amplitude transmission
p_in1 = 0.5 # watt
p_in2 = 0.5 # watt
p_out1 = tt**2 * p_in1 + rr**2 * p_in2 + 2 * rr * tt * np.sqrt(p_in1 * p_in2) * np.cos(phis)
p_out2 = rr**2 * p_in1 + tt**2 * p_in2 - 2 * rr * tt * np.sqrt(p_in1 * p_in2) * np.cos(phis)
fig, ax1 = plt.subplots(1)
ax1.plot(180/np.pi*phis, p_out1, label=r"P Out 1")
ax1.plot(180/np.pi*phis, p_out2, label=r"P Out 2")
ax1.grid()
ax1.set_title("Power Output from a Mirror versus Relative Input Phase")
ax1.set_xlabel(r"Input Relative Phase $\phi$ [degs]")
ax1.set_ylabel("Power $P$ [W]")
ax1.legend()
plt.show()Output
2Fabry Perot Solutions¶

Using the matrices above, we are ready to assemble our Fabry-Perot interferometer.
First, we will go through and assemble a vector of our electric fields :
We neglect any phase propogation other than inside the cavity length .\
Now we examine each element of our electric fields and write out a system of equations for each of them.
We pick out our source terms, in this case,
and ignore them for the time being,
as they have no relationship to the dynamics of the cavity itself,
they only source the field for it.
Hopefully, with some examination of the diagram, it can become clear where the above systems of equations came from.
represents the electric field just coming off the input mirror inside the cavity heading toward the end mirror, while
represents the same field for the end mirror, heading toward the input mirror.
is sourced by two fields:
being transmitted through the input mirror ,
propogating the full cavity length , accruing phase,
then reflecting off the front of the input mirror, gaining the reflection coefficient
2.1Intracavity Field ¶
Here we will solve the intracavity field directly from our equations above.
We can eliminate from by subbing in the second equation above:
which, by subtracting over and solving for it, yields
Below we have a magnitude and phase plot of the intracavity field as a function of the round-trip phase .
We will often use the round-trip phase rather than cavity length or input laser frequency,
as those are degenerate with one another.
2.2Transfer Function¶
A transfer function is a general measure of the linear relationship of one signal to another.
In this case, linear means that action at one frequency in the input x(t) causes the action in the output y(t):
where , are the Fourier transforms of the input and output signals , , and is the transfer function between them.
A Bode plot is just the plot of the magnitude and phase of a function as frequency.
We can consider the below plot as a transfer function from the input to the output if we rewrite Eq. (19) as
def ecav_fp(phis, ein, trans1, trans2, loss1=0, loss2=0):
"""Calculates the intracavity field ecav for a Fabry-Perot cavity.
phis: float
Round-trip phase phi = 2 k L [radians]
ein: float
Input electric field amplitude [sqrt watts]
trans1: float
Input mirror power transmission T1
loss1: float
Input mirror loss L1
loss2: float
End mirror loss L2
"""
# Set up amplitude reflectivities
t1 = np.sqrt(trans1)
t2 = np.sqrt(trans2)
r1 = np.sqrt(1 - loss1 - trans1)
r2 = np.sqrt(1 - loss2 - trans2)
ecav = ein * t1 / (1 - r1 * r2 * np.exp(-1j * phis))
return ecav# Define a cavity
phis2 = np.linspace(-3*np.pi, 3*np.pi, 10000)
# mirror power transmissions
trans1 = 0.25
trans2 = 0.25
loss1 = 0 # no loss for now
loss2 = 0
ein = 1 # rtWatts
# Calculate intracavity field
ecav = ecav_fp(phis2, ein, trans1, trans2, loss1, loss2)# Make a Bode plot of the cavity transmission
fig2, (ax21, ax22) = plt.subplots(2, sharex=True)
ax21.plot(180/np.pi*phis2, np.abs(ecav), label="|Ecav|")
ax22.plot(180/np.pi*phis2, np.angle(ecav, deg=True), label=r"$\angle$ Ecav")
ax21.set_xticks(180*np.arange(-3,4))
ax21.grid()
ax21.set_title("Intracavity field vs Round-Trip Phase")
# ax21.set_xlabel(r"Input Relative Phase $\phi$ [degs]")
ax21.set_ylabel(r"$|E_\mathrm{cav}|$ [$\sqrt{W}$]")
ax21.legend()
ax22.grid()
# ax22.set_title("")
ax22.set_xlabel(r"Round Trip Phase $\phi = 2 k L$ [degs]")
ax22.set_ylabel(r"$\angle E_\mathrm{cav}$ [deg]")
ax22.legend()
plt.show()2.3Complex Lorentzian¶
Equation (19) has a very interesting form, as can be seen from the magnitude and phase plot above. There is a regular phasor in the denominator. If we are very near resonance (), then we can write
And our intracavity field becomes what is called a complex Lorentzian:
This is the form of many resonances, including optical cavities, but also atomic resonances in laser gain media
Source
fig3 = plt.figure()
ax3 = fig3.add_subplot()
phi0 = 0
phis3 = np.linspace(0, 2 * np.pi, 10000)
trans1 = 0.25
trans2 = 0.25
ein = 1 # rtWatts
plot_ecav0 = ecav_fp(phi0, ein, trans1, trans2)
plot_ecav = ecav_fp(phis3, ein, trans1, trans2)
plot_real_ecav0 = np.real(plot_ecav0)
plot_imag_ecav0 = np.imag(plot_ecav0)
plot_real_ecav = np.real(plot_ecav)
plot_imag_ecav = np.imag(plot_ecav)
# line1, = ax3.plot([0, plot_real_ecav0], [0, plot_imag_ecav0], 'o-', label=r"$E_mathrm{cav}(\phi_0)$")
arc1, = ax3.plot(plot_real_ecav, plot_imag_ecav, label=r"$E_\mathrm{cav}$")
arrow1 = ax3.arrow(0, 0, plot_real_ecav0, plot_imag_ecav0, shape='full', color="#ff5500", lw=2,
length_includes_head=True, head_width=.15, zorder=2, label=r"$E_\mathrm{cav}(\phi_0)$")
ax3.set_xlabel("Real")
ax3.set_ylabel("Imaginary $i$")
ax3.set_xlim([-1, 5])
ax3.set_ylim([-3, 3])
ax3.grid()
ax3.set_title(r"Intracavity Phasor")
ax3.legend(bbox_to_anchor=(1.01, 0.6))
ax3.set_aspect('equal')
# plt.tight_layout()
def update_ecav(
trans1_slider_value=trans1,
trans2_slider_value=trans2,
phi0_slider_value=phi0
):
"""
Create an interactive intracavity field phasor plot
"""
new_trans1 = trans1_slider_value
new_trans2 = trans2_slider_value
new_phi0 = phi0_slider_value
new_plot_ecav = ecav_fp(phis, ein, new_trans1, new_trans2)
new_plot_xxs = np.real(new_plot_ecav)
new_plot_yys = np.imag(new_plot_ecav)
new_plot_ecav0 = ecav_fp(new_phi0, ein, new_trans1, new_trans2)
new_plot_xx0 = np.real(new_plot_ecav0)
new_plot_yy0 = np.imag(new_plot_ecav0)
new_xxs = new_plot_xxs
new_yys = new_plot_yys
arc1.set_xdata(new_xxs)
arc1.set_ydata(new_yys)
arrow1.set_data(x=0, y=0, dx=new_plot_xx0, dy=new_plot_yy0)
fig3.canvas.draw_idle()
return
# Create interactive widget
trans1_slider = FloatSlider(
value=trans1,
min=0,
max=1,
step=0.01,
description="$T_1$:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
trans2_slider = FloatSlider(
value=trans2,
min=0,
max=1,
step=0.01,
description="$T_2$:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
phi0_slider = FloatSlider(
value=phi0,
min=0,
max=2*np.pi,
step=0.01,
description=r"$\phi_0$:",
continuous_update=True, # Only update on release for better performance
orientation='horizontal',
readout=True,
readout_format='.3f',
)
interact(
update_ecav,
trans1_slider_value=trans1_slider,
trans2_slider_value=trans2_slider,
phi0_slider_value=phi0_slider,
)
plt.show()Solution to Exercise 3 #
All the denominators are the same. This is something we see in control theory, or any directed graph situation. The expression is the open loop gain, meaning that if we let a light ray experience only one round-trip of the cavity, it will be modified by that amount:
where is just the number of round-trips.
has a difference in the numerator, and can therefore be zero.
See the Cavity Coupling section for more on the importance of
2.4Resonance Condition¶
Equation (19) is our intracavity electric field.
It depends on our mirror reflectivities and , and is physical so long as , which must be true is power is conserved.
Interestingly, the intracavity power also depends on the cavity length and input laser wavenumber .
In fact, if we set equal to some special values such that , then we get a massive buildup of constructive interference inside the cavity, and Eq. (19) becomes
If the mirrors are extremely reflective such that ,
then we can get a huge resonant gain of the intracavity electric field.
Coming back to setting , let’s solve this for :
yielding the resonance condition:
The length of the cavity must be a half-integer of the laser wavelength for the cavity to achieve resonant buildup of the intracavity power.
2.5Free Spectral Range¶
It is also convenient to know the Fabry-Perot’s in terms of interogating it with plane waves of different frequencies.
The free spectral range, or FSR, defines the input frequencies at which we achieve resonance.
Starting with Eq. (28), we simply sub in and solve:
We can see the different resonances in the spacing of intracavity field resonances. In the literature, like Siegman’s Lasers, sometimes the integer is used instead of to represent each resonant axial mode.
2.6Cavity Power Gain¶
We are often interested in using an optical cavity to enhance our laser power via the cavity’s optical gain . Higher gain can make our gravitational wave detectors more sensitive to
Here we calculate the power expression :
The term modifying is sometimes called the cavity optical gain , and is usually assumed to be the max gain achieved when on resonance:
A field amplitude gain term is also sometimes used for . This gives us the relationship .
2.7Linewidth¶
Now we want to analyze our Fabry-Perot cavity’s power buildup while on and slightly off resonance. The linewidth, or bandwidth, of a cavity is a very convenient measure of how much deviation in frequency is acceptable to still be considered “on-resonance”. This is also known as the Full-Width-Half-Maximum (FWHM) of the optical cavity .
To find ,
we use the gain power gain expression and
The linewidth calculation is left as an excercise below.
Solution to Exercise 4 #
2.8Cavity Finesse¶
The cavity finesse refers to the fine-ness of the cavity resonances.
This term is a hold-over from the days of etalons, when the width of fringes made by a curved mirror were used to measure the finesse.
The cavity finesse is just the ratio of the cavity’s free spectral range and full-width-half-maximum:
This ratio gives us the spacing between resonances over the width of those resonances.
2.9Cavity Pole and Storage Time¶
Here we invoke a critical concept from complex algebra to describe the cavity dynamics.
The pole of a transfer function is just the frequency where the denominator equals zero:
This gives us a convenient way of defining how fast a cavity can respond to changes.
It can be shown that the Fabry-Perot acts as a low-pass filter, which resonates and transmits disturbances at frequencies below the cavity pole,
but rejects disturbances above it.
Equivalentally, the inverse of the pole is often called the storage time ,
The storage time represents how long it takes to fill the cavity with light to its steady state.
One homework 2 problem will ask us to compute the storage time via a geometric series.
In the high-finesse limit, the cavity pole equals half the full-width half-maximum:
So the cavity pole is another convenient measure of the cavity bandwidth.
2.10Cavity Couplings¶
Finally, we discuss the Fabry-Perot cavity coupling in the context of the reflected electric field. The reflected electric field transfer function is written as
where the round-trip phase was set to zero, putting us on resonance, and the input mirror made lossless, allowing .
Equation (38) illustrates an important relationship between and .
If , we get exactly zero reflected light coming from the Fabry-Perot.
This is known as critical coupling.
With critical coupling, we achieve perfect destructive interference from our two contributing fields at the reflected field:
and both contribute equal quantities to , but completely out of phase.
Additionally, because ,
then accounts for all of the input power: .
Thus, by aligning and resonating a laser between two mirrors, we can pass the laser fully through two mirrors
Similarly, we have the unequal conditions:
Overcoupled:
Undercoupled:
We will find that overcoupled cavities promote high power in the cavity, and are therefore used in gravitational wave detectors.
One HW2 problem reviews this.
Overcoupled cavities do exhibit a right-hand-plane zero, which is occasionally problematic due to the loss of phase the RHP zero imposes on the reflected Fabry-Perot light.
def erefl_fp(phis, ein, trans1, trans2, loss1=0, loss2=0):
"""Calculates the reflected field Erefl for a Fabry-Perot cavity.
phis: float
Round-trip phase phi = 2 k L [radians]
ein: float
Input electric field amplitude [sqrt watts]
trans1: float
Input mirror power transmission T1
loss1: float
Input mirror loss L1
loss2: float
End mirror loss L2
"""
# Set up amplitude reflectivities
t1 = np.sqrt(trans1)
t2 = np.sqrt(trans2)
r1 = np.sqrt(1 - loss1 - trans1)
r2 = np.sqrt(1 - loss2 - trans2)
erefl = ein * (r1 - (r1**2 + t1**2) * r2 * np.exp(-1j * phis)) / (1 - r1 * r2 * np.exp(-1j * phis))
return ereflSource
fig4, ax4 = plt.subplots(1)
phi0 = 0
phis3 = np.linspace(0, 2 * np.pi, 10000)
trans1 = 0.25
trans2s = [0.10, 0.25, 0.50]
labels = ["Over", "Critical", "Under"]
ein = 1 # rtWatts
for ii, trans2, label in zip(range(len(trans2s)), trans2s, labels):
plot_erefl0 = erefl_fp(phi0, ein, trans1, trans2)
plot_erefl = erefl_fp(phis3, ein, trans1, trans2)
plot_real_erefl0 = np.real(plot_erefl0)
plot_imag_erefl0 = np.imag(plot_erefl0)
plot_real_erefl = np.real(plot_erefl)
plot_imag_erefl = np.imag(plot_erefl)
# line1, = ax3.plot([0, plot_real_erefl0], [0, plot_imag_erefl0], 'o-', label=r"$E_mathrm{cav}(\phi_0)$")
arc1, = ax4.plot(plot_real_erefl, plot_imag_erefl, label=label)
arrow1 = ax4.arrow(0, 0, plot_real_erefl0, plot_imag_erefl0, shape='full', color=arc1.get_color(), lw=2,
length_includes_head=True, head_width=.03, zorder=2)
ax4.set_xlabel("Real")
ax4.set_ylabel("Imaginary $i$")
ax4.set_xlim([-1, 1])
ax4.set_ylim([-1, 1])
ax4.grid()
ax4.set_title("Fabry Perot Reflected Field Phasor\nArrows Point to Value at Resonance " + r"$\phi = 0$")
ax4.legend(bbox_to_anchor=(1.01, 0.6),title="Coupling\n")
ax4.set_aspect('equal')
plt.show()3Adjacency Matrix¶
Next I’d like to introduce a very general method of solving any optical system. This method is employed by interferometer simulation software such as Finesse3, but is also useful for any systems of equations solver, including
An adjacency matrix is a very general concept in computer science for representing a graph,
either directed or undirected.
In our case, we can use an adjacency matrix to represent our Fabry-Perot, or any optical system,
as well as calculate the transfer functions relating any electric field to any other electric field (i.e. any node of the graph to any other node).
3.1Fabry Perot as Directed Graph¶
First, we can break down our Fabry Perot system of equations into optical nodes and transfer matrices.
All the electric fields become nodes in our graph,
while all the transitions becomes arrows indicating direction of influence.
The graph breakdown looks like the below diagram:

3.2Markov Matrix Representation¶
If we are interested in the steady-state solution of these fields, i.e. that all of the electric fields we can employ a classic method of solving the relationship between all nodes in the graph: Markov Matrix inversion.
Next, we take the nodes of the graph and form them into a Markov state vector ,
where is a discrete time variable representing how many round-trips have occurred.
We use this notation for simplicity in relating to graph traversal, but recognize that and are exchangable for discrete and continuous representation.
Then, we use the graph to construct the adjacency matrix :
Note that we recover our Fabry-Perot system of equations (Eqs. (17)) if we multiply out this relation.
Second, using the steady state condition , we can rearrange the above to give
where is the identity matrix. We can solve for the transfer functions from each field to every other field by inverting the matrix:
The first column of the inverted matrix represents the well-known Fabry-P'erot transfer functions from the input field to all other fields of the cavity.
For example, the classic resonant gain equation is the matrix element in the second row, first column:
The second and third columns are the transfer functions from and to all other fields.
These are typically not required, but will be important when explicitly calculating the PDH signals in later sections.
The fourth and fifth columns are for the cavity reflected and transmitted fields.
They are mostly zeros because they are sink fields,
i.e. those fields strictly exit the interferometer.
Similarly, the first rwo for the input field is mostly zeros for the source field.