diff --git a/adc_eval/spectrum.py b/adc_eval/spectrum.py index a104faa..3c4b35e 100644 --- a/adc_eval/spectrum.py +++ b/adc_eval/spectrum.py @@ -23,7 +23,7 @@ def enob(sndr, places=1): return round((sndr - 1.76) / 6.02, places) -def sndr_sfdr(spectrum, freq, nfft, leak, full_scale=0): +def sndr_sfdr(spectrum, freq, fs, nfft, leak, full_scale=0): """Get SNDR and SFDR.""" # Zero the DC bin spectrum[0] = 0 @@ -31,6 +31,7 @@ def sndr_sfdr(spectrum, freq, nfft, leak, full_scale=0): psig = sum(spectrum[i] for i in range(bin_sig - leak, bin_sig + leak + 1)) spectrum_n = spectrum spectrum_n[bin_sig] = 0 + fbin = fs / nfft for i in range(bin_sig - leak, bin_sig + leak + 1): spectrum_n[i] = 0 @@ -62,7 +63,8 @@ def sndr_sfdr(spectrum, freq, nfft, leak, full_scale=0): "floor": noise_floor, "power": noise_power, "rms": np.sqrt(noise_power), - "dBHz": round(dBW(noise_floor) - full_scale, 1), + "dBHz": round(dBW(noise_floor, 3) - full_scale, 1), + "NSD": round(dBW(noise_floor, 3) - full_scale - 2 * dBW(fbin, 3), 1), } stats["sndr"] = { "dBc": dBW(psig / noise_power), @@ -177,7 +179,7 @@ def plot_spectrum( pwr_dB = 10 * np.log10(pwr) - scalar - sndr_stats = sndr_sfdr(pwr, freq, nfft, leak=leak, full_scale=full_scale) + sndr_stats = sndr_sfdr(pwr, freq, fs, nfft, leak=leak, full_scale=full_scale) harm_stats = find_harmonics( pwr, freq, @@ -259,7 +261,8 @@ def get_plot_string(stats, full_scale, fs, nfft, window): plt_str += f"SFDR = {stats['sfdr']['dBFS']} dBFS ({stats['sfdr']['dBc']} dBc)\n" plt_str += f"Pspur = {stats['spur']['dBFS']} dBFS\n" plt_str += f"fspur = {round(stats['spur']['freq']/1e6, 2)} MHz\n" - plt_str += f"Noise Floor = {stats['noise']['dBHz']} dBFS/Hz\n" + plt_str += f"Noise Floor = {stats['noise']['dBHz']} dBFS\n" + plt_str += f"NSD = {stats['noise']['NSD']} dBFS\n" plt_str += "\n" plt_str += "==== Harmonics ====\n" diff --git a/tests/test_spectrum.py b/tests/test_spectrum.py index 03cfd51..625b314 100644 --- a/tests/test_spectrum.py +++ b/tests/test_spectrum.py @@ -67,6 +67,7 @@ def test_sndr_sfdr_outputs(self): freq = np.array([100, 200, 300, 400]) full_scale = -3 nfft = 2**8 + fs = 1 exp_return = { "sig": { "freq": 300, @@ -86,7 +87,8 @@ def test_sndr_sfdr_outputs(self): "floor": 18 / nfft, "power": 9, "rms": 3, - "dBHz": round(-11.5297 - full_scale, 1), + "dBHz": round(-11.529675 - full_scale, 1), + "NSD": round(36.6351 - full_scale, 1), }, "sndr": { "dBc": 10.0, @@ -101,6 +103,6 @@ def test_sndr_sfdr_outputs(self): }, } - result = spectrum.sndr_sfdr(data, freq, nfft, 0, full_scale=full_scale) + result = spectrum.sndr_sfdr(data, freq, fs, nfft, 0, full_scale=full_scale) for key, val in exp_return.items(): self.assertDictEqual(result[key], val, msg=key) diff --git a/tests/test_spectrum_plotting.py b/tests/test_spectrum_plotting.py index d282609..03a0d9f 100644 --- a/tests/test_spectrum_plotting.py +++ b/tests/test_spectrum_plotting.py @@ -98,7 +98,7 @@ def test_plot_string(self): """Test proper return of plotting string.""" self.bin = 13 (freq, pwr) = self.gen_spectrum(3) - stats = spectrum.sndr_sfdr(pwr, freq, self.nfft, leak=0, full_scale=0) + stats = spectrum.sndr_sfdr(pwr, freq, 1, self.nfft, leak=0, full_scale=0) harms = spectrum.find_harmonics( pwr, freq, self.nfft, self.bin, self.arms, harms=3, leak=0 ) @@ -121,7 +121,7 @@ def test_plot_string(self): f"SFDR = {all_stats['sfdr']['dBFS']} dBFS" in plt_str, msg=msg_txt ) self.assertTrue( - f"Noise Floor = {all_stats['noise']['dBHz']} dBFS/Hz" in plt_str, + f"Noise Floor = {all_stats['noise']['dBHz']} dBFS" in plt_str, msg=msg_txt, ) self.assertTrue(