Квадратурная амплитудная демодуляция
z = qamdemod(y,M)
z = qamdemod(y,M,symOrder)
z = qamdemod(___,Name,Value)
задает поведение демодуляции с помощью пар z
= qamdemod(___,Name,Value
)Name,Value
и любого из предыдущих синтаксисов.
y
Входной сигналВходной сигнал, следующий из квадратурной амплитудной модуляции, заданной как комплексный скаляр, вектор, матрица или трехмерный массив. Каждый столбец обработан как независимый канал.
Типы данных: double
| single
| fi
Поддержка комплексного числа: Да
M
Порядок модуляцииПорядок модуляции, заданный как скалярное целое число степени двойки. Порядок модуляции задает число точек в сигнальном созвездии.
Пример: 16
Типы данных: double
symOrder
— Порядок символа'gray'
(значение по умолчанию) | 'bin'
| векторПорядок символа, заданный как 'gray'
, 'bin'
или вектор.
серый
Используйте упорядоченное расположение Кода Грея
'bin'
— Используйте естественное двоично кодированное упорядоченное расположение
Вектор — Использование пользовательское упорядоченное расположение символа
Векторы должны использовать уникальные элементы, значения которых колеблются от 0 до M
– 1. Первый элемент соответствует верхней левой точке совокупности с последующими элементами, бегущими по столбцам слева направо.
Пример: [0 3 1 2]
Типы данных: char
| double
Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми.
Имя (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'
— Шумовое отклонение1
(значение по умолчанию) | положительная скалярная величина | вектор положительных значенийШумовое отклонение, заданное как положительная скалярная величина или вектор положительных значений.
Когда задано как скаляр, то же шумовое значение отклонения используется на всех входных элементах.
Когда задано как вектор, длина вектора должна быть равна числу элементов в последней размерности входного сигнала. Каждый элемент вектора задает шумовое отклонение для всех элементов входа по соответствующему последнему измерению.
Когда 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')
Как ожидалось мягкое декодирование решения приводит к лучшим результатам.
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.