Этот раздел создает пример, постепенный, чтобы дать вам первый взгляд на программное обеспечение 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