# Voltage RMS and Voltage Spectral Density from ADC Sample are Not Consistent

I have time series data from a 100 MS/s ADC, and I would like to calculate the RMS noise and the voltage spectral density (VSD), and see consistency between the two.

I'm using a 16-bit ADC, and the data is in bits, so data point can be any integer in [-32768, 32767]. The noise of the ADC channel is 3.6 LSB.

I calculate the VSD by taking the discrete Fourier transform (I use Fourier in Mathematica). I drop the data at frequencies above the Nyquist frequency (50 MHz), and take the magnitude of each term (because I don't care about the phase for this measurement).

I normalize the data FFT by calculating the FFT of a 1 MHz sine wave with 1 LSB RMS amplitude: SQRT(2)SIN(2 PI 10^6 t), then I use the height of that peak (which ends up equal to 127.867) as a normalization factor. So if f is the FFT magnitude of the data the normalize FFT is f/127.867.

I thought this normalization would take care of any factors of 2 or PI from the Mathematica Fourier function, but the VSD does not make sense. The VSD is flat, white noise; I don't sample at low enough rate to see the 1/f noise at low frequency. The noise level is 0.03 LSB. This is about 60 times larger than I expect the real VSD noise level to be, based on the 3.6 LSB RMS noise value since:

(RMS noise) ~= VSD noise level * SQRT(f1-f0) = 0.03*SQRT(50x10^6) = 218 LSB.

I feel like I'm missing something fundamental here, but I'm not quite sure what's going wrong. Any feedback on what I do here, and how to get closer to a consistent VSD?

Thank you.

• Try acquiring a real signal of known amplitude with your ADC, see what it looks like and what the FFT looks like. That will detect problems with gain, calibration, etc. Aug 31, 2021 at 22:36
• What do you mean you "drop" the frequencies over the Nyquist limit? Do you have a low pass filter before the ADC? If not, the higher frequencies will appear aliased and you'll have to consider them as well. Aug 31, 2021 at 23:01
• Also how exactly are you computing the VSD from the FFT of the time series? Would you mind showing the results? Aug 31, 2021 at 23:19

Your sqrt(50M) assumes the VFD is in noise/sqrt(Hz).

What normalisations has Mathematica applied? Have you told it fs = 100M so it's giving you noise/sqrt(Hz), or is it giving you noise/bin_width, which will be much higher?

What's the length of your FFT? If (for instance) 10k, then your bins are 10M/10k = 1 kHz wide. This factor doesn't appear (and doesn't need to appear) in the sinewave calibration you did.

What window did you use? They increase the noise bandwidth of a bin by a factor of typically 2, but can be more.

Do a noise calibration, as well as a sinewave calibration, then vary the length of the FFT, and the type of window, to see what's going on.

'Ground Truth' of an FFT operation can be established with Parseval's Theorem. This basically says 'you get the same total energy for a sequence whether you add up the energy per time sample, or do a FFT and then add up the energy per frequency sample', subject to any scaling factor of N that the transform happens to do.

If the noise bandwidth is your problem, I'd guess your factor of 60 times too much is consistent with an FFT length of around 4096. Am I right?

• Yes it seems you are on the right track with the normalization. I do the FFT of a 32700 point time series. I drop the symmetrical data above 50 MHz, so the spectrum has 16350 points. I did not use a window, I just did the FFT on the data from the ADC which was sampling at 100 MS/s. How does a window filter come in? It looks like the correct calibration factor is SQRT(bin width in Hz * length of data/2) so SQRT(10^8/32700*32700/2)=SQRT(50 MHz), which is what I'd expect.... This gets the RMS and spectrum to agree to within 10%, so I'm thinking this is correct.
– Dan
Sep 2, 2021 at 22:41