Демодуляция квадратурных амплитуд
задает опции, используя один или несколько аргументы пары "имя-значение". Для примера, 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');
Модулируйте и демодулируйте случайные данные при помощи 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) для декодеров 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 ошибок или передают биты.
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
(false
) или 1
(true
). Когда этот флаг 1
(true
), функция масштабирует созвездие до средней степени в один ватт, привязанной к 1 Ом. Когда этот флаг 0
(false
), функция масштабирует созвездие так, чтобы точки созвездия QAM были разделены минимальным расстоянием в два.
'OutputType'
- Тип выхода'integer'
(по умолчанию) | 'bit'
| 'llr'
| 'approxllr'
Тип выхода, заданный как разделенная разделенными запятой парами, состоящая из 'OutputType'
и 'integer'
, 'bit'
, 'llr'
, или 'approxllr'
.
Типы данных: char
'NoiseVariance'
- Отклонение шума1
(по умолчанию) | положительная скалярная величина | вектор положительных значенийШумовое отклонение, заданная как разделенная запятой пара, состоящая из 'NoiseVariance'
и один из следующих опций:
Положительная скалярная величина - то же значение отклонения шума используется на всех входных элементах.
Вектор положительных значений - Длина вектора должна быть равна количеству элементов в последней размерности входного сигнала. Каждый элемент вектора задает отклонение шума для всех элементов входа по соответствующей последней размерности.
Совет
Когда 'OutputType'
является ‘llr’
, если расчет демодуляции выводит Inf
или -Inf
это, вероятно, потому что заданные значения отклонения шума меньше, чем отношение сигнал/шум (ОСШ). Поскольку алгоритм Log-Likelihood вычисляет экспоненциалы с помощью арифметики конечной точности, расчет экспоненциалов с большими или маленькими числами может привести к положительной или отрицательной бесконечности. Для получения дополнительной информации смотрите Точный алгоритм LLR.
Чтобы избежать этой проблемы, установите 'OutputType'
на ‘approxllr’
вместо этого. Приблизительный алгоритм LLR не вычисляет экспоненциалов.
Чтобы включить этот аргумент пары "имя-значение", задайте 'OutputType'
является 'llr'
или 'approxllr'
.
Типы данных: double
'PlotConstellation'
- Опция для построения созвездияfalse
или 0
(по умолчанию) | true
или 1
Опция для построения созвездия, заданная как разделенная запятыми пара, состоящая из 'PlotConstellation'
и числовое или логическое 0
(false
) или 1
(true
) Чтобы построить график созвездия QAM, задайте 'PlotConstellation'
на true
.
z
- Демодулированный выходной сигналДемодулированный выходной сигнал, возвращенный в виде скаляра, вектора, матрицы или трехмерные массивы. Тип данных тот же, что и у входного сигнала, 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
Начиная с R2018b, вы больше не можете смещать начальную фазу для созвездия QAM, используя qamdemod
функция.
Вместо этого используйте genqamdemod
функция для смещения начальной фазы демодулируемого сигнала QAM. Кроме того, можно умножить модулированный вход qamdemod
по желаемой начальной фазе, как показано на этом коде
z = qamdemod(y.*exp(-1i*initPhase,M))
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.