Этот раздел создает пример, постепенный, чтобы дать вам первый взгляд на программное обеспечение Communications Toolbox™. Этот раздел также показывает, как функциональности Communications Toolbox полагаются на вычислительные инструменты и инструменты визуализации в базовой среде MATLAB®.
В этом примере показано, как обработать поток двоичных данных с помощью системы связи, которая состоит из основополосного модулятора, канала и демодулятора. Частота ошибок по битам (BER) системы вычисляется, и переданные и полученные сигналы отображены в схеме созвездия.
Следующая таблица обобщает основные используемые операции, наряду с соответствующим Communications Toolbox и функциями MATLAB. Пример использует 16-QAM основную полосу (квадратурная амплитудная модуляция) как схема модуляции и AWGN (аддитивный белый Гауссов шум) как модель канала.
Задача | Функция |
---|---|
Сгенерируйте случайный поток двоичных данных | randi |
Преобразуйте двоичный сигнал в сигнал с целочисленным знаком | bi2de |
Модулируйте 16-QAM использование | qammod |
Добавьте белый Гауссов шум | awgn |
Создайте схему созвездия | scatterplot |
Демодулируйте 16-QAM использование | qamdemod |
Преобразуйте сигнал с целочисленным знаком в двоичный сигнал | de2bi |
Вычислите системный BER | biterr |
Обычный формат для представления сигнала в 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');
Сгенерировав 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)
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
Функциональный 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 модуляцию ко всем возможным входным значениям с помощью отображения символа по умолчанию, двоичного файла.
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 модуляцию ко всем возможным входным значениям с помощью серо-закодированного отображения символа.
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')
Используйте 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);
Вычислите отношение сигнал-шум, ОСШ, на основе входа 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);
Используйте 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');
Используя 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.
Операция декодирования в этом примере подвергается задержке, что означает, что выход декодера изолирует вход. Время выполнения не появляется явным образом в примере, и длительность задержки зависит от определенных выполняемых операций. Задержки происходят в различных связанных с коммуникациями операциях, включая сверточное декодирование, сверточное перемежение/устранение чередования, эквализацию и фильтрацию. Чтобы узнать длительность задержки, вызванной определенными функциями или операциями, обратитесь к определенной документации для тех функций или операций. Например:
vitdec
страница с описанием