Квадратурная амплитудная демодуляция
задает поведение демодуляции с помощью z
= qamdemod(___,Name,Value
)Name,Value
пары и любой из предыдущих синтаксисов.
y
— Входной сигналВходной сигнал, следующий из квадратурной амплитудной модуляции, заданной как комплексный скаляр, вектор, матрица или трехмерный массив. Каждый столбец обработан как независимый канал.
Типы данных: double |
single
| fi
Поддержка комплексного числа: Да
M
— Порядок модуляцииПорядок модуляции, заданный как скалярное целое число степени двойки. Порядок модуляции задает число точек в сигнальном созвездии.
Пример: 16
Типы данных: double
symOrder
— Порядок символа'gray'
(значение по умолчанию) | 'bin'
| векторПорядок символа, заданный как 'gray'
, 'bin'
, или вектор.
'gray'
— Используйте упорядоченное расположение Кода Грея
'bin'
— Используйте естественное двоично кодированное упорядоченное расположение
Вектор — Использование пользовательское упорядоченное расположение символа
Векторы должны использовать уникальные элементы, значения которых лежат в диапазоне от 0 до M
– 1. Первый элемент соответствует верхней левой точке созвездия с последующими элементами, бегущими по столбцам слева направо.
Пример: [0 3 1 2]
Типы данных: char |
double
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
'UnitAveragePower'
— Модульный средний флаг степениfalse
(значение по умолчанию) | true
Модульный средний флаг степени, заданный как разделенная запятой пара, состоящая из UnitAveragePower
и логический скаляр. Когда этим флагом является true
, функция масштабирует созвездие к средней степени 1 ватта, на который ссылаются к 1 Ому. Когда этим флагом является false
, функция масштабирует созвездие так, чтобы точки созвездия QAM были разделены минимальным расстоянием 2.
Типы данных: логический
'OutputType'
'OutputType' 'integer'
(значение по умолчанию) | 'bit'
| 'llr'
| 'approxllr'
Выведите тип, заданный как разделенная запятой пара, состоящая из OutputType
и одно из следующего: 'integer'
, 'bit'
, 'llr'
, или 'approxllr'
.
Типы данных: char
'NoiseVariance'
— Шумовое отклонение
(значение по умолчанию) | положительная скалярная величина | вектор положительных значенийШумовое отклонение, заданное как положительная скалярная величина или вектор положительных значений.
Когда задано как скаляр, то же шумовое значение отклонения используется на всех входных элементах.
Когда задано как вектор, длина вектора должна быть равна числу элементов в последней размерности входного сигнала. Каждый элемент вектора задает шумовое отклонение для всех элементов входа по соответствующему последнему измерению.
Когда OutputType
= ‘llr’
, если расчет демодуляции выходные параметры Inf
или -Inf
значения, это вероятно, потому что заданные шумовые значения отклонения значительно меньше, чем ОСШ. Поскольку алгоритм LLR вычисляет экспоненциалы с помощью конечной арифметики точности, расчет экспоненциалов с очень большими или очень небольшими числами может дать к положительной или отрицательной бесконечности.
Попытайтесь использовать OutputType
= ‘approxllr’
вместо этого, потому что аппроксимированный алгоритм LLR не вычисляет экспоненциалы.
Этот входной параметр применяется только когда 'OutputType'
установлен в 'llr'
или 'approxllr'
.
Типы данных: double
'PlotConstellation'
— Опция, чтобы построить созвездиеfalse
(значение по умолчанию) | true
Опция, чтобы построить созвездие, заданное как разделенная запятой пара, состоящая из 'PlotConstellation'
и логический скаляр. Чтобы построить созвездие QAM, установите PlotConstellation
к true
.
Типы данных: логический
z
— Демодулируемый выходной сигналДемодулируемый выходной сигнал, возвращенный как скаляр, вектор, матрица или трехмерный массив. Тип данных совпадает с типом данных входного сигнала, y
. Размерности выхода варьируются в зависимости от заданного OutputType
значение.
'OutputType' | Возвращаемое значение qamdemod | Размерности Выхода |
---|---|---|
'integer' | Демодулируемые целочисленные значения от 0 до M – 1 | z имеет те же размерности как вход 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
Начиная в R2018b, вы больше не можете возмещать начальную фазу для созвездия QAM с помощью qamdemod
функция.
Вместо этого используйте genqamdemod
чтобы возместить начальную фазу демодулируемых данных QAM или можно умножить модулируемый вход к qamdemod
желаемой начальной фазой:
z = qamdemod(y .* exp(-1i*initPhase,M))
genqamdemod
| genqammod
| modnorm
| pamdemod
| qammod
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.