This example shows how to use the Hilbert transform to carry out single-sideband (SSB) amplitude modulation (AM) of a signal. Single-sideband AM signals have less bandwidth than normal AM signals.
Generate 512 samples of a simulated broadband signal using the
sinc function. Specify a bandwidth of rad/sample.
N = 512; n = 0:N-1; bw = 1/4; x = sinc((n-N/2)*bw);
Add white Gaussian noise such that the signal-to-noise ratio is 20 dB. Reset the random number generator for reproducible results. Use the
periodogram function to estimate the power spectral density (PSD) of the signal.
rng default SNR = 20; noise = randn(size(x))*std(x)/db2mag(SNR); x = x + noise; periodogram(x)
Amplitude modulate the signal using a cosine of carrier frequency . Multiply by so that the power of the modulated signal equals the power of the original signal. Estimate the PSD.
wc = pi/2; x1 = x.*cos(wc*n)*sqrt(2); periodogram(x1) legend('Modulated')
SSB amplitude modulation reduces the bandwidth of the signal by half. To carry out SSB amplitude modulation, you must first compute the Hilbert transform of the signal. Then, amplitude modulate the signal using a sine with the same carrier frequency, , as before, and add it to the previous signal.
Design a Hilbert transformer using the
designfilt function. Specify a filter order of 64 and a transition width of 0.1. Filter the signal.
Hhilbert = designfilt('hilbertfir','FilterOrder',64, ... 'TransitionWidth',0.1); xh = filter(Hhilbert,x);
grpdelay function to determine the delay,
gd, introduced by the filter. Compensate for the delay by discarding the first
gd points of the filtered signal and padding with zeros at the end. Amplitude modulate the result and add it to the original. Compare the PSDs.
gd = mean(grpdelay(Hhilbert)); xh = xh(gd+1:end); eh = zeros(size(x)); eh(1:length(xh)) = xh; x2 = eh.*sin(wc*n)*sqrt(2); y = x1+x2; periodogram([x1;y]') legend('Modulated','SSB')
Downconvert the signal and estimate the PSD.
ym = y.*cos(wc*n)*sqrt(2); periodogram(ym) legend('Downconverted')
Lowpass filter the modulated signal to recover the original. Specify a 64th-order FIR lowpass filter with a cutoff frequency of . Compensate for the delay introduced by the filter.
d = designfilt('lowpassfir','FilterOrder',64, ... 'CutoffFrequency',0.5); dem = filter(d,ym); gd = mean(grpdelay(d)); dem = dem(gd+1:end); dm = zeros(size(x)); dm(1:length(dem)) = dem;
Estimate the PSD of the filtered signal and compare it to that of the original.
snr function to compare the signal-to-noise ratios of the two signals. Plot the two signals in the time domain.
snrOrig = snr(x,noise)
snrOrig = 20.0259
snrRecv = snr(dm,noise)
snrRecv = 20.1373
plot(n,[x;dm]') legend('Original','Recovered') axis tight
Buck, John R., Michael M. Daniel, and Andrew C. Singer. Computer Explorations in Signals and Systems Using MATLAB. 2nd Edition. Upper Saddle River, NJ: Prentice Hall, 2002.