Этот пример расширяет Исследование 16-QAM Используя пример MATLAB, чтобы выполнить формирование импульса, и повышенная фильтрация косинуса при помощи пары квадратного корня повысила косинус (RRC) фильтры. rcosdesign
функция создает фильтры. Производительность BER может улучшаться путем добавления прямого исправления ошибок (FEC) в линию связи. Чтобы добавить FEC в линию связи с импульсным примером фильтрации формы, смотрите Использование Прямое Исправление ошибок на 16-QAM примере Сигнала.
В этом примере показано, как обработать поток двоичных данных при помощи линии связи, которая состоит из основополосного модулятора, канала, демодулятора, и формирования импульса и повышенной фильтрации косинуса. Пример отображает фрагмент случайных данных в диаграмме стебель-листья, отображает переданные и полученные сигналы в схемах созвездия и вычисляет частоту ошибок по битам (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. 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
функция на полученном сигнале проредить и отфильтровать сигнал. Downsample при помощи того же фактора сверхдискретизации запросил повышающую дискретизацию переданного сигнала. Фильтр при помощи того же фильтра 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;