Skip to content

Instantly share code, notes, and snippets.

@bmcfee
Created January 22, 2015 16:50
Show Gist options
  • Save bmcfee/3ee8c1820a0cb246a803 to your computer and use it in GitHub Desktop.
Save bmcfee/3ee8c1820a0cb246a803 to your computer and use it in GitHub Desktop.
wrap window functions to handle fractional length
def window_wrapper(window_function):
def _wrap(n, *args, **kwargs):
n_min, n_max = int(np.floor(n)), int(np.ceil(n))
window = window_function(n, *args, **kwargs)
if len(window) < n_max:
window = np.pad(window, [(0, n_max - len(window))], mode='constant')
window[n_min:] = 0.0
return window
return _wrap
@bmcfee
Copy link
Author

bmcfee commented Jan 22, 2015

Here's how it behaves on (most of) the scipy.signal.windows suite:

for window in scipy.signal.windows.__all__[:-1]:
    try:
        for n in [4, 4.5, 5, 5.0, 5.1]:
            wf = getattr(scipy.signal.windows, window)
            raw = wf(n)
            pad = window_wrapper(wf)(n)
            print '{:>20s}({:.2f}) = {:>80s} | {:d}'.format(window, n, raw, len(raw))
            print '{:>20s}({:.2f}) = {:>80s} | {:d}'.format('wrap({:s})'.format(window), n, pad, len(pad))
            print
    except Exception as e:
        print 'FAIL {:>20s} | {:s}'.format(window, e)
        print

