Квадратурная амплитудная демодуляция
задает опции с помощью одного или нескольких аргументов пары "имя-значение". Например, 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');
Модулируйте и демодулируйте случайные данные при помощи 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 сигнализируют и проверяют, что данные восстанавливаются правильно.
Установите порядок модуляции как 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 ошибками не сталкиваются или биты передаются.
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 эквивалентный сигнал выровняться синфазный и квадратура.
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');
y
— Входной сигналВходной сигнал, который закончился QAM в виде скаляра, вектора, матрицы или трехмерного массива комплексных чисел. Каждый столбец в матрице и трехмерном массиве рассматривается как независимый канал.
Типы данных: single
| double
| fi
Поддержка комплексного числа: Да
M
— Порядок модуляцииПорядок модуляции в виде скалярного целого числа степени двойки. Порядок модуляции задает число точек в сигнальном созвездии.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
symOrder
— Порядок символа'gray'
(значение по умолчанию) | 'bin'
| векторПорядок символа в виде одной из этих опций:
'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'
— Модульный средний флаг степениfalse
или 0
(значение по умолчанию) | true
или 1
Модульная средняя степень отмечает в виде разделенной запятой пары, состоящей из 'UnitAveragePower'
и числовой или логический 0
ложь
) или 1
TRUE
). Когда этим флагом является 1
TRUE
), функция масштабирует созвездие к средней степени одного ватта, на который ссылаются к 1 Ому. Когда этим флагом является 0
ложь
), функция масштабирует созвездие так, чтобы точки созвездия QAM были разделены минимальным расстоянием два.
'OutputType'
— Тип выхода'integer'
(значение по умолчанию) | 'bit'
| 'llr'
| 'approxllr'
Тип выхода в виде разделенной запятой пары, состоящей из 'OutputType'
и 'integer'
, 'bit'
, 'llr'
, или 'approxllr'
.
Типы данных: char
'NoiseVariance'
— Шумовое отклонение
(значение по умолчанию) | положительная скалярная величина | вектор положительных значенийШумовое отклонение в виде разделенной запятой пары, состоящей из 'NoiseVariance'
и одна из этих опций:
Положительная скалярная величина — то же шумовое значение отклонения используется на всех входных элементах.
Вектор положительных значений — длина вектора должен быть равен числу элементов в последней размерности входного сигнала. Каждый элемент вектора задает шумовое отклонение для всех элементов входа по соответствующему последнему измерению.
Когда 'OutputType'
‘llr’
, если расчет демодуляции выходные параметры Inf
или -Inf
значение, это вероятно, потому что заданные шумовые значения отклонения меньше, чем отношение сигнал-шум (SNR). Поскольку алгоритм Логарифмической правдоподобности вычисляет экспоненциалы с помощью конечной арифметики точности, расчет экспоненциалов с большими или маленькими числами может дать к положительной или отрицательной бесконечности. Для получения дополнительной информации см. Точный Алгоритм LLR.
Чтобы избежать этой проблемы, установите 'OutputType'
к ‘approxllr’
вместо этого. Аппроксимированный алгоритм LLR не вычисляет экспоненциалы.
Чтобы включить этот аргумент пары "имя-значение", установите 'OutputType'
'llr'
или 'approxllr'
.
Типы данных: double
'PlotConstellation'
— Опция, чтобы построить созвездиеfalse
или 0
(значение по умолчанию) | true
или 1
Опция, чтобы построить созвездие в виде разделенной запятой пары, состоящей из 'PlotConstellation'
и числовой или логический 0
ложь
) или 1
TRUE
) Чтобы построить созвездие QAM, установите 'PlotConstellation'
к true
.
z
— Демодулируемый выходной сигналДемодулируемый выходной сигнал, возвращенный как скаляр, вектор, матрица или трехмерный массив. Тип данных совпадает с типом данных входного сигнала, y
. Значение и размерность этого выхода варьируются в зависимости от заданного 'OutputType'
значение, как показано в этой таблице.
'OutputType' | Возвращаемое значение qamdemod | Размерности Выхода |
---|---|---|
'integer' | Демодулируемые целочисленные значения от 0 до (M – 1) | z имеет те же размерности как вход y . |
'bit' | Демодулируемые биты | Количество строк в z log2 (M ) времена количество строк в y . Каждый демодулируемый символ сопоставлен с группой log2 (M ) биты, где первый бит представляет старший значащий бит (MSB) и последний бит, представляют младший значащий bitLSB. |
'llr' | Значение отношения логарифмической правдоподобности для каждого бита, вычисленного с помощью Точного Журнала алгоритм Likehood. Для получения дополнительной информации см. Точный Алгоритм LLR. | |
'approxllr' | Аппроксимированное значение отношения логарифмической правдоподобности для каждого бита. Значения вычисляются с помощью Аппроксимированного Журнала алгоритм Likehood. Для получения дополнительной информации см. Аппроксимированный Алгоритм LLR. |
Gray code, также известный как отраженный двоичный код, является системой, где комбинации двоичных разрядов в смежных точках созвездия отличаются только на один бит.
Ошибки, запускающиеся в R2018b
Начиная в R2018b, вы больше не можете возмещать начальную фазу для созвездия QAM с помощью qamdemod
функция.
Вместо этого используйте genqamdemod
функционируйте, чтобы возместить начальную фазу демодулируемого сигнала QAM. В качестве альтернативы можно умножить модулируемый вход qamdemod
желаемой начальной фазой, как показано в этом коде
z = qamdemod(y.*exp(-1i*initPhase,M))
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.