4.3.1 Optical beat

In this example two laser beams are superimposed at a \(50:50\) beamsplitter. The beams have a slightly different frequency: the second beam has a \(10\) kHz offset with respect to the first (and to the default laser frequency). The plot illustrates the output of four different detectors in one of the beam splitter output ports, while the phase of the second beam is tuned from \(0\degree\) to \(180\degree\). The photodiode ‘pd1’ shows the total power remaining constant at a value of \(1\). The amplitude detectors ‘ad1’ and ‘ad10k’ detect the laser light at \(0\) Hz (default frequency) and \(10\) kHz respectively. Both show a constant absolute of \(\sqrt{1/2}\) and the detector ‘ad10k’ tracks the tuning of the phase of the second laser beam. Finally, the detector ‘pd10k’ resembles a photodiode with demodulation at \(10\) kHz. In fact, this represents a photodiode and two mixers used to reconstruct a complex number as shown in Eq. (4.15). One can see that the phase of the resulting electronic signal also directly follows the phase difference between the two laser beams (Fig. 25).

import finesse
from finesse.analysis.actions import Xaxis
import numpy as np
import matplotlib.pyplot as plt
finesse.init_plotting()

base = finesse.Model()
base.parse(
    """
    var freq 10k                    # creating a parameter for the frequency offset
    l l1 P=1                        # laser with P=1W at the default frequency
    s s1 l1.p1 bs1.p1 L=1n          # space of 1nm length
    l l2 P=1 f=freq                 # a second laser with f=10kHz frequency offset
    s s2 l2.p1 bs1.p4 L=1           # another space of 1nm length
    bs bs1                          # 50:50 beam splitter

    ad ad1 bs1.p2.o f=0             # amplitude detector at default frequency
    ad ad10 bs1.p2.o f=freq         # amplitude detector at 10kHz frequency offset
    pd pd1 bs1.p2.o                 # simple photodetector
    pd1 pd10 bs1.p2.o f=freq        # photo detector with demodulation at 10kHz
    """
)

out = base.run(Xaxis(base.l2.phase, 'lin', 0, 180, 100))

fig, ax = plt.subplots(2, 1, figsize=(8, 7))
ax[0].plot(out.x1, np.abs(out['pd1']), label=r'pd1 [W]')
ax[0].plot(out.x1, np.abs(out['pd10']), label=r'pd10 [W]')
ax[0].plot(out.x1, np.abs(out['ad1']), label=r'ad1 [$\sqrt{\mathrm{W}}$]')
ax[0].plot(out.x1, np.abs(out['ad10']), ls='--', label=r'ad10k [$\sqrt{\mathrm{W}}$]')
ax[0].set_ylim(0, 1.1)
ax[0].set_xlabel(r'phi (l2) [$\degree$]')
ax[0].set_ylabel(r'Amplitude')
ax[0].legend()

ax[1].plot(out.x1, np.degrees(np.angle(out['pd1'])), label=r'pd1 [W]')
ax[1].plot(out.x1, np.degrees(np.angle(out['pd10'])), label=r'pd10 [W]')
ax[1].plot(out.x1, np.degrees(np.angle(out['ad1'])), 
           ls='--', label=r'ad1 [$\sqrt{\mathrm{W}}$]')
ax[1].plot(out.x1, np.degrees(np.angle(out['ad10'])), 
           ls='--', label=r'ad10k [$\sqrt{\mathrm{W}}$]')
ax[1].set_xlabel(r'L (s1) [m]')
ax[1].set_ylabel(r'Phase [$\degree$]')
ax[1].legend()
plt.show()
../_images/99371e05b07063e1521f49c0723b2624ebc31f560ba27a6ffe479289b8ac642f.svg