Квадратурная амплитудная демодуляция
указывает параметры, использующие один или несколько аргументов пары имя-значение. Например, 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. Убедитесь, что символы входных данных соответствуют демодулированным символам.
Создайте 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);

Демодулируйте принятый сигнал.
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')

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