16-QAM с функциями MATLAB

Введение

Этот раздел создает пример, постепенный, чтобы дать вам первый взгляд на программное обеспечение Communications Toolbox™. Этот раздел также показывает, как функциональности Communications Toolbox полагаются на вычислительные инструменты и инструменты визуализации в базовой среде MATLAB®.

Модулируйте случайный сигнал

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

Следующая таблица обобщает основные используемые операции, наряду с соответствующим Communications Toolbox и функциями MATLAB. Пример использует 16-QAM основную полосу (квадратурная амплитудная модуляция) как схема модуляции и AWGN (аддитивный белый Гауссов шум) как модель канала.

ЗадачаФункция
Сгенерируйте случайный поток двоичных данныхrandi
Преобразуйте двоичный сигнал в сигнал с целочисленным знакомbi2de
Модулируйте 16-QAM использованиеqammod
Добавьте белый гауссов шумawgn
Создайте схему совокупностиscatterplot
Демодулируйте 16-QAM использованиеqamdemod
Преобразуйте сигнал с целочисленным знаком в двоичный сигналde2bi
Вычислите системный BERbiterr

Сгенерируйте случайный поток двоичных данных

Обычный формат для представления сигнала в MATLAB является вектором или матрицей. Этот пример использует функцию randi, чтобы создать вектор-столбец, который содержит значения потока двоичных данных. Длина потока двоичных данных (то есть, количество строк в вектор-столбце) произвольно установлена в 30 000.

Код ниже также создает диаграмму стебель-листья фрагмента потока данных, показывая двоичные значения. Заметьте, что использование двоеточия (:) оператор в MATLAB выбирает фрагмент вектора.

Задайте параметры.

M = 16;                     % Size of signal constellation
k = log2(M);                % Number of bits per symbol
n = 30000;                  % Number of bits to process
numSamplesPerSymbol = 1;    % Oversampling factor

Создайте поток двоичных данных как вектор-столбец.

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

Постройте первые 40 битов в диаграмме стебель-листья.

stem(dataIn(1:40),'filled');
title('Random Bits');
xlabel('Bit Index');
ylabel('Binary Value');

Преобразуйте двоичный сигнал в сигнал с целочисленным знаком

Функция qammod реализует прямоугольный, M-арный модулятор QAM, M быть 16 в этом примере. Настройка по умолчанию такова, что объект получает целые числа между 0 и 15, а не 4 кортежа битов. В этом примере мы предварительно обрабатываем поток двоичных данных dataIn перед использованием функции qammod. В частности, функция bi2de используется, чтобы преобразовать каждого с 4 кортежами в соответствующее целое число.

Выполните отображение бита к символу.

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

Постройте первые 10 символов в диаграмме стебель-листья.

figure; % Create new figure window.
stem(dataSymbolsIn(1:10));
title('Random Symbols');
xlabel('Symbol Index');
ylabel('Integer Value');

Модулируйте 16-QAM использование

Сгенерировав вектор-столбец dataSymbolsIn, используйте функцию qammod, чтобы применяться, 16-QAM модуляция и для двоичного файла и для Грэя закодировала отображения бита к символу. Вспомните, что M равняется 16, размеру алфавита.

Примените модуляцию.

dataMod = qammod(dataSymbolsIn,M,'bin');         % Binary coding, phase offset = 0
dataModG = qammod(dataSymbolsIn,M); % Gray coding, phase offset = 0

Результатами являются комплексные вектор-столбцы, значения которых являются элементами 16-QAM сигнального созвездия. Более поздний шаг в этом примере построит схему совокупности.

Чтобы узнать больше о функциях модуляции, смотрите Цифровую Модуляцию. Кроме того, обратите внимание, что функция qammod не применяет импульсное формирование. Чтобы расширить этот пример, чтобы использовать импульсное формирование, смотрите, что Импульс Формирует Используя Повышенный Фильтр Косинуса. Для примера, который использует Грэя, кодирующего с модуляцией PSK, смотрите Грэя Закодированный 8-PSK.

Добавьте белый гауссов шум

Отношение энергии, подведенной к долоту к шумовой степени спектральная плотность, Eb/N0, произвольно установлено в 10 дБ. От того значения может быть определено отношение сигнал-шум (SNR). Учитывая ОСШ, модулируемый сигнал, dataMod, передается через канал при помощи функции awgn.

Примечание

Переменная numSamplesPerSymbol не является значительной в этом примере, но облегчит расширять пример позже, чтобы использовать импульсное формирование.

Вычислите ОСШ, когда канал будет иметь Eb/N0 = 10 дБ.

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

Передайте сигнал через канал AWGN и для двоичного файла и для закодированных отображений символа Грэя.

receivedSignal = awgn(dataMod,snr,'measured');
receivedSignalG = awgn(dataModG,snr,'measured');

