44import six
55
66import tempfile
7+ import warnings
78
89from numpy .testing import (assert_allclose , assert_almost_equal ,
910 assert_array_equal )
@@ -359,46 +360,46 @@ def test_csv2rec_names_with_comments(self):
359360 assert len (array .dtype ) == 3
360361
361362 def test_csv2rec_usdate (self ):
362- self .fd .write ('01/11/14\n ' +
363- '03/05/76 12:00:01 AM\n ' +
364- '07/09/83 5:17:34 PM\n ' +
365- '06/20/2054 2:31:45 PM\n ' +
366- '10/31/00 11:50:23 AM\n ' )
363+ self .fd .write ('01/11/14\n '
364+ '03/05/76 12:00:01 AM\n '
365+ '07/09/83 5:17:34 PM\n '
366+ '06/20/2054 2:31:45 PM\n '
367+ '10/31/00 11:50:23 AM\n ' )
367368 expected = [datetime .datetime (2014 , 1 , 11 , 0 , 0 ),
368- datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
369- datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
370- datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
371- datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
369+ datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
370+ datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
371+ datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
372+ datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
372373 self .fd .seek (0 )
373374 array = mlab .csv2rec (self .fd , names = 'a' )
374375 assert_array_equal (array ['a' ].tolist (), expected )
375376
376377 def test_csv2rec_dayfirst (self ):
377378 self .fd .write ('11/01/14\n ' +
378- '05/03/76 12:00:01 AM\n ' +
379- '09/07/83 5:17:34 PM\n ' +
380- '20/06/2054 2:31:45 PM\n ' +
381- '31/10/00 11:50:23 AM\n ' )
379+ '05/03/76 12:00:01 AM\n '
380+ '09/07/83 5:17:34 PM\n '
381+ '20/06/2054 2:31:45 PM\n '
382+ '31/10/00 11:50:23 AM\n ' )
382383 expected = [datetime .datetime (2014 , 1 , 11 , 0 , 0 ),
383- datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
384- datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
385- datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
386- datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
384+ datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
385+ datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
386+ datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
387+ datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
387388 self .fd .seek (0 )
388389 array = mlab .csv2rec (self .fd , names = 'a' , dayfirst = True )
389390 assert_array_equal (array ['a' ].tolist (), expected )
390391
391392 def test_csv2rec_yearfirst (self ):
392- self .fd .write ('14/01/11\n ' +
393- '76/03/05 12:00:01 AM\n ' +
394- '83/07/09 5:17:34 PM\n ' +
395- '2054/06/20 2:31:45 PM\n ' +
396- '00/10/31 11:50:23 AM\n ' )
393+ self .fd .write ('14/01/11\n '
394+ '76/03/05 12:00:01 AM\n '
395+ '83/07/09 5:17:34 PM\n '
396+ '2054/06/20 2:31:45 PM\n '
397+ '00/10/31 11:50:23 AM\n ' )
397398 expected = [datetime .datetime (2014 , 1 , 11 , 0 , 0 ),
398- datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
399- datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
400- datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
401- datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
399+ datetime .datetime (1976 , 3 , 5 , 0 , 0 , 1 ),
400+ datetime .datetime (1983 , 7 , 9 , 17 , 17 , 34 ),
401+ datetime .datetime (2054 , 6 , 20 , 14 , 31 , 45 ),
402+ datetime .datetime (2000 , 10 , 31 , 11 , 50 , 23 )]
402403 self .fd .seek (0 )
403404 array = mlab .csv2rec (self .fd , names = 'a' , yearfirst = True )
404405 assert_array_equal (array ['a' ].tolist (), expected )
@@ -1629,6 +1630,18 @@ def test_csd(self):
16291630 assert_allclose (fsp , freqs , atol = 1e-06 )
16301631 assert spec .shape == freqs .shape
16311632
1633+ def test_csd_padding (self ):
1634+ """Test zero padding of csd(). """
1635+ if self .NFFT_density is None : # for derived classes
1636+ return
1637+ sargs = dict (x = self .y , y = self .y + 1 , Fs = self .Fs , window = mlab .window_none ,
1638+ sides = self .sides )
1639+
1640+ spec0 , _ = mlab .csd (NFFT = self .NFFT_density , ** sargs )
1641+ spec1 , _ = mlab .csd (NFFT = self .NFFT_density * 2 , ** sargs )
1642+ assert_almost_equal (np .sum (np .conjugate (spec0 )* spec0 ).real ,
1643+ np .sum (np .conjugate (spec1 / 2 )* spec1 / 2 ).real )
1644+
16321645 def test_psd (self ):
16331646 freqs = self .freqs_density
16341647 spec , fsp = mlab .psd (x = self .y ,
@@ -2103,6 +2116,15 @@ def test_specgram_phase(self):
21032116 assert spec .shape [0 ] == freqs .shape [0 ]
21042117 assert spec .shape [1 ] == self .t_specgram .shape [0 ]
21052118
2119+ def test_specgram_warn_only1seg (self ):
2120+ """Warning should be raised if len(x) <= NFFT. """
2121+ with warnings .catch_warnings (record = True ) as w :
2122+ warnings .simplefilter ("always" , category = UserWarning )
2123+ mlab .specgram (x = self .y , NFFT = len (self .y ), Fs = self .Fs )
2124+ assert len (w ) == 1
2125+ assert issubclass (w [0 ].category , UserWarning )
2126+ assert str (w [0 ].message ).startswith ("Only one segment is calculated" )
2127+
21062128 def test_psd_csd_equal (self ):
21072129 freqs = self .freqs_density
21082130 Pxx , freqsxx = mlab .psd (x = self .y ,
@@ -2543,7 +2565,7 @@ class Test_spectral_nosig_real_onesided_trim(
25432565 Test_spectral_nosig_real_onesided ):
25442566 def setUp (self ):
25452567 self .createStim (fstims = [],
2546- len_x = 256 ,
2568+ len_x = 1024 ,
25472569 NFFT_density = 512 , pad_to_spectrum = 128 ,
25482570 iscomplex = False , sides = 'onesided' , nsides = 1 )
25492571
@@ -2552,7 +2574,7 @@ class Test_spectral_nosig_real_twosided_trim(
25522574 Test_spectral_nosig_real_onesided ):
25532575 def setUp (self ):
25542576 self .createStim (fstims = [],
2555- len_x = 256 ,
2577+ len_x = 1024 ,
25562578 NFFT_density = 512 , pad_to_spectrum = 128 ,
25572579 iscomplex = False , sides = 'twosided' , nsides = 2 )
25582580
@@ -2561,7 +2583,7 @@ class Test_spectral_nosig_real_defaultsided_trim(
25612583 Test_spectral_nosig_real_onesided ):
25622584 def setUp (self ):
25632585 self .createStim (fstims = [],
2564- len_x = 256 ,
2586+ len_x = 1024 ,
25652587 NFFT_density = 512 , pad_to_spectrum = 128 ,
25662588 iscomplex = False , sides = 'default' , nsides = 1 )
25672589
@@ -2570,7 +2592,7 @@ class Test_spectral_nosig_complex_onesided_trim(
25702592 Test_spectral_nosig_real_onesided ):
25712593 def setUp (self ):
25722594 self .createStim (fstims = [],
2573- len_x = 256 ,
2595+ len_x = 1024 ,
25742596 NFFT_density = 512 , pad_to_spectrum = 128 ,
25752597 iscomplex = True , sides = 'onesided' , nsides = 1 )
25762598
@@ -2579,7 +2601,7 @@ class Test_spectral_nosig_complex_twosided_trim(
25792601 Test_spectral_nosig_real_onesided ):
25802602 def setUp (self ):
25812603 self .createStim (fstims = [],
2582- len_x = 256 ,
2604+ len_x = 1024 ,
25832605 NFFT_density = 512 , pad_to_spectrum = 128 ,
25842606 iscomplex = True , sides = 'twosided' , nsides = 2 )
25852607
@@ -2705,7 +2727,7 @@ class Test_spectral_nosig_real_onesided_stretch(
27052727 Test_spectral_nosig_real_onesided ):
27062728 def setUp (self ):
27072729 self .createStim (fstims = [],
2708- len_x = 128 ,
2730+ len_x = 256 ,
27092731 NFFT_density = 128 ,
27102732 pad_to_density = 256 , pad_to_spectrum = 256 ,
27112733 iscomplex = False , sides = 'onesided' , nsides = 1 )
@@ -2715,7 +2737,7 @@ class Test_spectral_nosig_real_twosided_stretch(
27152737 Test_spectral_nosig_real_onesided ):
27162738 def setUp (self ):
27172739 self .createStim (fstims = [],
2718- len_x = 128 ,
2740+ len_x = 256 ,
27192741 NFFT_density = 128 ,
27202742 pad_to_density = 256 , pad_to_spectrum = 256 ,
27212743 iscomplex = False , sides = 'twosided' , nsides = 2 )
@@ -2725,7 +2747,7 @@ class Test_spectral_nosig_real_defaultsided_stretch(
27252747 Test_spectral_nosig_real_onesided ):
27262748 def setUp (self ):
27272749 self .createStim (fstims = [],
2728- len_x = 128 ,
2750+ len_x = 256 ,
27292751 NFFT_density = 128 ,
27302752 pad_to_density = 256 , pad_to_spectrum = 256 ,
27312753 iscomplex = False , sides = 'default' , nsides = 1 )
@@ -2735,7 +2757,7 @@ class Test_spectral_nosig_complex_onesided_stretch(
27352757 Test_spectral_nosig_real_onesided ):
27362758 def setUp (self ):
27372759 self .createStim (fstims = [],
2738- len_x = 128 ,
2760+ len_x = 256 ,
27392761 NFFT_density = 128 ,
27402762 pad_to_density = 256 , pad_to_spectrum = 256 ,
27412763 iscomplex = True , sides = 'onesided' , nsides = 1 )
@@ -2745,7 +2767,7 @@ class Test_spectral_nosig_complex_twosided_stretch(
27452767 Test_spectral_nosig_real_onesided ):
27462768 def setUp (self ):
27472769 self .createStim (fstims = [],
2748- len_x = 128 ,
2770+ len_x = 256 ,
27492771 NFFT_density = 128 ,
27502772 pad_to_density = 256 , pad_to_spectrum = 256 ,
27512773 iscomplex = True , sides = 'twosided' , nsides = 2 )
@@ -2755,7 +2777,7 @@ class Test_spectral_nosig_complex_defaultsided_stretch(
27552777 Test_spectral_nosig_real_onesided ):
27562778 def setUp (self ):
27572779 self .createStim (fstims = [],
2758- len_x = 128 ,
2780+ len_x = 256 ,
27592781 NFFT_density = 128 ,
27602782 pad_to_density = 256 , pad_to_spectrum = 256 ,
27612783 iscomplex = True , sides = 'default' , nsides = 2 )
@@ -3102,3 +3124,16 @@ def test_psd_onesided_norm():
31023124 sides = 'onesided' )
31033125 Su_1side = np .append ([Su [0 ]], Su [1 :4 ] + Su [4 :][::- 1 ])
31043126 assert_allclose (P , Su_1side , atol = 1e-06 )
3127+
3128+
3129+ def test_psd_oversampling ():
3130+ """Test the case len(x) < NFFT for psd(). """
3131+ u = np .array ([0 , 1 , 2 , 3 , 1 , 2 , 1 ])
3132+ dt = 1.0
3133+ Su = np .abs (np .fft .fft (u ) * dt )** 2 / float (dt * u .size )
3134+ P , f = mlab .psd (u , NFFT = u .size * 2 , Fs = 1 / dt , window = mlab .window_none ,
3135+ detrend = mlab .detrend_none , noverlap = 0 , pad_to = None ,
3136+ scale_by_freq = None ,
3137+ sides = 'onesided' )
3138+ Su_1side = np .append ([Su [0 ]], Su [1 :4 ] + Su [4 :][::- 1 ])
3139+ assert_almost_equal (np .sum (P ), np .sum (Su_1side )) # same energy
0 commit comments