Use a DVM to directly digitize low-frequency noise (Part 3)
Improvement --> Failure --> Success --> Repeat
I have found that often simple improvements often lead to short term failure, but eventually success.
In the last two articles I showed how a modern 6½ digit DVM could be used to measure 0.1 to 10 Hz noise . I had intended to move on to something else this month, but I made a number of improvements to my noise measuring application – and a number of mistakes were also made along the way.
Since we learn best from our mistakes, but typically we don't share the really dumb ones with colleagues, I'll start. Who knows, perhaps this will start a useful trend!
“Because man is fallible, so are his constructions. . . Thus the history of structural engineering, indeed the history of engineering in general, may be told in its failures as well as in its triumphs. Success may be grand, but disappointment can often teach us more.”
-- Henry Petroski, Professor of Civil Engineering, Duke University 
Improvement #1 – Increase the measurement time to get lower frequency measurement.
I decided that instead of just using repeated and averaged 10-second measurement intervals that I should use this acquired data to an advantage to extend the lower measurement frequency. I would collect 10 each, 10-second samples and then stitch the 10 sets of data to one long 100-second set of data – do a DFT on that data and then I would extend the low frequency down to 0.01 Hz instead of 0.1 Hz.
A simple change, or so I thought. I re-factored my code to acquire data in a circular buffer of sorts. Every 10-second interval would be acquired and a DFT/Average would be done on that data and when 100 seconds of data had been acquired a DFT/Average would be done on that data. This way when plotted I get a Hybrid Plot of sorts. The 0.1 to 20-Hz data has lots of averaging going on and at the same time I extend the low-frequency limit of the measurement.
For testing I used a MAX9617 chopper amplifier running at a gain of 10  – this yielded a white noise of about 420 nV/√Hz that is fairly flat over the DC to 20-Hz region. This noise source was chosen as it lifted me off the noise floor of the DVM but still intersected the 1/f noise of the DVM at about 0.15 Hz. In other words – it was a good test signal to make sure that my measurements and calculations were all correct.
This choice proved vital in my later measurements (and subsequent uncovering of errors) and was not made by chance. It was a determined choice based on years of making mistakes and learning from them.
I tested this new code and the resulting plot is shown in figure 1. While the high-frequency spectrum was correct, at lower frequencies the 1/f noise decreased which was not what I expected at all – the noise should have kept going up. The test circuit was all DC coupled so the unexpected roll off wasn't due to a coupling capacitor issue.
Figure 1 – After changing my algorithm to stack multiple 10 second measurements into one long 100 second measurement I plotted the following DFT result. The low frequency noise measurement of my white noise source took an unexpected dip – The noise should have increased upwards at low frequencies, but it didn't. See the text for the silly cause of this error.
After a short coffee and email break the problem hit me. In Part 2 of the previous article I said that my algorithm was to remove the DC offset from all the readings by subtracting the average of a 10-second interval from all the readings – thus yielding a waveform with no average DC value.
When I extended the algorithm to a 100-second interval I left the DC removal function at the 10-second interval location in the code. This means that I was incorrectly modifying the 100-second data before doing the DFT on it. I was doing in effect what a chopper amplifier does in operation: I was zeroing the DC offset at repeated intervals and hence removing the 1/f noise. When I changed the DC offset removal operation to just before the DFT, then the measurement worked correctly.