Skip to content

Commit 5932478

Browse files
committed
Lint
1 parent 28571b3 commit 5932478

6 files changed

Lines changed: 64 additions & 54 deletions

File tree

adc_eval/eval/calc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Spectral analysis helper module."""
2+
23
import numpy as np
34

45

@@ -148,4 +149,4 @@ def get_plot_string(stats, full_scale, fs, nfft, window, xscale=1e6, fscale="MHz
148149

149150
plt_str += "\n"
150151

151-
return plt_str
152+
return plt_str

adc_eval/eval/spectrum.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ def window_data(data, window="rectangular"):
4646

4747
windows = {
4848
"rectangular": (np.ones(wsize), 1.0),
49-
"hanning": (np.hanning(wsize), 1.633)
49+
"hanning": (np.hanning(wsize), 1.633),
5050
}
51-
51+
5252
if window not in windows:
5353
print(f"WARNING: {window} not implemented. Defaulting to 'rectangular'.")
5454
window = "rectangular"
55-
55+
5656
wscale = windows[window][1]
57-
57+
5858
return data * windows[window][0] * wscale
5959

6060

@@ -73,7 +73,7 @@ def plot_spectrum(
7373
):
7474
"""Plot Power Spectrum for input signal."""
7575
(freq, pwr) = get_spectrum(data, fs=fs, nfft=nfft, single_sided=single_sided)
76-
76+
7777
# Calculate the fullscale range of the spectrum in Watts
7878
full_scale = calc.dBW(dr**2 / 8)
7979

@@ -92,7 +92,7 @@ def plot_spectrum(
9292

9393
# Convert to dBW and perform scalar based on y-axis scaling input
9494
psd_out = calc.dBW(pwr, places=3) - scalar
95-
95+
9696
# Use Watts if magnitude y-axis scaling is desired
9797
if lut_key in ["magnitude"]:
9898
psd_out = pwr
@@ -104,7 +104,9 @@ def plot_spectrum(
104104
# Get single-sided spectrum for SNDR and Harmonic stats
105105
(f_ss, psd_ss) = get_spectrum(data, fs=fs, nfft=nfft, single_sided=True)
106106

107-
sndr_stats = calc.sndr_sfdr(psd_ss, f_ss, fs, nfft, leak=leak, full_scale=full_scale)
107+
sndr_stats = calc.sndr_sfdr(
108+
psd_ss, f_ss, fs, nfft, leak=leak, full_scale=full_scale
109+
)
108110
harm_stats = calc.find_harmonics(
109111
psd_ss,
110112
f_ss,
@@ -124,7 +126,9 @@ def plot_spectrum(
124126

125127
# If plotting, prep plot and generate all required axis strings
126128
if not no_plot:
127-
plt_str = calc.get_plot_string(stats, full_scale, fs, nfft, window, xscale, fscale[0])
129+
plt_str = calc.get_plot_string(
130+
stats, full_scale, fs, nfft, window, xscale, fscale[0]
131+
)
128132
fig, ax = plt.subplots(figsize=(15, 8))
129133
ax.plot(freq / xscale, psd_out)
130134
ax.set_ylabel(f"Power Spectrum ({yunits})", fontsize=18)
@@ -219,10 +223,10 @@ def analyze(
219223
if fscale not in fscalar:
220224
print(f"WARNING: {fscale} not implemented. Defaulting to 'MHz'.")
221225
fscale = "MHz"
222-
226+
223227
# Window the data
224228
wdata = window_data(data, window=window)
225-
229+
226230
(freq, spectrum, stats) = plot_spectrum(
227231
wdata,
228232
fs=fs,
@@ -237,4 +241,4 @@ def analyze(
237241
fscale=(fscale, fscalar[fscale]),
238242
)
239243

240-
return (freq, spectrum, stats)
244+
return (freq, spectrum, stats)

adc_eval/filter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from scipy.signal import remez, freqz
55
import matplotlib.pyplot as plt
66
from adc_eval.eval import spectrum
7+
from adc_eval.eval import calc
78

89

910
class CICDecimate:
@@ -215,7 +216,7 @@ def run(self, xarray):
215216
def response(self, fft, no_plot=False):
216217
"""Plots the frequency response of the pre-decimated filter."""
217218
freq, mag = freqz(self.coeffs, [1], worN=fft, fs=self.fs)
218-
yfft = spectrum.dBW(np.abs(mag))
219+
yfft = calc.dBW(np.abs(mag))
219220
if not no_plot:
220221
fig, ax = plt.subplots(figsize=(15, 8))
221222
ax.plot(freq / 1e6, yfft)

tests/eval/test_calc.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,7 @@ def test_find_harmonics_on_fft_bound(harms, nfft):
139139
nbin = nfft / 8
140140
(freq, pwr) = gen_spectrum(nbin, harms, nfft)
141141

142-
stats = calc.find_harmonics(
143-
pwr, freq, nfft, nbin, AMPLITUDE, harms=harms, leak=0
144-
)
142+
stats = calc.find_harmonics(pwr, freq, nfft, nbin, AMPLITUDE, harms=harms, leak=0)
145143

146144
exp_bin = {
147145
2: 2 * nbin,
@@ -260,4 +258,4 @@ def test_plot_string(harms, nfft):
260258
for n in range(2, harms + 1):
261259
harm_power = round(all_stats["harm"][n]["dB"], 1)
262260
harm_freq = all_stats["harm"][n]["freq"]
263-
assert f"HD{n} = {harm_power} dBFS @ {harm_freq} Hz" in plt_str, msg_txt
261+
assert f"HD{n} = {harm_power} dBFS @ {harm_freq} Hz" in plt_str, msg_txt

tests/eval/test_spectrum.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
for _ in range(10)
2020
]
2121

22+
2223
@mock.patch("adc_eval.eval.spectrum.calc_psd")
2324
def test_get_spectrum(mock_calc_psd):
2425
"""Test that the get_spectrum method returns power spectrum."""
@@ -27,9 +28,11 @@ def test_get_spectrum(mock_calc_psd):
2728
data = np.array([1])
2829
exp_spectrum = np.array([fs / nfft])
2930

30-
mock_calc_psd.return_value = (None, data, None, 2*data)
31+
mock_calc_psd.return_value = (None, data, None, 2 * data)
3132

32-
assert (None, exp_spectrum) == spectrum.get_spectrum(None, fs=fs, nfft=nfft, single_sided=True)
33+
assert (None, exp_spectrum) == spectrum.get_spectrum(
34+
None, fs=fs, nfft=nfft, single_sided=True
35+
)
3336

3437

3538
@mock.patch("adc_eval.eval.spectrum.calc_psd")
@@ -40,9 +43,11 @@ def test_get_spectrum_dual(mock_calc_psd):
4043
data = np.array([1])
4144
exp_spectrum = np.array([fs / nfft])
4245

43-
mock_calc_psd.return_value = (None, data, None, 2*data)
46+
mock_calc_psd.return_value = (None, data, None, 2 * data)
4447

45-
assert (None, 2*exp_spectrum) == spectrum.get_spectrum(None, fs=fs, nfft=nfft, single_sided=False)
48+
assert (None, 2 * exp_spectrum) == spectrum.get_spectrum(
49+
None, fs=fs, nfft=nfft, single_sided=False
50+
)
4651

4752

4853
@pytest.mark.parametrize("data", [np.random.randn(NLEN) for _ in range(10)])
@@ -181,7 +186,7 @@ def test_window_data_as_list():
181186
"""Tests the window_data function when given a list instead of numpy array."""
182187
data = np.random.rand(NLEN).tolist()
183188
wdata = spectrum.window_data(data, window="rectangular")
184-
189+
185190
assert type(data) == type(list())
186191
assert type(wdata) == type(np.ndarray([]))
187192

@@ -191,7 +196,7 @@ def test_window_data_bad_window_type(capfd):
191196
data = np.random.rand(NLEN)
192197
wdata = spectrum.window_data(data, window="foobar")
193198
captured = capfd.readouterr()
194-
199+
195200
assert data.size == wdata.size
196201
assert data.all() == wdata.all()
197202
assert "WARNING" in captured.out
@@ -214,7 +219,7 @@ def test_analyze_valid_input_scalar(mock_plot_spectrum):
214219
"""Tests the valid input scalar keys."""
215220
mock_plot_spectrum.return_value = (None, None, None)
216221
mock_plot_spectrum.side_effect = lambda *args, **kwargs: (kwargs, None, None)
217-
222+
218223
test_vals = {
219224
"Hz": 1,
220225
"kHz": 1e3,
@@ -236,10 +241,10 @@ def test_analyze_no_plot(mock_sndr_sfdr, mock_find_harmonics):
236241
}
237242
data_harms = {"harmonics": 3}
238243
exp_stats = {**data_sndr, **data_harms}
239-
244+
240245
mock_sndr_sfdr.return_value = data_sndr
241246
mock_find_harmonics = data_harms
242-
247+
243248
(freq, psd, stats) = spectrum.analyze(
244249
data,
245250
fs=1,
@@ -253,10 +258,10 @@ def test_analyze_no_plot(mock_sndr_sfdr, mock_find_harmonics):
253258
single_sided=True,
254259
fscale="Hz",
255260
)
256-
257-
assert freq.all() == np.linspace(0, 1, int(NFFT/2)).all()
258-
assert psd.size == int(NFFT/2)
259-
261+
262+
assert freq.all() == np.linspace(0, 1, int(NFFT / 2)).all()
263+
assert psd.size == int(NFFT / 2)
264+
260265
for key, value in stats.items():
261266
assert value == exp_stats[key]
262267

@@ -271,10 +276,10 @@ def test_analyze_no_plot_dual(mock_sndr_sfdr, mock_find_harmonics):
271276
}
272277
data_harms = {"harmonics": 3}
273278
exp_stats = {**data_sndr, **data_harms}
274-
279+
275280
mock_sndr_sfdr.return_value = data_sndr
276281
mock_find_harmonics = data_harms
277-
282+
278283
(freq, psd, stats) = spectrum.analyze(
279284
data,
280285
fs=1,
@@ -288,8 +293,8 @@ def test_analyze_no_plot_dual(mock_sndr_sfdr, mock_find_harmonics):
288293
single_sided=False,
289294
fscale="Hz",
290295
)
291-
292-
assert freq.all() == np.linspace(-0.5, 0.5, NFFT-1).all()
296+
297+
assert freq.all() == np.linspace(-0.5, 0.5, NFFT - 1).all()
293298
assert psd.size == NFFT
294299
for key, value in stats.items():
295300
assert value == exp_stats[key]
@@ -305,10 +310,10 @@ def test_analyze_no_plot_magnitude(mock_sndr_sfdr, mock_find_harmonics):
305310
}
306311
data_harms = {"harmonics": 3}
307312
exp_stats = {**data_sndr, **data_harms}
308-
313+
309314
mock_sndr_sfdr.return_value = data_sndr
310315
mock_find_harmonics = data_harms
311-
316+
312317
(freq, psd, stats) = spectrum.analyze(
313318
data,
314319
fs=1,
@@ -322,8 +327,8 @@ def test_analyze_no_plot_magnitude(mock_sndr_sfdr, mock_find_harmonics):
322327
single_sided=True,
323328
fscale="Hz",
324329
)
325-
326-
assert freq.all() == np.linspace(0, 1, int(NFFT/2)).all()
327-
assert psd.size == int(NFFT/2)
330+
331+
assert freq.all() == np.linspace(0, 1, int(NFFT / 2)).all()
332+
assert psd.size == int(NFFT / 2)
328333
for key, value in stats.items():
329-
assert value == exp_stats[key]
334+
assert value == exp_stats[key]

tests/test_signals.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,30 @@
88

99
RTOL = 0.01
1010

11+
1112
@pytest.mark.parametrize("nlen", np.random.randint(4, 2**16, 3))
1213
@pytest.mark.parametrize("fs", np.random.uniform(1, 1e9, 3))
1314
def test_time(nlen, fs):
1415
"""Test time with random data."""
1516
value = signals.time(nlen, fs=fs)
1617
assert value.size == nlen
1718
assert value[0] == 0
18-
assert np.isclose(value[nlen-1], (nlen-1)/fs, rtol=RTOL)
19-
19+
assert np.isclose(value[nlen - 1], (nlen - 1) / fs, rtol=RTOL)
20+
2021

2122
@pytest.mark.parametrize("nlen", np.random.randint(2**10, 2**16, 3))
2223
@pytest.mark.parametrize("offset", np.random.uniform(-10, 10, 3))
2324
@pytest.mark.parametrize("amp", np.random.uniform(0, 10, 3))
2425
def test_sin(nlen, offset, amp):
2526
"""Test sine generation with random data."""
2627
fs = np.random.uniform(1, 1e9)
27-
fin = np.random.uniform(fs/10, fs/3)
28-
28+
fin = np.random.uniform(fs / 10, fs / 3)
29+
2930
t = signals.time(nlen, fs=fs)
3031
value = signals.sin(t, amp=amp, offset=offset, freq=fin)
31-
32+
3233
exp_peaks = [offset - amp, amp + offset]
33-
34+
3435
assert value.size == nlen
3536
assert np.isclose(max(value), exp_peaks[1], rtol=RTOL)
3637
assert np.isclose(min(value), exp_peaks[0], rtol=RTOL)
@@ -42,10 +43,10 @@ def test_noise_length(nlen):
4243
"""Test noise generation with random data."""
4344
t = signals.time(nlen, fs=1)
4445
value = signals.noise(t, mean=0, std=1)
45-
46+
4647
# Just check correct size
4748
assert value.size == nlen
48-
49+
4950

5051
@pytest.mark.parametrize("std", np.random.uniform(0, 1, 4))
5152
def test_noise_length(std):
@@ -56,14 +57,14 @@ def test_noise_length(std):
5657
autocorr = np.correlate(noise, noise, mode="full")
5758
autocorr /= max(autocorr)
5859
asize = autocorr.size
59-
60+
6061
midlag = autocorr.size // 2
61-
acorr_nopeak = np.concatenate([autocorr[0:midlag-1], autocorr[midlag+1:]])
62-
62+
acorr_nopeak = np.concatenate([autocorr[0 : midlag - 1], autocorr[midlag + 1 :]])
63+
6364
shapiro = stats.shapiro(acorr_nopeak)
64-
65+
6566
# Check that middle lag is 1
6667
assert autocorr[midlag] == 1
67-
68+
6869
# Now check that noise is gaussian
69-
assert shapiro.pvalue < 0.01
70+
assert shapiro.pvalue < 0.01

0 commit comments

Comments
 (0)