qamdemod

Квадратурная амплитудная демодуляция

Синтаксис

z = qamdemod(y,M)
z = qamdemod(y,M,symOrder)
z = qamdemod(___,Name,Value)

Описание

пример

z = qamdemod(y,M) возвращает демодулируемый сигнал, z, учитывая сигнал квадратурной амплитуды модулируется (QAM), который что y модуляции заказывает M.

пример

z = qamdemod(y,M,symOrder) возвращает демодулируемый сигнал и задает порядок символа.

пример

z = qamdemod(___,Name,Value) задает поведение демодуляции с помощью пар Name,Value и любого из предыдущих синтаксисов.

Входные параметры

свернуть все

Входной сигнал, следующий из квадратурной амплитудной модуляции, заданной как комплексный скаляр, вектор, матрица или трехмерный массив. Каждый столбец обработан как независимый канал.

Типы данных: double | single | fi
Поддержка комплексного числа: Да

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

Пример: 16

Типы данных: double

Порядок символа, заданный как 'gray', 'bin' или вектор.

  • серый Используйте упорядоченное расположение Кода Грея

  • 'bin' — Используйте естественное двоично кодированное упорядоченное расположение

  • Вектор — Использование пользовательское упорядоченное расположение символа

Векторы должны использовать уникальные элементы, значения которых колеблются от 0 до M – 1. Первый элемент соответствует верхней левой точке совокупности с последующими элементами, бегущими по столбцам слева направо.

Пример: [0 3 1 2]

Типы данных: char | double

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Модульный средний флаг степени, заданный как пара, разделенная запятой, состоящая из UnitAveragePower и логического скаляра. Когда этим флагом является true, функция масштабирует совокупность к средней степени 1 ватта, на который ссылаются к 1 Ому. Когда этим флагом является false, функция масштабирует совокупность так, чтобы точки совокупности QAM были разделены минимальным расстоянием 2.

Типы данных: логический

Выведите тип, заданный как пара, разделенная запятой, состоящая из OutputType и одно из следующего: 'integer', 'bit', 'llr' или 'approxllr'.

Типы данных: char

Шумовое отклонение, заданное как положительная скалярная величина или вектор положительных значений.

  • Когда задано как скаляр, то же шумовое значение отклонения используется на всех входных элементах.

  • Когда задано как вектор, длина вектора должна быть равна числу элементов в последней размерности входного сигнала. Каждый элемент вектора задает шумовое отклонение для всех элементов входа по соответствующему последнему измерению.

Совет

Когда OutputType = ‘llr’, если вычисление демодуляции значения выходных параметров Inf или -Inf, это вероятно, потому что заданные шумовые значения отклонения значительно меньше, чем ОСШ. Поскольку алгоритм LLR вычисляет экспоненциалы с помощью конечной арифметики точности, вычисление экспоненциалов с очень большими или очень небольшими числами может привести к положительной или отрицательной бесконечности.

Попытайтесь использовать OutputType = ‘approxllr’ вместо этого, потому что аппроксимированный алгоритм LLR не вычисляет экспоненциалы.

Зависимости

Этот входной параметр применяется только, когда 'OutputType' установлен в 'llr' или 'approxllr'.

Типы данных: double

Опция, чтобы построить совокупность, заданную как пара, разделенная запятой, состоящая из 'PlotConstellation' и логического скаляра. Чтобы построить совокупность QAM, установите PlotConstellation на true.

Типы данных: логический

Выходные аргументы

свернуть все

Демодулируемый выходной сигнал, возвращенный как скаляр, вектор, матрица или трехмерный массив. Тип данных совпадает с типом данных входного сигнала, y. Размерности вывода отличаются в зависимости от заданного значения OutputType.

'OutputType'Возвращаемое значение qamdemodРазмерности Вывода
'integer'Демодулируемые целочисленные значения от 0 до M – 1z имеет те же размерности как вход y.
'bit'Демодулируемые битыКоличество строк в z является log2 (M) времена количество строк в y. Каждый демодулируемый символ сопоставлен с группой log2 (M) биты, где первый бит представляет MSB, и последний бит представляет LSB.
'llr'Значение логарифмического отношения правдоподобия для каждого бита
'approxllr'Аппроксимированное значение логарифмического отношения правдоподобия для каждого бита

Примеры

свернуть все

Демодулируйте 8-QAM, сигнализируют и строят точки, соответствующие символам 0 и 3.

Сгенерируйте случайные 8-ary символы данных.

data = randi([0 7],1000,1);

Примените 8-QAM.

txSig = qammod(data,8);

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

rxSig = awgn(txSig,18,'measured');

Демодулируйте полученный сигнал с помощью начальной фазы π/8.

rxData = qamdemod(rxSig.*exp(-1i*pi/8),8);

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

refpts = qammod((0:7)',8) .* exp(1i*pi/8);

Постройте полученные очки сигнала, соответствующие символам 0 и 3, и наложите ссылочную совокупность. Только полученные данные, соответствующие тем символам, отображены.

plot(rxSig(rxData==0),'g.');
hold on
plot(rxSig(rxData==3),'c.');
plot(refpts,'r*')
text(real(refpts)+0.1,imag(refpts),num2str((0:7)'))
xlabel('In-Phase')
ylabel('Quadrature')
legend('Points corresponding to 0','Points corresponding to 3', ...
    'Reference constellation','location','nw');

Модулируйте и демодулируйте случайные данные при помощи 16-QAM с отображением символа WLAN. Проверьте, что символы входных данных совпадают с демодулируемыми символами.

Сгенерируйте трехмерный массив случайных символов.

x = randi([0,15],20,4,2);

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

wlanSymMap = [2 3 1 0 6 7 5 4 14 15 13 12 10 11 9 8];

Модулируйте данные и установите совокупность иметь модульную среднюю силу сигнала. Постройте совокупность.

y = qammod(x,16,wlanSymMap,'UnitAveragePower', true,'PlotConstellation',true);

Демодулируйте полученный сигнал.

z = qamdemod(y,16,wlanSymMap,'UnitAveragePower',true);

Проверьте, что демодулируемый сигнал равен исходным данным.

isequal(x,z)
ans = logical
   1

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

Установите порядок модуляции и определите количество битов на символ.

M = 64;
bitsPerSym = log2(M);

Сгенерируйте случайные биты. При работе в битном режиме длина входных данных должна быть целочисленным кратным количество битов на символ.

x = randi([0 1],10*bitsPerSym,1);

Модулируйте входные данные с помощью бинарного отображения символа. Установите модулятор выводить данные фиксированной точки. Тип числовых данных подписывается с 16-битным размером слова и 10-битной дробной длиной.

y = qammod(x,M,'bin','InputType','bit','OutputDataType', ...
    numerictype(1,16,10));

Демодулируйте 64-QAM сигнал. Проверьте, что демодулируемые данные совпадают с входными данными.

z = qamdemod(y,M,'bin','OutputType','bit');
s = isequal(x,double(z))
s = logical
   1

Оцените производительность частоты ошибок по битам (BER) для Декодеров Витерби трудного решения и мягкого решения в AWGN. Сравните производительность с той из незакодированной 64-QAM ссылки.

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

clear; close all
rng default
M = 64;                 % Modulation order
k = log2(M);            % Bits per symbol
EbNoVec = (4:10)';       % Eb/No values (dB)
numSymPerFrame = 1000;   % Number of QAM symbols per frame

Инициализируйте векторы результатов BER.

berEstSoft = zeros(size(EbNoVec)); 
berEstHard = zeros(size(EbNoVec));

Установите структуру решетки и traceback длину для уровня 1/2, продолжительность ограничения 7, сверточный код.

trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;

Основные циклы обработки выполняют эти шаги:

  • Сгенерируйте двоичные данные.

  • Convolutionally кодируют данные.

  • Примените модуляцию QAM к символам данных. Задайте модульную среднюю степень для переданного сигнала.

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

  • Демодулируйте полученный сигнал с помощью трудного решения и аппроксимируйте методы LLR. Задайте модульную среднюю степень для полученного сигнала.

  • Viterbi декодируют сигналы, использующие трудно и неквантованные методы.

  • Вычислите количество битовых ошибок.

Цикл while продолжает обрабатывать данные, пока с или 100 ошибками не сталкиваются или 1e7, биты передаются.

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Noise variance calculation for unity average signal power.
    noiseVar = 10.^(-snrdB/10);
    % Reset the error and bit counters
    [numErrsSoft,numErrsHard,numBits] = deal(0);
    
    while numErrsSoft < 100 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame*k,1);
        
        % Convolutionally encode the data
        dataEnc = convenc(dataIn,trellis);
        
        % QAM modulate
        txSig = qammod(dataEnc,M,'InputType','bit','UnitAveragePower',true);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal using hard decision (bit) and
        % soft decision (approximate LLR) approaches.
        rxDataHard = qamdemod(rxSig,M,'OutputType','bit','UnitAveragePower',true);
        rxDataSoft = qamdemod(rxSig,M,'OutputType','approxllr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        
        % Viterbi decode the demodulated data
        dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
        dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
        
        % Calculate the number of bit errors in the frame. Adjust for the
        % decoding delay, which is equal to the traceback depth.
        numErrsInFrameHard = biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
        numErrsInFrameSoft = biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
        
        % Increment the error and bit counters
        numErrsHard = numErrsHard + numErrsInFrameHard;
        numErrsSoft = numErrsSoft + numErrsInFrameSoft;
        numBits = numBits + numSymPerFrame*k;

    end
    
    % Estimate the BER for both methods
    berEstSoft(n) = numErrsSoft/numBits;
    berEstHard(n) = numErrsHard/numBits;
end

Отобразите предполагаемые твердые и мягкие данные о BER на графике. Постройте теоретическую производительность для незакодированного 64-QAM канала.

semilogy(EbNoVec,[berEstSoft berEstHard],'-*')
hold on
semilogy(EbNoVec,berawgn(EbNoVec,'qam',M))
legend('Soft','Hard','Uncoded','location','best')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

Как ожидалось мягкое декодирование решения приводит к лучшим результатам.

Больше о

свернуть все

Код Грея

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

Вопросы совместимости

развернуть все

Ошибки, запускающиеся в R2018b

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Представлено до R2006a