www.gusucode.com > signal 案例源码程序 matlab代码 > signal/SingleSidebandAmplitudeModulationExample.m

    %% Single-Sideband Amplitude Modulation
% 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.

% Copyright 2015 The MathWorks, Inc.


%%
% Generate 512 samples of a simulated broadband signal using the |sinc|
% function. Specify a bandwidth of $\pi/4$ 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
% $\omega_c=\pi/2$. Multiply by $\sqrt2$ 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, $\omega_c$, as before, and add it to the
% previous signal.
%
% <<../ssbmod.png>>

%%
% 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);

%%
% Use the |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 $\pi/2$.
% 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.

periodogram([x;dm]')
legend('Original','Recovered')

%%
% Use the |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)
snrRecv = snr(dm,noise)

plot(n,[x;dm]')
legend('Original','Recovered')
axis tight

%%
% *References*
%
% 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.