Создайте схему совокупности

Функция scatterplot используется, чтобы отобразить синфазные компоненты и квадратурные компоненты модулируемого сигнала, dataMod, и его полученной, шумной версии, receivedSignal. Путем рассмотрения результирующей схемы эффекты AWGN с готовностью заметны.

Используйте функцию scatterplot, чтобы показать схему совокупности.

sPlotFig = scatterplot(receivedSignal,1,0,'g.');
hold on
scatterplot(dataMod,1,0,'k*',sPlotFig)

Демодулируйте 16-QAM

Функция qamdemod используется, чтобы демодулировать полученные данные и вывести символы данных с целочисленным знаком.

Демодулируйте полученные сигналы с помощью функции qamdemod.

dataSymbolsOut = qamdemod(receivedSignal,M,'bin');
dataSymbolsOutG = qamdemod(receivedSignalG,M);

Преобразуйте сигнал с целочисленным знаком в двоичный сигнал

Функция de2bi используется, чтобы преобразовать символы данных от демодулятора QAM, dataSymbolsOut, в бинарную матрицу, dataOutMatrix с размерностями Nsym-by-Nbits/sym, где Nsym является общим количеством символов QAM, и Nbits/sym является количеством битов на символ, четыре в этом случае. Матрица затем преобразована в вектор-столбец, длина которого равна количеству входных битов, 30,000. Процесс повторяется для закодированных символов данных Грэя, dataSymbolsOutG.

Инвертируйте отображение бита к символу, выполняемое ранее.

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

Вычислите системный BER

Функциональный biterr используется, чтобы вычислить статистику битовой ошибки от исходного потока двоичных данных, dataIn, и полученных потоков данных, dataOut и dataOutG.

Используйте функцию коэффициента ошибок, чтобы вычислить ошибочную статистику и использовать fprintf, чтобы отобразить результаты.

[numErrors,ber] = biterr(dataIn,dataOut);
fprintf('\nThe binary coding bit error rate = %5.2e, based on %d errors\n', ...
    ber,numErrors)
The binary coding bit error rate = 2.40e-03, based on 72 errors
[numErrorsG,berG] = biterr(dataIn,dataOutG);
fprintf('\nThe Gray coding bit error rate = %5.2e, based on %d errors\n', ...
    berG,numErrorsG)
The Gray coding bit error rate = 1.33e-03, based on 40 errors

Заметьте, что Грэй, кодирующий значительно, уменьшает частоту ошибок по битам.

Постройте сигнальные созвездия

Пример в предыдущем разделе, Модулируйте Случайный Сигнал, создал график рассеивания из модулируемого сигнала. Несмотря на то, что график показал точки в совокупности QAM, график не показывал, какие целые числа модулятора сопоставлены с данной точкой совокупности. Этот раздел иллюстрирует два возможных отображения: 1) двоичное кодирование и 2) Грэй, кодирующий. Было ранее продемонстрировано, что Грэй, кодирующий, обеспечивает превосходящую производительность частоты ошибок по битам.

Бинарное отображение символа для 16-QAM совокупности

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

M = 16;                         % Modulation order
x = (0:15)';                    % Integer input
y1 = qammod(x,16,'bin');        % 16-QAM output

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

scatterplot(y1)
text(real(y1)+0.1, imag(y1), dec2bin(x))
title('16-QAM, Binary Symbol Mapping')
axis([-4 4 -4 4])

Серо-закодированное отображение символа для 16-QAM совокупности

Примените 16-QAM модуляцию ко всем возможным входным значениям с помощью серо-закодированного отображения символа.

y2 = qammod(x,16,'gray');  % 16-QAM output, Gray-coded

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

scatterplot(y2)
text(real(y2)+0.1, imag(y2), dec2bin(x))
title('16-QAM, Gray-coded Symbol Mapping')
axis([-4 4 -4 4])

Исследуйте графики

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

Формирование импульса Используя повышенный фильтр косинуса

Модулирование Случайного примера Сигнала было изменено, чтобы использовать пару повышенного косинуса квадратного корня (RRC) фильтры, чтобы выполнить импульсное формирование и согласованную фильтрацию. Фильтры создаются функцией rcosdesign. В Исправлении ошибок с помощью Сверточного кода этот пример расширен путем представления прямого исправления ошибок (FEC), чтобы улучшать производительность BER.

Чтобы создать симуляцию BER, модулятор, демодулятор, канал связи и ошибочные функции счетчика должны использоваться, и должны быть заданы определенные основные параметры. В этом случае 16-QAM модуляция используется в канале AWGN.

Установите среду симуляции

Установите параметры симуляции.

M = 16;                     % Size of signal constellation
k = log2(M);                % Number of bits per symbol
numBits = 3e5;              % Number of bits to process
numSamplesPerSymbol = 4;    % Oversampling factor

