qamdemod

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

Описание

пример

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

пример

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

пример

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

Примеры

свернуть все

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

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

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

Модулируйте data путем применения 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');

Figure contains an axes object. The axes object contains 11 objects of type line, text. These objects represent Points corresponding to 0, Points corresponding to 3, Reference constellation.

Модулируйте и демодулируйте случайные данные при помощи 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);

Figure contains an axes object. The axes object with title 16-QAM, Custom Mapping, UnitAveragePower=true contains 19 objects of type line, text.

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

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

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

isequal(x,z)
ans = logical
   1

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

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

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 ошибками не сталкиваются или 107 биты передаются.

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')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Soft, Hard, Uncoded.

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

Используйте 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 эквивалентный сигнал выровняться синфазный и квадратура.

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

Примените согласованную фильтрацию к полученному сигналу OQPSK.

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');

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

свернуть все

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

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

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Порядок символа в виде одной из этих опций:

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

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

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

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

Аргументы name-value

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

Пример: z = qamdemod(y,M,symOrder,'OutputType','bit')

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

Тип выхода в виде разделенной запятой пары, состоящей из 'OutputType' и 'integer', 'bit', 'llr', или 'approxllr'.

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

Шумовое отклонение в виде разделенной запятой пары, состоящей из 'NoiseVariance' и одна из этих опций:

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

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

Совет

Поскольку алгоритм Логарифмической правдоподобности вычисляет экспоненциалы с помощью конечной арифметики точности, расчет экспоненциалов с большими или маленькими числами может дать к положительной или отрицательной бесконечности. Аппроксимированный алгоритм LLR не вычисляет экспоненциалы. Для получения дополнительной информации смотрите Демодуляцию Мягкого Решения.

Когда 'OutputType' ‘llr’, любой Inf или -Inf значения, возвращенные расчетом демодуляции выход, происходят, вероятно, из-за заданных шумовых значений отклонения, являющихся меньшим, чем отношение сигнал-шум (SNR).

Постараться не возвращать выходные значения Inf или -Inf, установите 'OutputType' к ‘approxllr’ вместо 'llr'.

Зависимости

Чтобы включить этот аргумент пары "имя-значение", установите 'OutputType' 'llr' или 'approxllr'.

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

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

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

свернуть все

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

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

Больше о

свернуть все

Код Грея

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

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

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

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

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

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

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