В этом примере показано, как обработать поток двоичных данных при помощи линии связи, которая состоит из основополосного модулятора, канала и демодулятора. Пример отображает фрагмент случайных данных в диаграмме стебель-листья, отображает переданные и полученные сигналы в схемах созвездия и вычисляет частоту ошибок по битам (BER). Чтобы добавить импульсный формирующий фильтр в линию связи, смотрите, что Импульс Использования Формирует на 16-QAM примере Сигнала. Чтобы добавить прямое исправление ошибок в линию связи с импульсной фильтрацией формы, смотрите Использование Прямое Исправление ошибок на 16-QAM примере Сигнала.
Схема модуляции использует 16-QAM основную полосу, и сигнал проходит через канал аддитивного белого Гауссова шума (AWGN). Основные операции симуляции используют их функции MATLAB® и Communications Toolbox™.
rng
— Управляет генерацией случайных чисел.
randi
— Генерирует случайный поток двоичных данных.
bi2de
— Преобразует двоичный сигнал в сигнал с целочисленным знаком.
qammod
— Модулирует 16-QAM использование.
comm.AWGNChannel
— Повреждает передаваемые данные с помощью AWGN.
scatterplot
— Создает схемы созвездия.
qamdemod
— Демодулирует 16-QAM использование.
de2bi
— Преобразует сигнал с целочисленным знаком в двоичный сигнал.
biterr
— Вычисляет системный BER.
Обычный формат для представления сигнала в MATLAB является вектором или матрицей. randi
функция создает вектор-столбец, содержащий значения потока двоичных данных. Длина потока двоичных данных (то есть, количество строк в вектор-столбце) произвольно установлена в 30 000.
Задайте параметры.
M = 16; % Modulation order (alphabet size or number of points in signal constellation) k = log2(M); % Number of bits per symbol n = 30000; % Number of bits to process sps = 1; % Number of samples per symbol (oversampling factor)
Установите rng
функционируйте к его состоянию по умолчанию или любому статическому значению seed, так, чтобы пример привел к повторяемым результатам. Затем используйте randi
функция, чтобы сгенерировать случайные двоичные данные.
rng default; dataIn = randi([0 1],n,1); % Generate vector of binary data
Используйте диаграмму стебель-листья, чтобы показать двоичные значения для первых 40 битов случайного потока двоичных данных. Используйте двоеточие (:
) оператор в вызове stem
функционируйте, чтобы выбрать фрагмент бинарного вектора.
stem(dataIn(1:40),'filled'); title('Random Bits'); xlabel('Bit Index'); ylabel('Binary Value');
Настройка по умолчанию для qammod
функция ожидает, что данные с целочисленным знаком как вводимые символы будут модулировать. В этом примере поток двоичных данных предварительно обрабатывается в целочисленные значения перед использованием qammod
функция. В частности, bi2de
функция преобразует каждого с 4 кортежами в соответствующее целое число в области значений [0, (M–
1)]. Порядок модуляции, M
, 16 в этом примере.
Выполните отображение бита к символу первым изменением данных в бинарный k
- кортежи, где k
количество битов на символ, заданный . Затем используйте bi2de
функционируйте, чтобы преобразовать каждого с 4 кортежами в целочисленное значение.
dataInMatrix = reshape(dataIn,length(dataIn)/k,k); dataSymbolsIn = bi2de(dataInMatrix);
Постройте первые 10 символов в диаграмме стебель-листья.
figure; % Create new figure window. stem(dataSymbolsIn(1:10)); title('Random Symbols'); xlabel('Symbol Index'); ylabel('Integer Value');
Используйте qammod
функция, чтобы применить 16-QAM модуляцию к dataSymbolsIn
вектор-столбец для естественно закодированных и серо-закодированных отображений бита к символу.
dataMod = qammod(dataSymbolsIn,M,'bin'); % Binary coding with phase offset of zero dataModG = qammod(dataSymbolsIn,M); % Gray coding with phase offset of zero
Операция модуляции выходные параметры объединяет вектор-столбцы, содержащие значения, которые являются элементами 16-QAM сигнального созвездия. Позже в этом созвездии в качестве примера схемы показывают естественное и двоичное отображение символа Грэя.
Для получения дополнительной информации о функциях модуляции смотрите Цифровую Модуляцию. Для примера, который использует Грэя, кодирующего с модуляцией манипулирования сдвига фазы (PSK), смотрите Серо-закодированное Бинарное Упорядоченное расположение.
Модулируемый сигнал проходит через канал при помощи awgn
функция с заданным отношением сигнал-шум (SNR). Преобразуйте отношение энергии на бит к шумовой степени спектральная плотность () к значению ОСШ для использования awgn
функция. sps
переменная не является значительной в этом примере, но делает расширение примера, чтобы использовать импульс, формирующий легче. Для получения дополнительной информации смотрите, что Импульс Использования Формирует на 16-QAM примере Сигнала.
Вычислите ОСШ, когда канал будет иметь из 10 дБ.
EbNo = 10; snr = EbNo+10*log10(k)-10*log10(sps);
Передайте сигнал через канал AWGN для двоичного файла, и Грэй закодировал отображения символа.
receivedSignal = awgn(dataMod,snr,'measured'); receivedSignalG = awgn(dataModG,snr,'measured');
Используйте scatterplot
функционируйте, чтобы отобразить синфазные компоненты и квадратурные компоненты модулируемого сигнала, dataMod
, и сигнал с шумом, полученный после канала. Эффекты AWGN присутствуют в схеме созвездия.
sPlotFig = scatterplot(receivedSignal,1,0,'g.'); hold on scatterplot(dataMod,1,0,'k*',sPlotFig)
Используйте qamdemod
функция, чтобы демодулировать полученные данные и вывести символы данных с целочисленным знаком.
dataSymbolsOut = qamdemod(receivedSignal,M,'bin');
dataSymbolsOutG = qamdemod(receivedSignalG,M);
Используйте de2bi
функционируйте, чтобы преобразовать символы данных от демодулятора QAM, dataSymbolsOut
, в бинарную матрицу, dataOutMatrix
, с размерностями –. В матрице, общее количество символов QAM, и количество битов на символ. Для 16-QAM, = 4. Затем преобразуйте матрицу в вектор-столбец длины, равной количеству входных битов, 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
. Серое кодирование значительно уменьшает BER.
Используйте функцию коэффициента ошибок, чтобы вычислить ошибочную статистику. Используйте fprintf
функция, чтобы отобразить результаты.
[numErrors,ber] = biterr(dataIn,dataOut); fprintf('\nThe binary coding bit error rate is %5.2e, based on %d errors.\n', ... ber,numErrors)
The binary coding bit error rate is 2.40e-03, based on 72 errors.
[numErrorsG,berG] = biterr(dataIn,dataOutG); fprintf('\nThe Gray coding bit error rate is %5.2e, based on %d errors.\n', ... berG,numErrorsG)
The Gray coding bit error rate is 1.33e-03, based on 40 errors.
Схема созвездия, показанная ранее, построила точки в созвездии QAM, но это не указало на отображение между значениями символа и точками созвездия. В этом разделе схема созвездия указывает на отображения для естественного кодирования и серо-кодирования двоичных данных к точкам созвездия.
Примените 16-QAM модуляцию к полным наборам точек созвездия при помощи естественно закодированного бинарного отображения символа и серо-закодированного отображения символа.
M = 16; % Modulation order x = (0:15); % Integer input symbin = qammod(x,M,'bin'); % 16-QAM output (natural-coded binary) symgray = qammod(x,M,'gray'); % 16-QAM output (Gray-coded)
Используйте scatterplot
функционируйте, чтобы построить схему созвездия и аннотировать ее естественным (красным) и Грэем (черные) бинарные представления точек созвездия.
scatterplot(symgray,1,0,'b*'); for k = 1:M text(real(symgray(k)) - 0.0,imag(symgray(k)) + 0.3,... dec2base(x(k),2,4)); text(real(symgray(k)) - 0.5,imag(symgray(k)) + 0.3,... num2str(x(k))); text(real(symbin(k)) - 0.0,imag(symbin(k)) - 0.3,... dec2base(x(k),2,4),'Color',[1 0 0]); text(real(symbin(k)) - 0.5,imag(symbin(k)) - 0.3,... num2str(x(k)),'Color',[1 0 0]); end title('16-QAM Symbol Mapping') axis([-4 4 -4 4])
Используя серо-закодированный символ отображение улучшает производительность BER, потому что серо-закодированные точки сигнального созвездия отличаются только на один бит от каждой смежной соседней точки. Где как с естественным бинарным отображением символа, некоторые смежные точки созвездия. Например, естественно закодированные двоичные значения для 1 (0 0 0 1
) и 2 (0 0 1 0
) отличайтесь на два бита (третье и дальше биты).