88
99RTOL = 0.05
1010NLEN = 2 ** 18
11- NFFT = 2 ** 8
11+ NFFT = 2 ** 10
1212DATA_SINE = [
1313 {
1414 "f1" : np .random .randint (1 , NFFT / 4 - 1 ),
@@ -175,3 +175,155 @@ def test_calc_psd_two_sine_single(data):
175175
176176 assert np .allclose (peak2 , exp_peaks [1 ], rtol = RTOL ), assertmsg
177177 assert np .allclose (fpeak , exp_f2 ), assertmsg
178+
179+
180+ def test_window_data_as_list ():
181+ """Tests the window_data function when given a list instead of numpy array."""
182+ data = np .random .rand (NLEN ).tolist ()
183+ wdata = spectrum .window_data (data , window = "rectangular" )
184+
185+ assert type (data ) == type (list ())
186+ assert type (wdata ) == type (np .ndarray ([]))
187+
188+
189+ def test_window_data_bad_window_type (capfd ):
190+ """Tests the window_data function with an incorrect window selection."""
191+ data = np .random .rand (NLEN )
192+ wdata = spectrum .window_data (data , window = "foobar" )
193+ captured = capfd .readouterr ()
194+
195+ assert data .size == wdata .size
196+ assert data .all () == wdata .all ()
197+ assert "WARNING" in captured .out
198+
199+
200+ @mock .patch ("adc_eval.eval.spectrum.plot_spectrum" )
201+ def test_analyze_bad_input_scalar (mock_plot_spectrum , capfd ):
202+ """Tests bad input scalar keys."""
203+ mock_plot_spectrum .return_value = (None , None , None )
204+ mock_plot_spectrum .side_effect = lambda * args , ** kwargs : (kwargs , None , None )
205+ (kwargs , _ , _ ) = spectrum .analyze ([0 ], 1 , fscale = "foobar" )
206+ captured = capfd .readouterr ()
207+
208+ assert "WARNING" in captured .out
209+ assert kwargs .get ("fscale" ) == ("MHz" , 1e6 )
210+
211+
212+ @mock .patch ("adc_eval.eval.spectrum.plot_spectrum" )
213+ def test_analyze_valid_input_scalar (mock_plot_spectrum ):
214+ """Tests the valid input scalar keys."""
215+ mock_plot_spectrum .return_value = (None , None , None )
216+ mock_plot_spectrum .side_effect = lambda * args , ** kwargs : (kwargs , None , None )
217+
218+ test_vals = {
219+ "Hz" : 1 ,
220+ "kHz" : 1e3 ,
221+ "MHz" : 1e6 ,
222+ "GHz" : 1e9 ,
223+ }
224+ for key , val in test_vals .items ():
225+ (kwargs , _ , _ ) = spectrum .analyze ([0 ], 1 , fscale = key )
226+ assert kwargs .get ("fscale" ) == (key , val )
227+
228+
229+ @mock .patch ("adc_eval.eval.calc.sndr_sfdr" )
230+ @mock .patch ("adc_eval.eval.calc.find_harmonics" )
231+ def test_analyze_no_plot (mock_sndr_sfdr , mock_find_harmonics ):
232+ """Tests the psd output of the analyze function with no plotting."""
233+ data = np .random .rand (NLEN )
234+ data_sndr = {
235+ "sig" : {"bin" : 1 , "power" : 2 },
236+ }
237+ data_harms = {"harmonics" : 3 }
238+ exp_stats = {** data_sndr , ** data_harms }
239+
240+ mock_sndr_sfdr .return_value = data_sndr
241+ mock_find_harmonics = data_harms
242+
243+ (freq , psd , stats ) = spectrum .analyze (
244+ data ,
245+ fs = 1 ,
246+ nfft = NFFT ,
247+ dr = 1 ,
248+ harmonics = 0 ,
249+ leak = 0 ,
250+ window = "rectangular" ,
251+ no_plot = True ,
252+ yaxis = "power" ,
253+ single_sided = True ,
254+ fscale = "Hz" ,
255+ )
256+
257+ assert freq .all () == np .linspace (0 , 1 , int (NFFT / 2 )).all ()
258+ assert psd .size == int (NFFT / 2 )
259+
260+ for key , value in stats .items ():
261+ assert value == exp_stats [key ]
262+
263+
264+ @mock .patch ("adc_eval.eval.calc.sndr_sfdr" )
265+ @mock .patch ("adc_eval.eval.calc.find_harmonics" )
266+ def test_analyze_no_plot_dual (mock_sndr_sfdr , mock_find_harmonics ):
267+ """Tests the psd output of the analyze function with no plotting."""
268+ data = np .random .rand (NLEN )
269+ data_sndr = {
270+ "sig" : {"bin" : 1 , "power" : 2 },
271+ }
272+ data_harms = {"harmonics" : 3 }
273+ exp_stats = {** data_sndr , ** data_harms }
274+
275+ mock_sndr_sfdr .return_value = data_sndr
276+ mock_find_harmonics = data_harms
277+
278+ (freq , psd , stats ) = spectrum .analyze (
279+ data ,
280+ fs = 1 ,
281+ nfft = NFFT ,
282+ dr = 1 ,
283+ harmonics = 0 ,
284+ leak = 0 ,
285+ window = "rectangular" ,
286+ no_plot = True ,
287+ yaxis = "power" ,
288+ single_sided = False ,
289+ fscale = "Hz" ,
290+ )
291+
292+ assert freq .all () == np .linspace (- 0.5 , 0.5 , NFFT - 1 ).all ()
293+ assert psd .size == NFFT
294+ for key , value in stats .items ():
295+ assert value == exp_stats [key ]
296+
297+
298+ @mock .patch ("adc_eval.eval.calc.sndr_sfdr" )
299+ @mock .patch ("adc_eval.eval.calc.find_harmonics" )
300+ def test_analyze_no_plot_magnitude (mock_sndr_sfdr , mock_find_harmonics ):
301+ """Tests the psd output of the analyze function with no plotting."""
302+ data = np .random .rand (NLEN )
303+ data_sndr = {
304+ "sig" : {"bin" : 1 , "power" : 2 },
305+ }
306+ data_harms = {"harmonics" : 3 }
307+ exp_stats = {** data_sndr , ** data_harms }
308+
309+ mock_sndr_sfdr .return_value = data_sndr
310+ mock_find_harmonics = data_harms
311+
312+ (freq , psd , stats ) = spectrum .analyze (
313+ data ,
314+ fs = 1 ,
315+ nfft = NFFT ,
316+ dr = 1 ,
317+ harmonics = 0 ,
318+ leak = 0 ,
319+ window = "rectangular" ,
320+ no_plot = True ,
321+ yaxis = "magnitude" ,
322+ single_sided = True ,
323+ fscale = "Hz" ,
324+ )
325+
326+ assert freq .all () == np .linspace (0 , 1 , int (NFFT / 2 )).all ()
327+ assert psd .size == int (NFFT / 2 )
328+ for key , value in stats .items ():
329+ assert value == exp_stats [key ]
0 commit comments