[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Hilbert transform
From: |
Sergei Steshenko |
Subject: |
Re: Hilbert transform |
Date: |
Fri, 6 Jul 2012 16:03:15 -0700 (PDT) |
----- Original Message -----
> From: Juan Pablo Carbajal <address@hidden>
> To: Sergei Steshenko <address@hidden>
> Cc: Ben Abbott <address@hidden>; "address@hidden" <address@hidden>
> Sent: Saturday, July 7, 2012 1:49 AM
> Subject: Re: Hilbert transform
>
> On Sat, Jul 7, 2012 at 12:34 AM, Sergei Steshenko <address@hidden>
> wrote:
>>
>>
>>
>>
>> ----- Original Message -----
>>> From: Ben Abbott <address@hidden>
>>> To: Sergei Steshenko <address@hidden>
>>> Cc: "address@hidden" <address@hidden>
>>> Sent: Friday, July 6, 2012 8:53 PM
>>> Subject: Re: Hilbert transform
>>>
>>>
>>> On Jul 6, 2012, at 12:44 PM, Sergei Steshenko wrote:
>>>
>>>> Hello,
>>>>
>>>> i am talking about 'hilbert' function from from
>>> 'signal-1.1.3/hilbert.m' file, so Octave help list purists are
> welcome
>>> to send me with my uncomfortable questions to octave-dev list.
>>>>
>>>> But I'll ask my questions here - from my reading (and
> recollections of
>>> what I learned a long long time ago) the issue is
> mathematical/computational.
>>>>
>>>> First a couple of references:
>>>>
>>>> 1) http://w3.msi.vxu.se/exarb/mj_ex.pdf - I think put together
> really
>>> nicely;
>>>> 2) http://en.wikipedia.org/wiki/Hilbert_transform
>>>> .
>>>>
>>>> Wherever we look, we find that the definition of Hilbert transform
> is
>>> through integral of a _real_ function, i.e.
>>>>
>>>> hilbert(u(t)) == integral_from_minus_to_plus_inf("u(tau) / (t
> -
>>> tau)", "dtau")
>>>>
>>>> and as such it should be a _real_ function of 't' provided
> u(t) is
>>> a real function of 't'.
>>>>
>>>>
>>>> Also, it is proven that
>>>>
>>>> hilbert(hilbert(u(t))) == -u(t)
>>>> .
>>>>
>>>> Now, here is Octave and its package reality:
>>>>
>>>>
>>>> "
>>>> octave:1> hilbert([1 2 3 4])
>>>> ans =
>>>>
>>>> 1 + 1i 2 - 1i 3 - 1i 4 + 1i
>>>>
>>>> octave:2> hilbert(hilbert([1 2 3 4]))
>>>> warning: HILBERT: ignoring imaginary part of signal
>>>> ans =
>>>>
>>>> 1 + 1i 2 - 1i 3 - 1i 4 + 1i
>>>>
>>>> octave:3>
>>>> ".
>>>>
>>>> Three violations already:
>>>>
>>>> 1) output is complex rather than real;
>>>> 2) the transform is not invertible;
>>>> 3) since Hilbert transform is linear, complex input should be
> accepted
>>> according to
>>>>
>>>> hilbert(foo + i * bar) == hilbert(foo) + i * hilbert(bar)
>>>> .
>>>>
>>>> To put things politically correctly, Hilbert transform is a canine
> female
>>> to calculate - because of the above "/ (t -tau)", and
> it's
>>> problematic to calculate in discrete domain.
>>>>
>>>> So, my first practical question is: "What does Matlab do
> ?".
>>>>
>>>> Thanks,
>>>> Sergei.
>>>
>>> Matlab's online doc for hilbert() is at the link below.
>>>
>>> http://www.mathworks.com/help/toolbox/signal/ref/hilbert.html
>>>
>>> The example below is included on that page.
>>>
>>> hilbert ([1 2 3 4])
>>> ans = 1 + 1i 2 - 1i 3 - 1i 4 + 1i
>>>
>>> It appears that the hilbert() function is *not* a direct implementation
> of the
>>> Hilbert Transform, but the version in the signal package does appear to
> be
>>> consistent with the one which is part of the Matlab Signals toolbox.
>>>
>>> After a quick look, my impression is that the hilbert() function's
> output is
>>> hilbert(x) = 1i * H(x) + x. Where, H(x) is the Hilbert Transform. I
> don' t
>>> know why the author (mathworks?) decided to restrict the input to real
> values.
>>>
>>> Ben
>>
>> Thanks to all for clarifications and explanations.
>>
>> I still see a problem though. First, as others have pointed out, what the
> documentation of signal-1.1.3/hilbert.m says among other things:
>>
>> "
>> `real(H)' contains the original signal F. `imag(H)' contains the
>> Hilbert transform of F.
>> ".
>>
>> So, if I want Hilbert transform proper, I need 'imag' - so far so
> good.
>>
>> Here is a quick example:
>>
>> "
>> octave:8> imag(hilbert(imag(hilbert([-3 -1 1 3]))))
>> ans =
>>
>> 2 2 -2 -2
>> ".
>>
>> The input ('[-3 -1 1 3]') is a 0 DC vector:
>>
>> "
>> center([-3 -1 1 3])
>> ans =
>>
>> -3 -1 1 3
>> "
>>
>> - which makes life easier.
>>
>> So, above I expected '3 1 -1 -3' answer according to
>>
>> Hilbert(Hilbert(u(t))) == -u(t)
>>
>> property ('Hilbert' is meant to be true Hilbert transform).
>>
>>
>> Obviously the answer I got: "2 2 -2 -2" is not the expected
> one. And the difference is not just scaling coefficient.
>>
>>
>> Any ideas ?
>>
>> Thanks,
>> Sergei.
>>
>> P.S. It looks like signal-1.1.3/hilbert.m follows what Matlab documentation
> describes, but the question is whether what is described in the documentation
> (the part returned with 'imag') is true Hilbert transform.
>>
>>
>>
>>
>>
>>
>>>
>> _______________________________________________
>> Help-octave mailing list
>> address@hidden
>> https://mailman.cae.wisc.edu/listinfo/help-octave
>
> You are working with a discrete transformation very sensitive to the
> length of the signal. If you check with a longer signal everything is
> fine.
>
> t = linspace (0,1,100);
> y = sin (2*pi*8*t) - sin (2*pi*10*t);
> yg= imag ( hilbert ( imag ( hilbert (y))));
> plot (t,y,t,-yg,'o')
>
> Cheers
>
>
> --
> M. Sc. Juan Pablo Carbajal
> -----
> PhD Student
> University of Zürich
> http://ailab.ifi.uzh.ch/carbajal/
Thanks for the example.
I'd say with long sequences it's much better, but still:
"
octave:37> foo = center(linspace(0,1,100));
octave:38> max(abs(foo + imag(hilbert(imag(hilbert(foo))))))
ans = 0.0050505
"
- the expected answer is 0.
And, even more interesting:
"
octave:39> min(abs(foo + imag(hilbert(imag(hilbert(foo))))))
ans = 0.0050505
",
i.e. the error is constant.
Thanks,
Sergei.
>
- Hilbert transform, Sergei Steshenko, 2012/07/06
- Re: Hilbert transform, Ben Abbott, 2012/07/06
- Re: Hilbert transform, Juan Pablo Carbajal, 2012/07/06
- Re: Hilbert transform, Sergei Steshenko, 2012/07/06
- Re: Hilbert transform, Przemek Klosowski, 2012/07/09
- Re: Hilbert transform, Przemek Klosowski, 2012/07/09
- Re: Hilbert transform, Sergei Steshenko, 2012/07/09
- Re: Hilbert transform, Sergei Steshenko, 2012/07/06
- Re: Hilbert transform, Ben Abbott, 2012/07/07
- Re: Hilbert transform, Sergei Steshenko, 2012/07/07
- Re: Hilbert transform, Ben Abbott, 2012/07/07