hilbert() - Signal Processing
x = hilbert(xr) returns
a complex helical sequence, sometimes called the analytic
signal, from a real data sequence. The analytic signal x = xr + i*xi has a real part, xr,
which is the original data, and an imaginary part, xi,
which contains the Hilbert transform. The imaginary part is a version
of the original real sequence with a 90° phase shift. Sines are
therefore transformed to cosines and conversely. The Hilbert transformed
series has the same amplitude and frequency content as the original
sequence and includes phase information that depends on the phase
of the original.If xr is a matrix, x = hilbert(xr) operates columnwise on the matrix,
finding the analytic signal corresponding to each column.x = hilbert(xr,n) uses
an n point FFT to compute the Hilbert transform.
The input data xr is zero-padded or truncated to
length n, as appropriate.The Hilbert transform is useful in calculating instantaneous
attributes of a time series, especially the amplitude and frequency.
The instantaneous amplitude is the amplitude of the complex Hilbert
transform; the instantaneous frequency is the time rate of change
of the instantaneous phase angle. For a pure sinusoid, the instantaneous
amplitude and frequency are constant. The instantaneous phase, however,
is a sawtooth, reflecting how the local phase angle varies linearly
over a single cycle. For mixtures of sinusoids, the attributes are
short term, or local, averages spanning no more than two or three
points. See Hilbert Transform and Instantaneous Frequency for examples.Reference [1] describes the
Kolmogorov method for minimum phase reconstruction, which involves
taking the Hilbert transform of the logarithm of the spectral density
of a time series. The toolbox function rceps performs
this reconstruction.For a discrete-time analytic signal, x,
the last half of fft(x) is zero, and the first
(DC) and center (Nyquist) elements of fft(x) are
purely real.
Syntax
x = hilbert(xr)x = hilbert(xr,n)
Example
Analytic Signal of a SequenceOpen This Example
Define a sequence and compute its analyutic signal using hilbert.
xr = [1 2 3 4];
x = hilbert(xr)
x =
1.0000 + 1.0000i 2.0000 - 1.0000i 3.0000 - 1.0000i 4.0000 + 1.0000i
The imaginary part of x is the Hilbert transform of xr, and the real part is xr itself.imx = imag(x)
rex = real(x)
imx =
1 -1 -1 1
rex =
1 2 3 4
The last half of the DFT of x is zero. (In this example, the last half of the transform is just the last element.) The DC and Nyquist elements of fft(x) are purely real.dft = fft(x)
dft =
10.0000 + 0.0000i -4.0000 + 4.0000i -2.0000 + 0.0000i 0.0000 + 0.0000i
Analytic Signal and Hilbert TransformOpen This Example
The hilbert function finds the exact analytic signal for a finite block of data. You can also generate the analytic signal by using an FIR Hilbert transformer filter to compute an approximation to the imaginary part.
Generate a sequence composed of three sinusoids with frequencies 203, 721, and 1001 Hz. The sequence is sampled at 10 kHz for about 1 second. Use the hilbert function to compute the analytic signal. Plot it between 0.01 seconds and 0.03 seconds.fs = 1e4;
t = 0:1/fs:1;
x = 2.5+cos(2*pi*203*t)+sin(2*pi*721*t)+cos(2*pi*1001*t);
y = hilbert(x);
plot(t,real(y),t,imag(y))
xlim([0.01 0.03])
legend('real','imaginary')
title('hilbert Function')
Compute Welch estimates of the power spectral densities of the original sequence and the analytic signal. Divide the sequences into Hamming windowed nonoverlapping sections of length 256. Verify that the analytic signal has no power at negative frequencies.pwelch([x;y].',256,0,[],fs,'centered')
legend('Original','hilbert')
Use the designfilt function to design a 60th-order Hilbert transformer FIR filter. Specify a transition width of 400 Hz. Visualize the frequency response of the filter. Filter the sinusoidal sequence to approximate the imaginary part of the analytic signal.fo = 60;
d = designfilt('hilbertfir','FilterOrder',fo, ...
'TransitionWidth',400,'SampleRate',fs);
freqz(d,1024,fs)
hb = filter(d,x);
The group delay of the filter, grd, is equal to one-half the filter order. Compensate for this delay. Remove the first grd samples of the imaginary part and the last grd samples of the real part and the time vector. Plot the result between 0.01 seconds and 0.03 seconds.grd = fo/2;
y2 = x(1:end-grd) + 1j*hb(grd+1:end);
t2 = t(1:end-grd);
plot(t2,real(y2),t2,imag(y2))
xlim([0.01 0.03])
legend('real','imaginary')
title('FIR Filter')
Estimate the PSD of the approximate analytic signal and compare it to the hilbert result.pwelch([y;[y2 zeros(1,grd)]].',256,0,[],fs,'centered')
legend('hilbert','FIR Filter')
Output / Return Value
Limitations
Alternatives / See Also
Reference