Создайте повышенный фильтр косинуса

Установите квадратный корень, повысил параметры фильтра косинуса.

span = 10;        % Filter span in symbols
rolloff = 0.25;   % Roloff factor of filter

Создайте квадратный корень, повышенный фильтр косинуса с помощью функции rcosdesign.

rrcFilter = rcosdesign(rolloff, span, numSamplesPerSymbol);

Отобразите импульсный ответ фильтра RRC с помощью функции fvtool.

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

Симуляция BER

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

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

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

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, сверхдискретизируйте и примените квадратный корень, повышенный фильтр косинуса.

txSignal = upfirdn(dataMod, rrcFilter, numSamplesPerSymbol, 1);

Функция upfirdn сверхдискретизировала модулируемый сигнал, dataMod, фактором numSamplesPerSymbol, заполняет сверхдискретизированный сигнал нулями в конце, чтобы сбросить фильтр и затем применяет фильтр.

Установите Eb/N0 на 10 дБ и преобразуйте ОСШ, учитывая количество битов на символ, k и количество выборок на символ.

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

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

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

Отфильтруйте полученный сигнал с помощью квадратного корня, повышенного фильтра косинуса и удалите фрагмент сигнала составлять задержку фильтра порядка сделать значимое сравнение BER.

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

Эти функции применяются, тот же квадратный корень повысил фильтр косинуса что передатчик, используемый ранее, и затем субдискретизируйте результат фактором nSamplesPerSymbol. Последняя команда удаляет первые символы Span и последние символы Span в подкошенном сигнале, потому что они представляют совокупную задержку двух операций фильтрации. Теперь rxFiltSignal, который является входом к демодулятору и dataSymbolsOut, который является выводом от модулятора, имеет тот же векторный размер. В части примера, который вычисляет частоту ошибок по битам, она требуется, чтобы сравнивать векторы, которые имеют тот же размер.

Примените 16-QAM демодуляцию к полученному, отфильтрованному сигналу.

dataSymbolsOut = qamdemod(rxFiltSignal, M);

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

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

Примените функцию biterr, чтобы определить количество ошибок и связанного BER.

[numErrors, ber] = biterr(dataIn, dataOut);
fprintf('\nThe bit error rate = %5.2e, based on %d errors\n', ...
    ber, numErrors)
The bit error rate = 1.83e-03, based on 550 errors

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

Создайте индикаторную диаграмму для фрагмента отфильтрованного сигнала.

eyediagram(txSignal(1:2000),numSamplesPerSymbol*2);

Функция eyediagram создает индикаторную диаграмму для части отфильтрованного бесшумного сигнала. Эта схема иллюстрирует эффект импульсного формирования. Обратите внимание на то, что сигнал показывает значительную интерференцию межсимвола (ISI), потому что фильтр является повышенным фильтром косинуса квадратного корня, не полным повышенным фильтром косинуса.

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

Заметьте, что первая команда scatterplot масштабирует rxSignal sqrt(numSamplesPerSymbol) при графическом выводе. Это вызвано тем, что операция фильтрации изменяет степень сигнала.

Исправление ошибок с помощью Сверточного кода

Полагаясь на Формирование Импульса Используя Повышенный пример Фильтра Косинуса, этот пример показывает, как производительность частоты ошибок по битам улучшается со сложением прямого исправления ошибок, FEC, кодируя.

Установите среду симуляции

Чтобы создать симуляцию, модулятор, демодулятор, повысил пару фильтра косинуса, канал связи, и ошибочные функции счетчика используются, и заданы определенные основные параметры. В этом случае 16-QAM схема модуляции с повышенной фильтрацией косинуса используется в канале AWGN. За исключением количества битов, заданные параметры идентичны используемым в предыдущем примере.

Установите переменные симуляции. Число битов увеличено от предыдущего примера так, чтобы частота ошибок по битам могла быть оценена более точно.

M = 16;                                         % Size of signal constellation
k = log2(M);                                    % Number of bits per symbol
numBits = 100000;                               % Number of bits to process
numSamplesPerSymbol = 4;                        % Oversampling factor

Сгенерируйте случайные данные

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

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

Сверточное кодирование

Производительность Формирования Импульса Используя Повышенный пример Фильтра Косинуса может быть значительно улучшена путем использования прямого исправления ошибок. В этом примере сверточное кодирование применяется к переданному потоку битов в порядке исправить ошибки, являющиеся результатом шумного канала. Поскольку это часто реализуется в действительных системах, алгоритм Viterbi используется, чтобы декодировать полученные данные. Алгоритм трудного решения используется, что означает, что декодер интерпретирует каждый вход или как “0” или как “1”.

