Fourier Transform Spectroscopy continued, or: How to reproduce NIST ASD results to 8+ digits at home

The Atomic Spectra Database (ASD) from the US National Institute of Standards and Technology is a well known tool which contains a large amount of precisely measured electronic transitions in atoms, i.e. spectral lines. Its data is a reference for many fields in science.

So, is it possible to build a spectrometer at home which reproduces their accuracy?

Close-up of an early version of the Channel 1 detector PCB of my FT spectrometer

Turns out, it indeed is:

Here you can see the 546.075 nm mercury (Hg) line, which NIST ASD reports with 546.07500 ± 0.00010 nm, reproduced as 546.007493 ± 0.00008 nm by my spectrometer (source is an old “energy-saving” light bulb from the basement, those contained mercury). This result is within statistical uncertainity of the NIST value, and even has smaller statistical uncertainity than the literature value. The result has more than 8 significant digits.

This isn’t a fluke either, the same spectrum this data was taken from covers the full visible range, and contains several such lines with similar accuracies (e.g. Hg 435.83363 ± 0.00010 nm from NIST ASD is detected at 435.83359 ± 0.00008 nm).

Hg spectrum from an energy saving light bulb. Ignore the 632 nm line, it’s an artifact (stray light from the reference laser).

How this works? Read on to find out.

Project history

Before I continue, one paragraph of project history. This started as a joke toy project to build world’s worst fourier transform spectrometer. I then kind of got hooked and wanted to build a proper one, initially with the plan to sell the device as a for-profit enterprise. While the prototype I built worked and showed some pretty impressive results, I decided it to be too big of a task to productize it into something that would actually sell, and dropped the project. (We are commercially building Raman spectrometers now instead, which use simpler grating spectrometers.)

In this post, I want to document how the project went and show some results, since I think commercial use is quite unlikely by now and it would be sad to see the results disappear into the void without anyone ever seeing them.

More-or-less finished FT spectrometer

Project goal

The goal of the project was to build a general-purpose, ultra-high resolution spectrometer for visible light, an optical spectrum analyzer. I originally envisioned with proper technology, this could achieve higher throughput and thus better signal-to-noise ratio than conventional spectrometers, which I learned to be a misconception during the project, though.

Project components

To build a fourier transform spectrometer (I will not go into detail again here how these work, please read my earlier post on the topic of the wiki article if you are interested), we need several non-trivial components:

  • A Michelson interferometer, consisting of a beam splitter and two mirrors.
  • A rail which moves one of the interferometer mirrors back and forth, with several cm in length. (The length determines the spectral resolution.)
  • Either position control or position sensing for this mirror, with < 100 nm (!) accuracy.
  • A detector, like a photodiode. Ideally, this has 2 channels, since the interferometer has 2 outputs.
  • A digitizer, which records the detector level as the mirror moves.
  • Software which computes optical spectra from the recorded data using a Fast Fourier Transform algorithm.

In the following, I will describe how I designed built those components.

An older prototype of the FTS being tested with a green Nd:YaG single-mode laser

Michelson interferomter

For this, we don’t need much — just two retro-reflector mirrors, and a beam splitter aligned precisely. These components can be bought off-the-shelf. To get everything in place, I have a CAD model of the whole device, including the beam path.

CAD model of the FTS

Each individual part is made from Aluminum on a CNC machine.

Drilling the FTS base plate

This is quite some effort, but it overall works well and the results are good.

10 cm moving mirror rail and positioning concept

Many commercial FT systems or ones mentioned in literature use position-regulated rails for their mirrors, meaning they have a closed-loop feedback system for positioning the mirror at a location accurate to ~100 nanometers. I decided against going this route, since it seemed unnecessarily complicated. We do not actually need to precisely position the mirror; it is sufficient to know where it was for each sample.

In my system, this is realized by adding a second channel, geometrically parallel to the measured light, into the interferometer assembly. Into this second channel, we inject laser light from a known-wavelength source. From this, we can compute the mirror position — more on that in the next section. For the mirror rail, what matters is that it does not need to be able to accurately position anything; it is sufficient if it moves the mirror in a straight line at a somewhat constant speed.