Output:

              boxcar(4.00) =                                                                [ 1.  1.  1.  1.] | 4
        wrap(boxcar)(4.00) =                                                                [ 1.  1.  1.  1.] | 4

              boxcar(4.50) =                                                                [ 1.  1.  1.  1.] | 4
        wrap(boxcar)(4.50) =                                                            [ 1.  1.  1.  1.  0.] | 5

              boxcar(5.00) =                                                            [ 1.  1.  1.  1.  1.] | 5
        wrap(boxcar)(5.00) =                                                            [ 1.  1.  1.  1.  1.] | 5

              boxcar(5.00) =                                                            [ 1.  1.  1.  1.  1.] | 5
        wrap(boxcar)(5.00) =                                                            [ 1.  1.  1.  1.  1.] | 5

              boxcar(5.10) =                                                            [ 1.  1.  1.  1.  1.] | 5
        wrap(boxcar)(5.10) =                                                        [ 1.  1.  1.  1.  1.  0.] | 6

              triang(4.00) =                                                        [ 0.25  0.75  0.75  0.25] | 4
        wrap(triang)(4.00) =                                                        [ 0.25  0.75  0.75  0.25] | 4

              triang(4.50) =                                                           [ 0.364  0.727  0.364] | 3
        wrap(triang)(4.50) =                                             [ 0.364  0.727  0.364  0.     0.   ] | 5

              triang(5.00) =                                             [ 0.333  0.667  1.     0.667  0.333] | 5
        wrap(triang)(5.00) =                                             [ 0.333  0.667  1.     0.667  0.333] | 5

              triang(5.00) =                                             [ 0.333  0.667  1.     0.667  0.333] | 5
        wrap(triang)(5.00) =                                             [ 0.333  0.667  1.     0.667  0.333] | 5

              triang(5.10) =                                             [ 0.328  0.656  0.984  0.656  0.328] | 5
        wrap(triang)(5.10) =                                      [ 0.328  0.656  0.984  0.656  0.328  0.   ] | 6

              parzen(4.00) =                                                    [ 0.031  0.719  0.719  0.031] | 4
        wrap(parzen)(4.00) =                                                    [ 0.031  0.719  0.719  0.031] | 4

              parzen(4.50) =                                                    [ 0.022  0.556  0.934  0.022] | 4
        wrap(parzen)(4.50) =                                             [ 0.022  0.556  0.934  0.022  0.   ] | 5

              parzen(5.00) =                                             [ 0.016  0.424  1.     0.424  0.016] | 5
        wrap(parzen)(5.00) =                                             [ 0.016  0.424  1.     0.424  0.016] | 5

              parzen(5.00) =                                             [ 0.016  0.424  1.     0.424  0.016] | 5
        wrap(parzen)(5.00) =                                             [ 0.016  0.424  1.     0.424  0.016] | 5

              parzen(5.10) =                                      [ 0.015  0.407  0.998  0.477  0.407  0.015] | 6
        wrap(parzen)(5.10) =                                      [ 0.015  0.407  0.998  0.477  0.407  0.   ] | 6

              bohman(4.00) =                                                    [ 0.     0.609  0.609  0.   ] | 4
        wrap(bohman)(4.00) =                                                    [ 0.     0.609  0.609  0.   ] | 4

              bohman(4.50) =                                                    [ 0.     0.609  0.609  0.   ] | 4
        wrap(bohman)(4.50) =                                             [ 0.     0.609  0.609  0.     0.   ] | 5

              bohman(5.00) =                                             [ 0.     0.318  1.     0.318  0.   ] | 5
        wrap(bohman)(5.00) =                                             [ 0.     0.318  1.     0.318  0.   ] | 5

              bohman(5.00) =                                             [ 0.     0.318  1.     0.318  0.   ] | 5
        wrap(bohman)(5.00) =                                             [ 0.     0.318  1.     0.318  0.   ] | 5

              bohman(5.10) =                                             [ 0.     0.318  1.     0.318  0.   ] | 5
        wrap(bohman)(5.10) =                                      [ 0.     0.318  1.     0.318  0.     0.   ] | 6

            blackman(4.00) =                                [ -1.388e-17   6.300e-01   6.300e-01  -1.388e-17] | 4
      wrap(blackman)(4.00) =                                [ -1.388e-17   6.300e-01   6.300e-01  -1.388e-17] | 4

            blackman(4.50) =                    [ -1.388e-17   4.592e-01   9.204e-01   9.045e-02   9.045e-02] | 5
      wrap(blackman)(4.50) =                    [ -1.388e-17   4.592e-01   9.204e-01   9.045e-02   0.000e+00] | 5

            blackman(5.00) =                    [ -1.388e-17   3.400e-01   1.000e+00   3.400e-01  -1.388e-17] | 5
      wrap(blackman)(5.00) =                    [ -1.388e-17   3.400e-01   1.000e+00   3.400e-01  -1.388e-17] | 5

            blackman(5.00) =                    [ -1.388e-17   3.400e-01   1.000e+00   3.400e-01  -1.388e-17] | 5
      wrap(blackman)(5.00) =                    [ -1.388e-17   3.400e-01   1.000e+00   3.400e-01  -1.388e-17] | 5

            blackman(5.10) =        [ -1.388e-17   3.211e-01   9.976e-01   3.994e-01   2.131e-03   2.506e-01] | 6
      wrap(blackman)(5.10) =        [ -1.388e-17   3.211e-01   9.976e-01   3.994e-01   2.131e-03   0.000e+00] | 6

             nuttall(4.00) =                                [  3.628e-04   5.292e-01   5.292e-01   3.628e-04] | 4
       wrap(nuttall)(4.00) =                                [  3.628e-04   5.292e-01   5.292e-01   3.628e-04] | 4

             nuttall(4.50) =                    [  3.628e-04   3.427e-01   8.919e-01   3.778e-02   3.778e-02] | 5
       wrap(nuttall)(4.50) =                    [  3.628e-04   3.427e-01   8.919e-01   3.778e-02   0.000e+00] | 5

             nuttall(5.00) =                    [  3.628e-04   2.270e-01   1.000e+00   2.270e-01   3.628e-04] | 5
       wrap(nuttall)(5.00) =                    [  3.628e-04   2.270e-01   1.000e+00   2.270e-01   3.628e-04] | 5

             nuttall(5.00) =                    [  3.628e-04   2.270e-01   1.000e+00   2.270e-01   3.628e-04] | 5
       wrap(nuttall)(5.00) =                    [  3.628e-04   2.270e-01   1.000e+00   2.270e-01   3.628e-04] | 5

             nuttall(5.10) =        [  3.628e-04   2.099e-01   9.967e-01   2.831e-01   8.346e-04   1.495e-01] | 6
       wrap(nuttall)(5.10) =        [  3.628e-04   2.099e-01   9.967e-01   2.831e-01   8.346e-04   0.000e+00] | 6

      blackmanharris(4.00) =                                [  6.000e-05   5.206e-01   5.206e-01   6.000e-05] | 4
