qamdemod

Демодуляция квадратурных амплитуд

Описание

пример

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

пример

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

пример

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

Примеры

свернуть все

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

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

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. The axes 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. The axes 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) для декодеров Viterbi с твердым и мягким решениями в 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));

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

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

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

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

  • Сверточно закодируйте данные

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

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

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

  • Витерби декодирует сигналы с помощью жестких и неквантованных методов

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

The 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. The axes 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 должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

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

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

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

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

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

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

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

Совет

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

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

Зависимости

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

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

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

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

свернуть все

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

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

Подробнее о

свернуть все

Серый код

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

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

расширить все

Ошибки, начинающиеся в R2018b

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

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

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