Hello Umesh,

I am using the AD9680-500 sampling at 491.52MHz. I am measuring the SNR (fin=15.36MHz) around 60dB.

The datasheet shows on Figure 80 SNR around 68.9dB @10MHz, so I was expecting something close.

From the SNR formula above the Figure 139 and by replacing SNR ADC by 69.8dB and if I am correct, it seems that the clock jitter would be around 10ps to get 60dB SNR. Clock jitter simulation gives me 235fs (1kHz - 100MHz). The noise flloor with no signal is around 100dBFS.

So, the other source of noise would be the power supply, isnt it? Or is there something I am missing.

Thanks for your help.

Best,

Chris

Hi Chris,

I work with Umesh. He and I were discussing your question and I just wanted to add my thoughts.

Thank you for providing the raw codes. Using Python on the Re data set, I was able to get the same results Clarence did using PScope. I think your missing 3dB comes from the normalization step - normalizing the codes before performing the FFT. Consider the case of a full-scale sinusoid: the range of x is [-8192, 8191]. When you do

x_norm = x / 2**13

the range of x_norm is [-1.0, 1.0) and the rms value is ~0.7071. If you take the FFT of x_norm and plot the results in dB, the magnitude of the full-scale sinusoid is -3dB. By convention, we normally expect to see the full-scale sinusoid at 0dBFS, and in order to see it, we must scale the signal by the peak-to-rms ratio, which for a sinusoid is just sqrt(2). So the normalization step should be

x_norm = x / 2**13 * np.sqrt(2)

Now the rms value of a full-scale sinusoid maps to 0dBFS. Note that scaling by sqrt(2) does not affect the SNR calculation because SNR is a ratio, and the 0dBFS reference level effectively cancels. But the calculation of noise density is independent of a signal, and so it is important that the reference level is set correctly. On to the FFT using NumPy:

x_fft = np.fft.rfft(x_norm) / npts

x_fft[1:-1] *= np.sqrt(2)

Here I'm just using the NumPy's rfft which returns the first half of the complex output. This function does not scale the result; so I do that manually (the [1:-1] serves as shorthand for "not the DC and fs/2 bins"). Next:

x_fft_rms_data = np.absolute(x_fft) # take magnitude of the complex output

x_fft_rms = rss(x_fft_rms_data) # root-sum-square to get RMS value

x_fft_rms_dc = x_fft_rms_data[0] # value of DC bin

x_fft_rms_noise = np.sqrt(x_fft_rms**2 - x_fft_rms_dc**2) # RMS noise

It is important to exclude the DC component from the noise calculation (which you do in your step 4). In your step 4, however, I think "mean" should be "sum". Finally,

noise_dbfs = 20 * np.log10(x_fft_rms_noise) # -68.892 dBFS

nsd = 10 * np.log10(x_fft_rms_noise**2 / (fs / 2)) # -152.797 dBFS/Hz

abn = 10 * np.log10(x_fft_rms_noise**2 / (npts/2)) # -105.013 dBFS

The Python file is attached. If the NumPy module is available to you, you can run it (you may need to change the load commands at the top). Otherwise, I hope following the code translates easily to Matlab.

Regards,

Pete