wrap(blackmanharris)(4.00) =                                [  6.000e-05   5.206e-01   5.206e-01   6.000e-05] | 4

      blackmanharris(4.50) =                    [  6.000e-05   3.328e-01   8.894e-01   3.339e-02   3.339e-02] | 5
wrap(blackmanharris)(4.50) =                    [  6.000e-05   3.328e-01   8.894e-01   3.339e-02   0.000e+00] | 5

      blackmanharris(5.00) =                    [  6.000e-05   2.175e-01   1.000e+00   2.175e-01   6.000e-05] | 5
wrap(blackmanharris)(5.00) =                    [  6.000e-05   2.175e-01   1.000e+00   2.175e-01   6.000e-05] | 5

      blackmanharris(5.00) =                    [  6.000e-05   2.175e-01   1.000e+00   2.175e-01   6.000e-05] | 5
wrap(blackmanharris)(5.00) =                    [  6.000e-05   2.175e-01   1.000e+00   2.175e-01   6.000e-05] | 5

      blackmanharris(5.10) =        [  6.000e-05   2.005e-01   9.966e-01   2.732e-01   4.112e-04   1.411e-01] | 6
wrap(blackmanharris)(5.10) =        [  6.000e-05   2.005e-01   9.966e-01   2.732e-01   4.112e-04   0.000e+00] | 6

             flattop(4.00) =                                                    [ 0.001  0.197  0.198  0.001] | 4
       wrap(flattop)(4.00) =                                                    [ 0.001  0.197  0.198  0.001] | 4

             flattop(4.50) =                                             [ 0.001  0.01   0.781 -0.037 -0.037] | 5
       wrap(flattop)(4.50) =                                             [ 0.001  0.01   0.781 -0.037  0.   ] | 5

             flattop(5.00) =                    [  1.000e-03  -5.560e-02   1.000e+00  -5.560e-02   1.000e-03] | 5
       wrap(flattop)(5.00) =                    [  1.000e-03  -5.560e-02   1.000e+00  -5.560e-02   1.000e-03] | 5

             flattop(5.00) =                    [  1.000e-03  -5.560e-02   1.000e+00  -5.560e-02   1.000e-03] | 5
       wrap(flattop)(5.00) =                    [  1.000e-03  -5.560e-02   1.000e+00  -5.560e-02   1.000e-03] | 5

             flattop(5.10) =        [  1.000e-03  -6.121e-02   9.932e-01  -2.955e-02   3.392e-04  -7.113e-02] | 6
       wrap(flattop)(5.10) =        [  1.000e-03  -6.121e-02   9.932e-01  -2.955e-02   3.392e-04   0.000e+00] | 6

            bartlett(4.00) =                                                    [ 0.     0.667  0.667  0.   ] | 4
      wrap(bartlett)(4.00) =                                                    [ 0.     0.667  0.667  0.   ] | 4

            bartlett(4.50) =                                             [ 0.     0.571  0.857  0.286 -0.286] | 5
      wrap(bartlett)(4.50) =                                             [ 0.     0.571  0.857  0.286  0.   ] | 5

            bartlett(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
      wrap(bartlett)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

            bartlett(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
      wrap(bartlett)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

            bartlett(5.10) =                                      [ 0.     0.488  0.976  0.537  0.049 -0.439] | 6
      wrap(bartlett)(5.10) =                                      [ 0.     0.488  0.976  0.537  0.049  0.   ] | 6

             hanning(4.00) =                                                        [ 0.    0.75  0.75  0.  ] | 4
       wrap(hanning)(4.00) =                                                        [ 0.    0.75  0.75  0.  ] | 4

             hanning(4.50) =                                             [ 0.     0.611  0.95   0.188  0.188] | 5
       wrap(hanning)(4.50) =                                             [ 0.     0.611  0.95   0.188  0.   ] | 5

             hanning(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
       wrap(hanning)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

             hanning(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
       wrap(hanning)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

             hanning(5.10) =                                      [ 0.     0.481  0.999  0.557  0.006  0.405] | 6
       wrap(hanning)(5.10) =                                      [ 0.     0.481  0.999  0.557  0.006  0.   ] | 6

            barthann(4.00) =                                                        [ 0.    0.73  0.73  0.  ] | 4
      wrap(barthann)(4.00) =                                                        [ 0.    0.73  0.73  0.  ] | 4

            barthann(4.50) =                                             [ 0.     0.602  0.928  0.212  0.075] | 5
      wrap(barthann)(4.50) =                                             [ 0.     0.602  0.928  0.212  0.   ] | 5

            barthann(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
      wrap(barthann)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

            barthann(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
      wrap(barthann)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

            barthann(5.10) =                                      [ 0.     0.483  0.993  0.552  0.016  0.202] | 6
      wrap(barthann)(5.10) =                                      [ 0.     0.483  0.993  0.552  0.016  0.   ] | 6

             hamming(4.00) =                                                        [ 0.08  0.77  0.77  0.08] | 4
       wrap(hamming)(4.00) =                                                        [ 0.08  0.77  0.77  0.08] | 4

             hamming(4.50) =                                             [ 0.08   0.642  0.954  0.253  0.253] | 5
       wrap(hamming)(4.50) =                                             [ 0.08   0.642  0.954  0.253  0.   ] | 5

             hamming(5.00) =                                                  [ 0.08  0.54  1.    0.54  0.08] | 5
       wrap(hamming)(5.00) =                                                  [ 0.08  0.54  1.    0.54  0.08] | 5

             hamming(5.00) =                                                  [ 0.08  0.54  1.    0.54  0.08] | 5
       wrap(hamming)(5.00) =                                                  [ 0.08  0.54  1.    0.54  0.08] | 5

             hamming(5.10) =                                      [ 0.08   0.522  0.999  0.593  0.085  0.452] | 6
       wrap(hamming)(5.10) =                                      [ 0.08   0.522  0.999  0.593  0.085  0.   ] | 6

FAIL               kaiser | kaiser() takes at least 2 arguments (1 given)

FAIL             gaussian | gaussian() takes at least 2 arguments (1 given)

FAIL     general_gaussian | general_gaussian() takes at least 3 arguments (1 given)

FAIL              chebwin | chebwin() takes at least 2 arguments (1 given)

FAIL              slepian | slepian() takes at least 2 arguments (1 given)

              cosine(4.00) =                                                    [ 0.383  0.924  0.924  0.383] | 4
        wrap(cosine)(4.00) =                                                    [ 0.383  0.924  0.924  0.383] | 4

              cosine(4.50) =                    [  3.420e-01   8.660e-01   9.848e-01   6.428e-01   1.225e-16] | 5
        wrap(cosine)(4.50) =                                             [ 0.342  0.866  0.985  0.643  0.   ] | 5

              cosine(5.00) =                                             [ 0.309  0.809  1.     0.809  0.309] | 5
        wrap(cosine)(5.00) =                                             [ 0.309  0.809  1.     0.809  0.309] | 5

              cosine(5.00) =                                             [ 0.309  0.809  1.     0.809  0.309] | 5
        wrap(cosine)(5.00) =                                             [ 0.309  0.809  1.     0.809  0.309] | 5

              cosine(5.10) =                                      [ 0.303  0.798  1.     0.834  0.361 -0.244] | 6
        wrap(cosine)(5.10) =                                      [ 0.303  0.798  1.     0.834  0.361  0.   ] | 6

                hann(4.00) =                                                        [ 0.    0.75  0.75  0.  ] | 4
          wrap(hann)(4.00) =                                                        [ 0.    0.75  0.75  0.  ] | 4

                hann(4.50) =                                             [ 0.     0.611  0.95   0.188  0.188] | 5
          wrap(hann)(4.50) =                                             [ 0.     0.611  0.95   0.188  0.   ] | 5

                hann(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
          wrap(hann)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

                hann(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5
          wrap(hann)(5.00) =                                                       [ 0.   0.5  1.   0.5  0. ] | 5

                hann(5.10) =                                      [ 0.     0.481  0.999  0.557  0.006  0.405] | 6
          wrap(hann)(5.10) =                                      [ 0.     0.481  0.999  0.557  0.006  0.   ] | 6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment