В этом примере показано, как визуализировать поведение сигнала с помощью глазковых диаграмм и графиков рассеивания. Пример использует сигнал QPSK, который передается через повышенный косинус квадратного корня (RRC) фильтр.
Установите фильтр RRC, схему модуляции и параметры графического вывода.
span = 10; % Filter span rolloff = 0.2; % Rolloff factor sps = 8; % Samples per symbol M = 4; % Modulation alphabet size k = log2(M); % Bits/symbol phOffset = pi/4; % Phase offset (radians) n = 1; % Plot every nth value of the signal offset = 0; % Plot every nth value of the signal, starting from offset+1
Создайте коэффициенты фильтра с помощью rcosdesign
функция.
filtCoeff = rcosdesign(rolloff,span,sps);
Сгенерируйте случайные символы для размера алфавита M
.
rng default
data = randi([0 M-1],5000,1);
Примените модуляцию QPSK.
dataMod = pskmod(data,M,phOffset);
Отфильтруйте модулируемые данные.
txSig = upfirdn(dataMod,filtCoeff,sps);
Вычислите ОСШ для сверхдискретизированного сигнала QPSK.
EbNo = 20; snr = EbNo + 10*log10(k) - 10*log10(sps);
Добавьте AWGN в переданный сигнал.
rxSig = awgn(txSig,snr,'measured');
Применяйтесь RRC получают фильтр.
rxSigFilt = upfirdn(rxSig, filtCoeff,1,sps);
Демодулируйте отфильтрованный сигнал.
dataOut = pskdemod(rxSigFilt,M,phOffset,'gray');
Используйте scatterplot
функционируйте, чтобы показать графики рассеивания сигнала до и после фильтрации. Вы видите, что получить фильтр улучшает производительность, когда созвездие более тесно совпадает с идеальными значениями. Первый span
символы и последний span
символы представляют совокупную задержку двух операций фильтрации и удалены из двух отфильтрованных сигналов прежде, чем сгенерировать графики рассеивания.
h = scatterplot(sqrt(sps)*txSig(sps*span+1:end-sps*span),sps,offset); hold on scatterplot(rxSigFilt(span+1:end-span),n,offset,'bx',h) scatterplot(dataMod,n,offset,'r+',h) legend('Transmit Signal','Received Signal','Ideal','location','best')
Отобразите 1 000 точек переданной глазковой диаграммы сигнала более чем два символьных периода.
eyediagram(txSig(sps*span+1:sps*span+1000),2*sps)
Отобразите 1 000 точек полученной глазковой диаграммы сигнала.
eyediagram(rxSig(sps*span+1:sps*span+1000),2*sps)
Заметьте, что полученная глазковая диаграмма начинает закрываться из-за присутствия AWGN. Кроме того, фильтр имеет конечную длину, которая также способствует неидеальному поведению.