qamdemod

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

Описание

пример

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', или вектор.

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

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

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

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

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

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

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

Задайте дополнительные разделенные запятой пары Name,Value аргументы. 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')

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

Используйте qamdemod функция, чтобы симулировать мягкое решение выход для OQPSK-модулируемых сигналов.

Создайте OQPSK модулируемый сигнал и добавьте шум в сигнал.

sps = 4;
msg = randi([0 1],1000,1);
oqpskMod = comm.OQPSKModulator('SamplesPerSymbol',sps,'BitInput',true);
oqpskSig = oqpskMod(msg);

impairedSig = awgn(oqpskSig,15);

Выполните демодуляцию Мягкого Решения

Создайте QPSK эквивалентный сигнал выровнять меня и Q. Примените согласованную фильтрацию к полученному сигналу OQPSK.

impairedQPSK = complex(real(impairedSig(1+sps/2:end-sps/2)), imag(impairedSig(sps+1:end)));

halfSinePulse = sin(0:pi/sps:(sps)*pi/sps);
matchedFilter = dsp.FIRDecimator(sps,halfSinePulse,'DecimationOffset',sps/2);
filteredQPSK = matchedFilter(impairedQPSK);

Чтобы выполнить мягкую демодуляцию отфильтрованного сигнала OQPSK используют qamdemod функция. Выровняйте отображение символа qamdemod с отображением символа, используемым comm.OQPSKModulator, затем демодулируйте сигнал.

oqpskModSymbolMapping = [1 3 0 2];
demodulated = qamdemod(filteredQPSK,4,oqpskModSymbolMapping,'OutputType','llr');

Больше о

свернуть все

Код Грея

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

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

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

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

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

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

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