DSPRelated.com
Forums

Inverse Hilbert Filter

Started by porterboy October 19, 2004
I have a real signal from which I extract an analytic signal by
Hilbert filtering. To recover the real signal, I use an inverse
Hilbert filter. The context of this is for SSB transmission of a real
signal and conversion to DSB at the receiver. Connected back to back,
the forward and inverse transforms should give almost perfect
recovery. However, because the ideal Hilbert filter is infinite in
length, I have truncated it to N coefficients, using various windows
(kaiser, nutall, rect). This non-ideality means that I cant recover
the signal exactly. However, I was expecting to do better than I am
which is not good at all! Back to back transforms give me about 12dB
SNR for a 41 tap Hilbert filter. To increase this to 30dB of SNR I
have to use 801 coefficients! Is the Hilbert filter really that
difficult to approximate? I haven't tried IIR yet, maybe that would be
better?

Here is the Matlab:

nhlbrt = 41;                              % Filter order
ind = 1:floor(nhlbrt/2);                  % n>0 coefficient index    
hlbrt = ((sin(pi*ind/2)).^2)./(pi*ind/2); % n>0 coefficients
hlbrt = [-fliplr(hlbrt) 0 hlbrt];         % apply antisymmetry
win = kaiser(nhlbrt,6)';                  % window to apply
hlbrt = win.*hlbrt;                       % windowing
hlbrt(find(abs(hlbrt)<eps)) = 0;    % half the coefficients are zero
Hello Porterboy,

Maybe I'm misunderstanding you, but I'm not sure why you need to do the
second Hilbert transform.

The analytic extension of f(t) is had by


g(t) = f(t) + j*F(t) where F(t) is the Hilbert transform of f(t)

To convert back to a real valued function, just take the real part of g(t).


But assuming I'm missing something, the other question about using back to
back Hilberts. Yes there is difficulty if you get anywhere near DC. When
I've needed to do an analytic extension, I've usually need it in a bandpass
type of situation. So I can then generate a very accurate short length
filter that is flat over a narrow band. Odd symmetry will guarentee the 90
degree phase shift.  Likewise the original data is bandpassed before the
analytic extension process. The compensating delay for the real part is had
by grabbing it the from the middle element in the delay line. Another thing
is design the Hilbert by using a P-M algo over just the needed band. You are
using the theoretical impulse response for a Hilbert, and since its tails
decay as 1/x you can see the convergence is painfully slow. And you are
tring to go down to DC with this approach.

IHTH,
Clay


"porterboy" <porterboy76@yahoo.com> wrote in message
news:c4b57fd0.0410190601.58b2a53a@posting.google.com...
> I have a real signal from which I extract an analytic signal by > Hilbert filtering. To recover the real signal, I use an inverse > Hilbert filter. The context of this is for SSB transmission of a real > signal and conversion to DSB at the receiver. Connected back to back, > the forward and inverse transforms should give almost perfect > recovery. However, because the ideal Hilbert filter is infinite in > length, I have truncated it to N coefficients, using various windows > (kaiser, nutall, rect). This non-ideality means that I cant recover > the signal exactly. However, I was expecting to do better than I am > which is not good at all! Back to back transforms give me about 12dB > SNR for a 41 tap Hilbert filter. To increase this to 30dB of SNR I > have to use 801 coefficients! Is the Hilbert filter really that > difficult to approximate? I haven't tried IIR yet, maybe that would be > better? > > Here is the Matlab: > > nhlbrt = 41; % Filter order > ind = 1:floor(nhlbrt/2); % n>0 coefficient index > hlbrt = ((sin(pi*ind/2)).^2)./(pi*ind/2); % n>0 coefficients > hlbrt = [-fliplr(hlbrt) 0 hlbrt]; % apply antisymmetry > win = kaiser(nhlbrt,6)'; % window to apply > hlbrt = win.*hlbrt; % windowing > hlbrt(find(abs(hlbrt)<eps)) = 0; % half the coefficients are zero
> Hello Porterboy, > > Maybe I'm misunderstanding you, but I'm not sure why you need to do the > second Hilbert transform. > > The analytic extension of f(t) is had by > > > g(t) = f(t) + j*F(t) where F(t) is the Hilbert transform of f(t) > > To convert back to a real valued function, just take the real part of g(t). > > > But assuming I'm missing something, the other question about using back to > back Hilberts. Yes there is difficulty if you get anywhere near DC. When > I've needed to do an analytic extension, I've usually need it in a bandpass > type of situation. So I can then generate a very accurate short length > filter that is flat over a narrow band. Odd symmetry will guarentee the 90 > degree phase shift. Likewise the original data is bandpassed before the > analytic extension process. The compensating delay for the real part is had > by grabbing it the from the middle element in the delay line. Another thing > is design the Hilbert by using a P-M algo over just the needed band. You are > using the theoretical impulse response for a Hilbert, and since its tails > decay as 1/x you can see the convergence is painfully slow. And you are > tring to go down to DC with this approach.
Here's why I might want an inverse transform. Suppose there is a phase shift p in the channel. Then simply taking the real part at the receiver wont work, because, in the worst case of p = pi/2 the real part will be zero. I'll post some more on this later, I have to run right now...
Hey Clay, I think you were right after all...

To transmit a real signal a efficiently it can be converted to SSB by
a hilbert filter before modulation:

b = h*a;     % The * is convolution, h is the hilbert filter 
x = a + jb;  % The analytic signal (complex baseband equivalent of
             % SSB pasband signal).

If the received signal r is perfect, then r = x.
This is separated into real and imaginary, r = u+jv;
Since r = x it is clear that u = a, so taking the real part will
recover the transmitted signal, as Clay suggested.

However, suppose there is a phase offset p, so that r = x.e^jp.
Write c = cos(p) and s = sin(p). Then...
r = x.e^jp
  = (a+jb).(c+js)
  = (ac-bs) + j(as+bc)
  = u + jv.

Now, by taking just the real part u some of the signal a is discarded,
maybe resulting in a drop in performance. By applying the inverse
Hilbert filter -h to the imaginary part we should get...

y = -h*v
  = -h*(as+bc)
  = -s(h*a) - c(h*b)  % by linearity
  = -bs + ac          % by property of the hilbert filter

Finally the real and imaginary parts are combined as follows...

z = (u+y)/2 +j(u-y)/2;
  = ((ac-bs)+(ac-bs))/2 + j((ac-bs)-(ac-bs))/2 
  = (ac-bs) 

Which is the same as before! So using an inverse hilbert filter offers
no improvement, and some kind of phase correction must be performed.
Maybe there is an advantage if there is more imaginary noise than real
noise, but I cant see that this would ever happen in practise....