Задайте сверточную решетку кодирования для уровня 2/3 код. Функция poly2trellis задает решетку, которая представляет сверточный код, который convenc использует для кодирования бинарного вектора, dataIn. Два входных параметра функции poly2trellis указывают на продолжительность ограничения кода и полиномы генератора, соответственно.

tPoly = poly2trellis([5 4],[23 35 0; 0 5 13]);
codeRate = 2/3;

Закодируйте входные данные с помощью ранее созданной решетки.

dataEnc = convenc(dataIn, tPoly);

Модулируйте данные

Закодированные двоичные данные преобразованы в целочисленный формат так, чтобы 16-QAM модуляция могла быть применена.

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

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

Примените 16-QAM модуляцию.

dataMod = qammod(dataSymbolsIn, M);

Повышенная фильтрация косинуса

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

Задайте промежуток фильтра и фактор спада для квадратного корня, повышенного фильтра косинуса.

span = 10;        % Filter span in symbols
rolloff = 0.25;   % Roloff factor of filter

Создайте фильтр с помощью функции rcosdesign.

rrcFilter = rcosdesign(rolloff, span, numSamplesPerSymbol);

Используя функцию upfirdn, сверхдискретизируйте и примените квадратный корень, повышенный фильтр косинуса.

txSignal = upfirdn(dataMod, rrcFilter, numSamplesPerSymbol, 1);

Канал AWGN

Вычислите отношение сигнал-шум, ОСШ, на основе входа Eb/N0, количества выборок на символ и уровня кода. Преобразование от Eb/N0 до ОСШ требует, чтобы объяснил количество информационных битов на символ. В предыдущем примере каждый символ соответствовал битам k. Теперь, каждый символ соответствует k *codeRate информационные биты. Более конкретно три символа соответствуют 12 закодированным битам в 16-QAM, которые соответствуют 8 незакодированным (информация) биты.

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

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

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

Получите и демодулируйте сигнал

Отфильтруйте полученный сигнал с помощью RRC, фильтруют и удаляют фрагмент сигнала составлять задержку фильтра порядка сделать значимое сравнение BER.

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

Демодулируйте полученный, отфильтрованный сигнал с помощью функции qamdemod.

dataSymbolsOut = qamdemod(rxFiltSignal, M);

Декодирование Viterbi

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

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

Декодируйте convolutionally закодированные данные с Декодером Витерби. Синтаксис для функции vitdec дает ему команду использовать трудные решения. 'Продолжение следует' аргумент дает ему команду использовать режим, разработанный для поддержания непрерывности, когда функция неоднократно вызывается (как в цикле). Несмотря на то, что этот пример не использует цикл, 'продолжение следует', режим используется в целях иллюстрирования, как компенсировать задержку этой операции декодирования.

traceBack = 16;                                             % Traceback length for decoding
numCodeWords = floor(length(codedDataOut)*2/3);             % Number of complete codewords
dataOut = vitdec(codedDataOut(1:numCodeWords*3/2), ...      % Decode data
           tPoly,traceBack,'cont','hard');

Вычисление BER

Используя функцию biterr, сравните dataIn и dataOut, чтобы получить количество ошибок и частоты ошибок по битам при принятии задержки декодирования во внимание. Непрерывный режим работы Декодера Витерби подвергается задержке, длительность которой в битах равняется traceback длине, traceBack, времена количеству входных потоков в энкодере. Для этого уровня 2/3 код, энкодер имеет два входных потока, таким образом, задержка 2×traceBack биты. В результате первыми 2×traceBack биты в декодируемом векторе, dataOut, являются нули. При вычислении частоты ошибок по битам первое 2×traceBack биты в dataOut и последнем 2×traceBack отбрасываются биты в исходном векторе, dataIn. Незамедлительно компенсация, вычисление BER бессмысленно.

decDelay = 2*traceBack;                                     % Decoder delay, in bits
[numErrors, ber] = ...
   biterr(dataIn(1:end-decDelay),dataOut(decDelay+1:end));       

fprintf('\nThe bit error rate = %5.2e, based on %d errors\n', ...
    ber, numErrors)
The bit error rate = 6.00e-05, based on 6 errors

Это видно, что для того же Eb/N0 10 дБ, количество ошибок при использовании FEC сокращено, как BER, улучшается от 2.0×10-3 до 6.9×10-4.

Больше о задержках

Операция декодирования в этом примере подвергается задержке, что означает, что вывод декодера изолирует вход. Синхронизация информации не появляется явным образом в примере, и длительность задержки зависит от определенных выполняемых операций. Задержки происходят в различных связанных с коммуникациями операциях, включая сверточное декодирование, сверточное чередование/устранение чередования, коррекцию и фильтрацию. Чтобы узнать длительность задержки, вызванной определенными функциями или операциями, обратитесь к определенной документации для тех функций или операций. Например: