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

# Inverse Hilbert Filter

Started by ●October 19, 2004

Reply by ●October 19, 20042004-10-19

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

Reply by ●October 20, 20042004-10-20

> 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...

Reply by ●October 21, 20042004-10-21

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....