An early version of the linear rail, using part-plastic parts from IGUS for the rail. This was later replaced by standard steel linear bearings because the plastic parts simply are not rigid enough.

I ended up simply using a step motor with a belt driving a sled on a steel linear rail. This does have some backlash, but it’s simple to build and relatively cheap, and it is very stiff and precise in its movement direction.

Position detection system for moving mirror

As explained in the previous section, a reference laser passes through almost the same optical path as the measurement light. This is a HeNe laser with a wavelength of 632 nm. As the mirror moves, we see interference fringes from this laser in a reference channel output — one light-dark cycle every 632 nm of optical path difference. By counting these fringes, we can calculate the position the mirror is at for each point in time.

Reference channel output showing about 100.000 fringes of the reference laser, recorded over an optical path length difference of 60 mm. X is sample count, Y is relative intensity. It looks like noise, but…
… it’s actually nicely resolved fringes.

By counting these fringes, we can reconstruct a position curve and, as its derivative, a veolcity curve of our mirror. The position curve is quite boring, it’s visibly just a straight line; the velocity curve is more interesting:

Section from the computed velocity. x is rail position in cm, y is velocity in mm/s.

Here we clearly see some un-roundness from our motor drive. We don’t care though, we know from this data where exactly the mirror surface was positioned at each time, to an accuracy of probably < 20 nanometers. That’s all we need.

We can now use this data to re-sample the x axis of the actual measurement data, from “sample index” (i.e. time) to “optical path length difference in the michelson interferometer”.

The role of laser accuracy in this strategy

We have one problem now though: we need a laser with

  • precisely known, stable wavelength, and
  • sufficient coherence length, so it actually produces a nice fringe pattern across our whole 200 mm path length difference (10 cm rail equals 20 cm path length difference, back and forth).

Fortunately, one of the oldest known lasers can reasonably fulfill these requirements: The helium-neon laser.

HeNe laser tube in operation.

These are available used from various sources for somewhat reasonable prices (low three-digit euros range).

Such a HeNe laser in itself is not bad, but it can be even better when it is temperature-stabilized. This is a fascinating physics and engineering topic, worthy of an article on its own, but doesn’t really fit into the length of this post.

HeNe laser temperature regulator board, with tiny beam splitter and photodiodes.

Suffice to say, by using a polarizing beam splitter and regulating the temperature of the laser tube such that both polarizations have equal intensity significantly improves accuracy and stability of the lasing operation. For this FTS, I designed and built a PCB with a tiny beam splitter, 2 photodiodes, a transimpedance amplifier, some FETs switching on and off a heating kapton foil wrapped around the laser tube, and a LPC1112 microcontroller implementing a PID engine in software to perfrom this regulation. A temperature sensor on top of the laser tube is used to speed up startup when first turned on (we can heat to a certain temperature below which we know stable operation cannot be achieved).

HeNe regulator board operation. X is some kind of time (not seconds, IIRC 0.2 seconds or so?). The blue oscillation shows the heat-up of the tube; then at some point the regulator decides it’s pre-heated now, and engages (orange line goes from 0 to 100). It adjusts the heat output (green) such that the mode ratio (blue) is 50:50. After some time, it detects the mode ratio has stabilized, and signals a Lock condition (red) to the control software. Temperature (violet) is only used for start-up and tracing, the actual regulated quantity is the mode ratio.

This gives us an ultra-precise, ultra-stable source for reference light, which amazingly covers all calibration requirements this device has.

Detector circuit board

The detector circuit board needs to turn the light exiting the interferometer into an electrical signal. This board had several iterations; initially, it was a high-gain transimpedance amplifier, but later turned into a silicon photomultiplier board.

Early variant of the detector board, with high-gain transimpedance amplifier. During operation, there is an anti-RFI cover installed which was removed for the picture.

The main problem with the transimpedance amplifier is that its bandwidth gets really low at high gains. The gain curve is also not super flat, leading to artifacts in the spectrum when the mirror velocity is not constant. They are also super sensitive to environmental radio frequency interference; without the RFI cover depicted above, this board basically doesn’t work at all.

