Этот пример расширяет 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.
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')
Используйте 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.
Чтобы визуализировать эффекты фильтра в глазковой диаграмме, уменьшите настройка и регенерация полученных данных. Визуализация высокого сигнала ОСШ без других многолучевых эффектов, можно использовать глазковые диаграммы, чтобы выделить уменьшение межсимвольной интерференции (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);
Отображение глазковой диаграммы сигнала после шума канала показывает сигнал с RRC фильтрацией и шумом. Уровень шума вызывает дальнейшее сужение глазковой диаграммы открытия глаза.
eyediagram(rxSignal(1:2000),sps*2);
Отображение глазковой диаграммы сигнала после применения фильтрации приёма показывает сигнал с фильтр приподнятого косинуса. Более широкие глазковые диаграммы, сигнал имеет меньше ISI с повышенной фильтрацией косинуса по сравнению с сигналом с RRC фильтрацией.
eyediagram(rxFiltSignal(1:2000),2);
Создайте сигнальное созвездие принятого сигнала до и после фильтрации. Масштабируйте принятый сигнал квадратным корнем из количества выборок на символ, чтобы нормализовать уровни степени передачи и приема.
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;