exponenta event banner

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-кратных символов данных.

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. Убедитесь, что символы входных данных соответствуют демодулированным символам.

Создайте 3-D массив случайных символов.

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) для декодеров Витерби с жестким и мягким решением в 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. Укажите среднюю мощность для принимаемого сигнала

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

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

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, заданный как скаляр, вектор, матрица или 3-D массив комплексных значений. Каждый столбец матрицы и массива 3-D рассматривается как независимый канал.

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

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

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

Порядок обозначений, указанный в качестве одной из следующих опций:

  • 'gray' - Использовать заказ серого кода.

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

  • Вектор (Vector) - использовать пользовательский порядок символов. Вектор должен иметь длину 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), функция масштабирует созвездие так, чтобы точки созвездия КАМ были разделены минимальным расстоянием, равным двум.

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

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

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

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

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

Совет

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

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

Зависимости

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

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

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

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

свернуть все

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

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

Подробнее

свернуть все

Серый код

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

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

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

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

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