Используйте импульсное формирование 16-QAM сигнала

Этот пример расширяет 16-QAM Exampine Использование примера MATLAB для выполнения импульсного формирования и фильтрации приподнятого косинуса с помощью пары квадратного корня приподнятого косинуса (RRC) фильтров. The rcosdesign функция создает фильтры. Эффективность BER может быть улучшена путем добавления прямой коррекции ошибок (FEC) к ссылке связи. Чтобы добавить FEC к ссылке связи с примером фильтрации формы импульса, смотрите пример использования прямой коррекции ошибок на 16-QAM Signal.

Этот пример показывает, как обработать поток двоичных данных с помощью ссылки связи, которая состоит из модулятора основной полосы частот, канала, демодулятора и формирования импульсов и фильтрации приподнятого косинуса. Пример отображает фрагмент случайных данных в диаграмму лист-ствол, отображает переданные и принятые сигналы в сигналах созвездия и вычисляет вероятность битовой ошибки (BER).

Создайте среду симуляции

Задайте параметры симуляции для схемы 16-QAM модуляции с повышенной фильтрацией косинуса и канала AWGN.

M = 16; % Modulation order
k = log2(M); % Number of bits per symbol
numBits = 3e5; % Number of bits to process
sps = 4; % Number of samples per symbol (oversampling factor)

Создание фильтра RRC

Установите параметры фильтра RRC.

filtlen = 10; % Filter length in symbols
rolloff = 0.25; % Filter rolloff factor

Используйте rcosdesign функция для создания фильтра RRC.

rrcFilter = rcosdesign(rolloff,filtlen,sps);

Используйте FVTool, чтобы отобразить импульсную характеристику RRC-фильтра.

fvtool(rrcFilter,'Analysis','Impulse')

Figure Filter Visualization Tool - Impulse Response contains an axes and other objects of type uitoolbar, uimenu. The axes with title Impulse Response contains an object of type stem.

Вычислительная система BER

Используйте randi функция для генерации случайных двоичных данных. Установите rng функция в состоянии по умолчанию или любое статическое начальное значение, так что пример дает повторяемые результаты.

rng default; % Use default random number generator
dataIn = randi([0 1],numBits,1); % Generate vector of binary data

Измените форму вектора входа на матрицу 4-битных двоичных данных. Затем используйте bi2de функция для преобразования данных в целочисленные символы.

dataInMatrix = reshape(dataIn,length(dataIn)/k,k); % Reshape data into binary 4-tuples
dataSymbolsIn = bi2de(dataInMatrix); % Convert to integers

Примените 16-QAM модуляцию с помощью qammod функция.

dataMod = qammod(dataSymbolsIn,M);

Используйте upfirdn функция для увеличения сигнала коэффициентом избыточной дискретизации и применения фильтра RRC. The upfirdn функция заполняет усиленный сигнал нулями в конце, чтобы промыть фильтр. Затем функция применяет фильтр.

txFiltSignal = upfirdn(dataMod,rrcFilter,sps,1);

Использование количества бит на символ (k) и количество выборок на символ (sps), преобразуйте отношение энергии на бит к спектральной плотности степени шума (EbNo) к значению ОСШ для использования awgn функция.

EbNo = 10;
snr = EbNo + 10*log10(k) - 10*log10(sps);

Пропустите отфильтрованный сигнал через канал AWGN.

rxSignal = awgn(txFiltSignal,snr,'measured');

Используйте upfirdn функционирует на принятом сигнале, чтобы уменьшить значение и отфильтровать сигнал. Понижение дискретизации при помощи того же коэффициента избыточной дискретизации, применяемого для увеличения дискретизации передаваемого сигнала. Фильтруйте с помощью того же RRC фильтра, примененного к переданному сигналу.

