В этом примере показано, как обрабатывать двоичный поток данных с использованием линии связи, которая состоит из модулятора основной полосы частот, канала и демодулятора. Пример отображает часть случайных данных на графике основы, отображает переданные и принятые сигналы на диаграммах созвездий и вычисляет частоту битовых ошибок (BER). Чтобы добавить фильтр формирования импульсов в канал связи, см. пример использования формирования импульсов в 16-QAM Signal. Чтобы добавить прямую коррекцию ошибок в канал связи с фильтрацией формы импульсов, см. пример использования прямой коррекции ошибок в 16-QAM Signal.
Схема модуляции использует 16-QAM основной полосы частот, и сигнал проходит через аддитивный канал белого гауссова шума (AWGN). В основных операциях моделирования используются функции Communications Toolbox™ и MATLAB ® .
rng - Управляет генерацией случайных чисел.
randi - генерирует случайный двоичный поток данных.
bi2de - преобразует двоичный сигнал в целочисленный сигнал.
qammod - Модулирует с помощью 16-QAM.
comm.AWGNChannel - ухудшает передаваемые данные с помощью AWGN.
scatterplot - Создает диаграммы созвездий.
qamdemod - Демодулирует с помощью 16-QAM.
de2bi - преобразует целочисленный сигнал в двоичный.
biterr - вычисляет BER системы.
Обычным форматом для представления сигнала в MATLAB является вектор или матрица. randi создает вектор столбца, содержащий значения двоичного потока данных. Длина двоичного потока данных (то есть количество строк в векторе столбца) произвольно устанавливается равной 30000.
Определите параметры.
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 до состояния по умолчанию или любого статического начального значения, так что в примере получаются повторяемые результаты. Затем используйте 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 - количество битов на символ, определенное параметром (M). Затем используйте 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). Преобразование отношения энергии на бит к спектральной плотности мощности шума () в значение SNR для использования awgn функция. sps переменная не является значимой в этом примере, но облегчает расширение примера для использования формирования импульсов. Дополнительные сведения см. в примере «Использование формирования импульсов для 16-QAM сигнала».
Вычислите SNR, если канала составляет 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 функция преобразования символов данных из демодулятора КАМ, dataSymbolsOut, в двоичную матрицу, dataOutMatrix, с размерами Nsym-by-Nbits/sym. В матрице - общее количество символов QAM, а - количество битов на символ. Для 16-QAM = 4. Затем преобразуйте матрицу в вектор столбца длиной, равной числу входных битов, 30000. Повторите процесс для символов данных, кодированных серым цветом, 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.
Показанная диаграмма созвездия ранее отображала точки в созвездии КАМ, но она не указывала отображение между значениями символов и точками созвездия. В этом разделе диаграмма созвездия показывает отображения для естественного кодирования и серого кодирования двоичных данных в точки созвездия.
Примените 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) отличаются на два бита (третий и четвертый биты).