Skip to content

Commit cb15853

Browse files
committed
Added some more tests for the spectrum module
1 parent c2f8ea7 commit cb15853

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

tests/test_spectrum_plotting.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
"""Test the spectrum plotting functions."""
2+
3+
import unittest
4+
import numpy as np
5+
from unittest import mock
6+
from adc_eval import spectrum
7+
8+
9+
class TestSpectrumPlotting(unittest.TestCase):
10+
"""Test the spectrum module."""
11+
12+
def setUp(self):
13+
"""Initialize tests."""
14+
self.nlen = 2**16
15+
self.nfft = 2**12
16+
self.fs = 1
17+
self.bin = 13
18+
self.arms = 0.5 / np.sqrt(2)
19+
self.fin = self.fs / self.nfft * self.bin
20+
21+
def gen_spectrum(self, harmonics):
22+
"""Generate a wave with arbitrary harmonics."""
23+
t = 1 / self.fs * np.linspace(0, self.nlen - 1, self.nlen)
24+
vin = np.zeros(len(t))
25+
for i in range(1, harmonics + 1):
26+
vin += np.sqrt(2) * self.arms / i * np.sin(2 * np.pi * i * self.fin * t)
27+
28+
return spectrum.get_spectrum(vin, fs=self.fs, nfft=self.nfft)
29+
30+
def test_find_harmonics(self):
31+
"""Test the find harmonics method."""
32+
for i in range(2, 10):
33+
(freq, pwr) = self.gen_spectrum(10)
34+
35+
stats = spectrum.find_harmonics(
36+
pwr, freq, self.nfft, self.bin, self.arms, harms=i, leak=0
37+
)
38+
39+
for x in range(2, i + 1):
40+
msg_txt = f"harm={i}, index={x}"
41+
self.assertEqual(stats["harm"][x]["bin"], x * self.bin, msg=msg_txt)
42+
self.assertEqual(
43+
round(stats["harm"][x]["power"], 4),
44+
round((self.arms / x) ** 2, 4),
45+
msg=msg_txt,
46+
)
47+
self.assertEqual(
48+
stats["harm"][x]["freq"],
49+
round(freq[x * self.bin] / 1e6, 1),
50+
msg=msg_txt,
51+
)
52+
53+
def test_find_harmonics_with_leakage(self):
54+
"""Test the find harmonics method with spectral leakage."""
55+
self.bin = 13.5
56+
leakage_bins = 5
57+
for i in range(2, 10):
58+
(freq, pwr) = self.gen_spectrum(10)
59+
60+
stats = spectrum.find_harmonics(
61+
pwr, freq, self.nfft, self.bin, self.arms, harms=i, leak=leakage_bins
62+
)
63+
64+
for x in range(2, i + 1):
65+
msg_txt = f"harm={i}, index={x}"
66+
self.assertTrue(
67+
x * self.bin - leakage_bins
68+
<= stats["harm"][x]["bin"]
69+
<= x * self.bin + leakage_bins,
70+
msg=msg_txt,
71+
)
72+
73+
def test_plot_string(self):
74+
"""Test proper return of plotting string."""
75+
self.bin = 13
76+
(freq, pwr) = self.gen_spectrum(3)
77+
stats = spectrum.sndr_sfdr(pwr, freq, self.nfft, leak=0, full_scale=0)
78+
harms = spectrum.find_harmonics(
79+
pwr, freq, self.nfft, self.bin, self.arms, harms=3, leak=0
80+
)
81+
all_stats = {**stats, **harms}
82+
83+
plt_str = spectrum.get_plot_string(
84+
all_stats, 0, self.fs, self.nfft, window="rectangular"
85+
)
86+
87+
# Check for important information, not everything
88+
msg_txt = f"{all_stats}\n{plt_str}"
89+
self.assertTrue(f"NFFT = {self.nfft}" in plt_str, msg=msg_txt)
90+
self.assertTrue(
91+
f"ENOB = {all_stats['enob']['bits']} bits" in plt_str, msg=msg_txt
92+
)
93+
self.assertTrue(
94+
f"SNDR = {all_stats['sndr']['dBFS']} dBFS" in plt_str, msg=msg_txt
95+
)
96+
self.assertTrue(
97+
f"SFDR = {all_stats['sfdr']['dBFS']} dBFS" in plt_str, msg=msg_txt
98+
)
99+
self.assertTrue(
100+
f"Noise Floor = {all_stats['noise']['dBHz']} dBFS/Hz" in plt_str,
101+
msg=msg_txt,
102+
)
103+
self.assertTrue(
104+
f"HD2 = {round(all_stats['harm'][2]['dB'], 1)} dBFS @ {all_stats['harm'][2]['freq']} MHz"
105+
in plt_str,
106+
msg=msg_txt,
107+
)
108+
self.assertTrue(
109+
f"HD3 = {round(all_stats['harm'][3]['dB'], 1)} dBFS @ {all_stats['harm'][3]['freq']} MHz"
110+
in plt_str,
111+
msg=msg_txt,
112+
)

0 commit comments

Comments
 (0)