Каждая операция фильтрации задерживает сигнал на половину длины фильтра в символах filtlen/2. Таким образом, общая задержка от фильтрации передачи и приема равняется длине фильтра filtlen. Для расчета BER переданный и принятый сигналы должны быть одинакового размера, и вы должны учитывать задержку между переданным и принятым сигналом. Удалите первый filtlen символы в децимированном сигнале для расчета совокупной задержки операций фильтрации передачи и приема. Удалите последнюю filtlen символы в децимированном сигнале, чтобы гарантировать, что количество выборок в выходе демодулятора совпадает с количеством выборок во входе модулятора.

rxFiltSignal = upfirdn(rxSignal,rrcFilter,1,sps); % Downsample and filter
rxFiltSignal = rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

Используйте qamdemod функция для демодуляции принятого фильтрованного сигнала.

dataSymbolsOut = qamdemod(rxFiltSignal,M);

Преобразуйте восстановленные целочисленные символы в двоичные данные с помощью de2bi функция.

dataOutMatrix = de2bi(dataSymbolsOut,k);
dataOut = dataOutMatrix(:); % Return data in column vector

Определите количество ошибок и связанный BER при помощи biterr функция.

[numErrors,ber] = biterr(dataIn,dataOut);
fprintf('\nFor an EbNo setting of %3.1f dB, the bit error rate is %5.2e, based on %d errors.\n', ...
    EbNo,ber,numErrors)
For an EbNo setting of 10.0 dB, the bit error rate is 1.83e-03, based on 550 errors.

Визуализация эффектов фильтра

Чтобы визуализировать эффекты фильтра в глазковой диаграмме, уменьшите Eb/N0 настройка и регенерация полученных данных. Визуализация высокого сигнала ОСШ без других многолучевых эффектов, можно использовать глазковые диаграммы, чтобы выделить уменьшение межсимвольной интерференции (ISI) на выходе для пары импульсных формирующих RRC фильтров. Фильтр RRC не имеет нулевого ISI, пока он не соединяется со вторым фильтром RRC, чтобы сформировать в каскаде фильтр приподнятого косинуса.

EbNo = 20;
snr = EbNo + 10*log10(k) - 10*log10(sps);
rxSignal = awgn(txFiltSignal,snr,'measured');
rxFiltSignal = upfirdn(rxSignal,rrcFilter,1,sps); % Downsample and filter
rxFiltSignal = rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

Создайте глазковую диаграмму для фрагмента фильтрованного бесшумного сигнала, чтобы визуализировать эффект формирования импульса. Переданный сигнал имеет фильтрацию RRC и показывает ISI как сужение открытия глаза.

eyediagram(txFiltSignal(1:2000),sps*2);

Figure Eye Diagram contains 2 axes. Axes 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.

Отображение глазковой диаграммы сигнала после шума канала показывает сигнал с RRC фильтрацией и шумом. Уровень шума вызывает дальнейшее сужение глазковой диаграммы открытия глаза.

eyediagram(rxSignal(1:2000),sps*2);

Figure Eye Diagram contains 2 axes. Axes 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.

Отображение глазковой диаграммы сигнала после применения фильтрации приёма показывает сигнал с фильтр приподнятого косинуса. Более широкие глазковые диаграммы, сигнал имеет меньше ISI с повышенной фильтрацией косинуса по сравнению с сигналом с RRC фильтрацией.

eyediagram(rxFiltSignal(1:2000),2);

Figure Eye Diagram contains 2 axes. Axes 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.

Создайте сигнальное созвездие принятого сигнала до и после фильтрации. Масштабируйте принятый сигнал квадратным корнем из количества выборок на символ, чтобы нормализовать уровни степени передачи и приема.

scatplot = scatterplot(sqrt(sps)*...
    rxSignal(1:sps*5e3),...
    sps,0);
hold on;
scatterplot(rxFiltSignal(1:5e3),1,0,'bx',scatplot);
title('Received Signal, Before and After Filtering');
legend('Before Filtering','After Filtering');
axis([-5 5 -5 5]); % Set axis ranges
hold off;

Figure Scatter Plot contains an axes. The axes with title Received Signal, Before and After Filtering contains 2 objects of type line. These objects represent Before Filtering, After Filtering.

Похожие темы