Этот пример показывает, как использовать преобразование Гильберта для выполнения амплитудной модуляции (AM) с одной боковой полосой (SSB) сигнала. Однополосные AM-сигналы имеют меньшую пропускную способность, чем нормальные AM-сигналы.
Сгенерируйте 512 выборок моделируемого широкополосного сигнала, используя sinc
функция. Задайте полосу пропускания рад/образец.
N = 512; n = 0:N-1; bw = 1/4; x = sinc((n-N/2)*bw);
Добавьте белый Гауссов шум таким образом, чтобы отношение сигнал/шум составляло 20 дБ. Сбросьте генератор случайных чисел для воспроизводимых результатов. Используйте periodogram
функция для оценки степени спектральной плотности (PSD) сигнала.
rng default
SNR = 20;
noise = randn(size(x))*std(x)/db2mag(SNR);
x = x + noise;
periodogram(x)
Амплитуда модулирует сигнал с помощью косинуса несущей частоты . Умножьте на так, чтобы степень модулированного сигнала равнялась степени исходного сигнала. Оценка PSD.
wc = pi/2;
x1 = x.*cos(wc*n)*sqrt(2);
periodogram(x1)
legend('Modulated')
Амплитудная модуляция SSB уменьшает полосу пропускания сигнала вдвое. Чтобы выполнить амплитудную модуляцию SSB, необходимо сначала вычислить преобразование Гильберта сигнала. Затем амплитуда модулирует сигнал с помощью синуса с той же несущей частотой, , как и прежде, и добавить его к предыдущему сигналу.
Разработайте трансформатор Гильберта, используя designfilt
функция. Задайте порядок фильтра 64 и ширину перехода 0,1. Фильтрация сигнала.
Hhilbert = designfilt('hilbertfir','FilterOrder',64, ... 'TransitionWidth',0.1); xh = filter(Hhilbert,x);
Используйте grpdelay
функция для определения задержки, gd
, введенный фильтром. Компенсируйте задержку отбросом первого gd
точки фильтрованного сигнала и заполнение нулями на конце. Амплитуда модулирует результат и добавляет его к исходному. Сравните PSD.
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')
Преобразуйте сигнал вниз и оцените PSD.
ym = y.*cos(wc*n)*sqrt(2);
periodogram(ym)
legend('Downconverted')
Lowpass фильтрует модулированный сигнал, чтобы восстановить исходный. Задайте фильтр конечной импульсной характеристики lowpass 64-го порядка с частотой среза . Компенсируйте задержку, введенную фильтром.
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;
Оцените PSD фильтрованного сигнала и сравните его с исходным.
periodogram([x;dm]') legend('Original','Recovered')
Используйте snr
функция для сравнения отношений сигнал-шум двух сигналов. Постройте график двух сигналов во временном интервале.
snrOrig = snr(x,noise)
snrOrig = 20.0259
snrRecv = snr(dm,noise)
snrRecv = 20.1373
plot(n,[x;dm]') legend('Original','Recovered') axis tight
Ссылки
Бак, Джон Р., Майкл М. Дэниел и Эндрю С. Сингер. Компьютерные исследования в сигналах и системах с использованием MATLAB. 2-е издание. Верхняя Седл-Ривер, Нью-Джерси: Prentice Hall, 2002.
designfilt
| periodogram
| snr