Skip to content

Commit 0d60a48

Browse files
authored
Merge pull request #51 from fronzbot/add-nsd
Add noise spectral density calculation
2 parents 5b7178d + f8dd594 commit 0d60a48

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

adc_eval/spectrum.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ def enob(sndr, places=1):
2323
return round((sndr - 1.76) / 6.02, places)
2424

2525

26-
def sndr_sfdr(spectrum, freq, nfft, leak, full_scale=0):
26+
def sndr_sfdr(spectrum, freq, fs, nfft, leak, full_scale=0):
2727
"""Get SNDR and SFDR."""
2828
# Zero the DC bin
2929
spectrum[0] = 0
3030
bin_sig = np.argmax(spectrum)
3131
psig = sum(spectrum[i] for i in range(bin_sig - leak, bin_sig + leak + 1))
3232
spectrum_n = spectrum
3333
spectrum_n[bin_sig] = 0
34+
fbin = fs / nfft
3435

3536
for i in range(bin_sig - leak, bin_sig + leak + 1):
3637
spectrum_n[i] = 0
@@ -62,7 +63,8 @@ def sndr_sfdr(spectrum, freq, nfft, leak, full_scale=0):
6263
"floor": noise_floor,
6364
"power": noise_power,
6465
"rms": np.sqrt(noise_power),
65-
"dBHz": round(dBW(noise_floor) - full_scale, 1),
66+
"dBHz": round(dBW(noise_floor, 3) - full_scale, 1),
67+
"NSD": round(dBW(noise_floor, 3) - full_scale - 2 * dBW(fbin, 3), 1),
6668
}
6769
stats["sndr"] = {
6870
"dBc": dBW(psig / noise_power),
@@ -177,7 +179,7 @@ def plot_spectrum(
177179

178180
pwr_dB = 10 * np.log10(pwr) - scalar
179181

180-
sndr_stats = sndr_sfdr(pwr, freq, nfft, leak=leak, full_scale=full_scale)
182+
sndr_stats = sndr_sfdr(pwr, freq, fs, nfft, leak=leak, full_scale=full_scale)
181183
harm_stats = find_harmonics(
182184
pwr,
183185
freq,
@@ -259,7 +261,8 @@ def get_plot_string(stats, full_scale, fs, nfft, window):
259261
plt_str += f"SFDR = {stats['sfdr']['dBFS']} dBFS ({stats['sfdr']['dBc']} dBc)\n"
260262
plt_str += f"Pspur = {stats['spur']['dBFS']} dBFS\n"
261263
plt_str += f"fspur = {round(stats['spur']['freq']/1e6, 2)} MHz\n"
262-
plt_str += f"Noise Floor = {stats['noise']['dBHz']} dBFS/Hz\n"
264+
plt_str += f"Noise Floor = {stats['noise']['dBHz']} dBFS\n"
265+
plt_str += f"NSD = {stats['noise']['NSD']} dBFS\n"
263266
plt_str += "\n"
264267
plt_str += "==== Harmonics ====\n"
265268

tests/test_spectrum.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def test_sndr_sfdr_outputs(self):
6767
freq = np.array([100, 200, 300, 400])
6868
full_scale = -3
6969
nfft = 2**8
70+
fs = 1
7071
exp_return = {
7172
"sig": {
7273
"freq": 300,
@@ -86,7 +87,8 @@ def test_sndr_sfdr_outputs(self):
8687
"floor": 18 / nfft,
8788
"power": 9,
8889
"rms": 3,
89-
"dBHz": round(-11.5297 - full_scale, 1),
90+
"dBHz": round(-11.529675 - full_scale, 1),
91+
"NSD": round(36.6351 - full_scale, 1),
9092
},
9193
"sndr": {
9294
"dBc": 10.0,
@@ -101,6 +103,6 @@ def test_sndr_sfdr_outputs(self):
101103
},
102104
}
103105

104-
result = spectrum.sndr_sfdr(data, freq, nfft, 0, full_scale=full_scale)
106+
result = spectrum.sndr_sfdr(data, freq, fs, nfft, 0, full_scale=full_scale)
105107
for key, val in exp_return.items():
106108
self.assertDictEqual(result[key], val, msg=key)

tests/test_spectrum_plotting.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def test_plot_string(self):
9898
"""Test proper return of plotting string."""
9999
self.bin = 13
100100
(freq, pwr) = self.gen_spectrum(3)
101-
stats = spectrum.sndr_sfdr(pwr, freq, self.nfft, leak=0, full_scale=0)
101+
stats = spectrum.sndr_sfdr(pwr, freq, 1, self.nfft, leak=0, full_scale=0)
102102
harms = spectrum.find_harmonics(
103103
pwr, freq, self.nfft, self.bin, self.arms, harms=3, leak=0
104104
)
@@ -121,7 +121,7 @@ def test_plot_string(self):
121121
f"SFDR = {all_stats['sfdr']['dBFS']} dBFS" in plt_str, msg=msg_txt
122122
)
123123
self.assertTrue(
124-
f"Noise Floor = {all_stats['noise']['dBHz']} dBFS/Hz" in plt_str,
124+
f"Noise Floor = {all_stats['noise']['dBHz']} dBFS" in plt_str,
125125
msg=msg_txt,
126126
)
127127
self.assertTrue(

0 commit comments

Comments
 (0)