[SciPy-dev] Is this a bugfix for scipy.hilbert?

Ariel Rokem arokem at berkeley.edu
Thu Jan 14 22:24:39 EST 2010


Hi everyone,

I have been trying to use scipy.signal.hilbert and I got the following
puzzling result:

In [22]: import scipy

In [23]: scipy.__version__ #I have r6182
Out[23]: '0.8.0.dev'

In [24]: import scipy.signal as signal

In [25]: a = np.random.rand(100,100)

In [26]: np.abs(signal.hilbert(a[-1]))
Out[26]:
array([ 0.57567681,  0.25918624,  0.50207097,  0.51834052,  0.24293389,
        0.5779464 ,  0.6515758 ,  0.89973173,  1.00275444,  0.37352935,
        0.62332717,  0.93599749,  0.40651376,  0.65088756,  0.8332281 ,
        0.5770101 ,  0.9288512 ,  0.46671906,  0.41536055,  0.71418068,
        0.81250913,  0.07652627,  0.72939072,  0.26755626,  0.36396146,
        0.59725999,  1.02264694,  0.41227986,  0.98122853,  0.71906675,
        0.58582611,  0.77288117,  0.3217015 ,  0.65261394,  0.11947618,
        0.75632703,  0.43432935,  0.52182485,  1.0277177 ,  1.01104986,
        0.3023265 ,  0.6024772 ,  0.69257548,  0.55418735,  0.46259052,
        0.25832231,  0.38278355,  0.45508532,  0.26215872,  0.34207947,
        0.80704729,  0.80755477,  0.95317178,  0.97458885,  0.58762294,
        0.82540618,  0.62005585,  0.82494646,  1.04221293,  0.14983027,
        1.01571579,  0.99381328,  0.24158714,  0.84256569,  0.53418924,
        0.24067628,  0.90489883,  1.02217747,  0.34988034,  0.5310065 ,
        0.48135002,  1.03020269,  0.6013679 ,  0.46062485,  0.3918485 ,
        0.21554545,  0.31704519,  0.04868385,  0.1787766 ,  0.37361852,
        0.21977912,  0.7649772 ,  0.77867281,  0.37684278,  0.64432638,
        0.77494951,  0.87106309,  0.77611484,  0.52666801,  0.88683667,
        0.69164967,  0.98618191,  0.84811375,  0.35934198,  0.32650478,
        0.1752677 ,  0.60574454,  0.5109132 ,  0.52332287,  0.99777805])

In [27]: np.abs(signal.hilbert(a))[-1]
Out[27]:
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])


----------------------------------------------------------------------

I was expecting both of these to have the same values - am I missing
something?

I think that the following solves this issue, but now I am not that sure
whether it does what it is supposed to do and I couldn't find a test for
this in test_signaltools.py. Does anyone know of a good test-case for the
analytic signal, that I could create for this?

Index: scipy/signal/signaltools.py
===================================================================
--- scipy/signal/signaltools.py    (revision 6182)
+++ scipy/signal/signaltools.py    (working copy)
@@ -1062,13 +1062,13 @@
     """
     x = asarray(x)
     if N is None:
-        N = len(x)
+        N = x.shape[-1]
     if N <=0:
         raise ValueError, "N must be positive."
     if iscomplexobj(x):
         print "Warning: imaginary part of x ignored."
         x = real(x)
-    Xf = fft(x,N,axis=0)
+    Xf = fft(x,N,axis=-1)
     h = zeros(N)
     if N % 2 == 0:
         h[0] = h[N/2] = 1
@@ -1078,7 +1078,7 @@
         h[1:(N+1)/2] = 2

     if len(x.shape) > 1:
-        h = h[:, newaxis]
+        h = h[newaxis,:]
     x = ifft(Xf*h)
     return x



Cheers,

Ariel
-- 
Ariel Rokem
Helen Wills Neuroscience Institute
University of California, Berkeley
http://argentum.ucbso.berkeley.edu/ariel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20100114/f260a190/attachment.html>


More information about the SciPy-Dev mailing list