Silicon photomulitpliers, in contrast, are a new kind of technology which use large armouns of avalanche diodes in parallel to capture photons. They give outputs similar to classical photomultiplier tubes (PMTs), but with much smaller size, higher quantum efficiency, and lower voltages (my PCB uses ~40 V). Like PMTs, they have an intrinsic gain and do not usually need a separate amplifier circuit before the analog-digital-conversion. The gain can be controlled by changing the voltage on the device. This works really great and I’m very happy with this kind of detector.

Silicon photomultiplier (SIPM)-based detector board. This originally featured Peltier cooling for the SIPM because they produce less noise when cold, but I had to turn it off; the current control for the Peltier element produced more noise than the cooling got rid of. (The current control needs to go to a different PCB. I am reportedly not the first person to make this mistake. But I have very nice microcontroller-selectable current control for the Peltier element and it gets really cold!)

Digitizer circuit board

The digitizer printed circuit board (PCB) needs to simultaneously sample 4 analog channels (actual signal and reference signal from the HeNe laser, for 2 channels) with high-enough™ bit depth and sample rate.

Digitizer PCB prototype.

What’s high-enough sample rate? If we move our mirror at a maximum velocity of 20 mm/sec, we will see 100.000 fringes (dark/bright changes in the interferometer output) per second at 400 nm wavelength. Nyquist’s theorem says we need a sample rate larger than 200 kHz for that, but to be on the safe side and for easier debugging, I went for 1 to 1.5 MHz.

What’s high-enough bit depth? Well, this very much depends on the signal. With perfect gain control, for this application, you will need very few bits. 2 bits would probably be totally fine and yield perfect spectra. However, we don’t have perfect gain control. Our input signals might have very different amplitudes, and the amplitude of the interferometer output might even vary during a sweep.

Thus, I went for a generous 14 bits, which drastically reduces requirements on the signal preconditioning before it reaches the ADC.

Firmware development for the digitizer board. I should really learn to clean my desk before taking these pictures.

The digitizer PCB I designed for this project features a LTC2324-14 four-channel, 2 MHz, simultaneous-sampling 14-bit ADC, controlled by a LPC4333 microcontroller. This part actually has 4 ADCs, not just 1 or 2 ADCs connected to 4 outputs with a multiplexer; we need this because we want to sample all four channels at precisely the same times.

The microcontroller firmware then uses the LPC4333 SGPIO hardware module quite extensively to implement the timing diagram for talking to the LTC2324-14. The SGPIO module features various shift registers and I/Os which can be chained together with a lot of configuration options. This was quite challenging, as clock speeds of around 50 MHz are involved to retrieve data from the part quickly enough — not easy to do with a 200 MHz clock speed CPU. (I’m a little bit proud of this.)

Excerpt from the Digitizer PCB schematic in KiCAD.

But ultimately, this works nicely; the microcontroller acquires the samples (about 12 MB per second!), packs them, and streams them to the PC host using high-speed USB.

This board also has some other duties, such as talking to the laser controller and motor controller via CAN bus, relaying the host software’s commands to them and reporting their status to the PC.

PC Software

The PC software implements the communication protocol with the digitizer board and controls the whole device by talking to it. It uses libusb to do this. It also displays the results, using Qt and the Qwt plotting toolkit. (It is of course 100% a development prototye / tool and would never reach an end user any way like this.)

PC software showing the position fringe pattern (x = centimeters, y = intensity) of a red laser diode.

It also implements all the logic and algorithms required to obtain optical spectra from the raw samples. This isn’t super complicated, but there are still quite some steps involved, such as identifying the reference fringes, counting them, computing the mirror position, re-sampling the measurement data from time to the mirror position, combining the balanced and unbalanced interferometer outputs, centering the zero-position fringe (important for white-light spectra), applying a windowing function, and finally computing the actual fourier transform.

Single scan of a broadband light source (white LED). Such sources have low coherence length, and thus give a very narrow frequency-band response.

And this, finally, is everything needed to get the super-precise measurement presented in the opening paragraph.

That’s it! I hope this was at least a bit interesting to read. It definitely was very interesting to build.

Categories: Everything

Leave a Reply

Your email address will not be published. Required fields are marked *