Правильное смещение фазы и частоты для 16-QAM Используя крупную и прекрасную синхронизацию

Компенсация значительной фазы и смещений частоты для 16-QAM сигнала в канале AWGN выполняется на двух шагах. Во-первых, откорректируйте крупное смещение частоты с помощью оценки, обеспеченной крупным компенсатором частоты, и затем подстройте коррекцию с помощью синхронизации несущей. Из-за крупной коррекции частоты синхронизатор несущей сходится быстро даже при том, что нормированная полоса пропускания установлена в низкую стоимость. Ниже нормированные значения полосы пропускания включают лучшую коррекцию для маленьких остаточных смещений несущей. После применения фазы и частоты возмещает коррекции к полученному сигналу, неоднозначность фазы твердости с помощью преамбул.

Задайте параметры симуляции.

fs = 10000;      % Sample rate (Hz)
sps = 4;         % Samples per symbol
M = 16;          % Modulation order
k = log2(M);     % Bits per symbol
rng(1996)        % Set seed for repeatable results
barker = comm.BarkerCode(...
    'Length',13,'SamplesPerFrame',13);  % For preamble
msgLen = 1e4;
numFrames = 10;
frameLen = msgLen/numFrames;    

Сгенерируйте полезные нагрузки данных и добавьте преамбулу в каждую систему координат. Преамбула позже используется для разрешения неоднозначности фазы.

preamble = (1+barker())/2;  % Length 13, unipolar
data = zeros(msgLen, 1);
for idx = 1 : numFrames
    payload = randi([0 M-1],frameLen-barker.Length,1);
    data((idx-1)*frameLen + (1:frameLen)) = [preamble; payload];
end

Создайте Системный объект для фильтрации формы импульса передачи, получить импульсной фильтрации формы, крупной компенсации частоты QAM, синхронизации несущей и схемы созвездия.

txFilter = comm.RaisedCosineTransmitFilter( ...
    'OutputSamplesPerSymbol',sps);
rxFilter = comm.RaisedCosineReceiveFilter(...
    'InputSamplesPerSymbol',sps,'DecimationFactor',sps);
coarse = comm.CoarseFrequencyCompensator('SampleRate',fs, ...
    'FrequencyResolution',10);
fine = comm.CarrierSynchronizer( ...
    'DampingFactor',0.4,'NormalizedLoopBandwidth',0.001, ...
    'SamplesPerSymbol',1,'Modulation','QAM');
axislimits = [-6 6];
constDiagram = comm.ConstellationDiagram('ReferenceConstellation',qammod(0:M-1,M), ...
    'ChannelNames',{'Before convergence','After convergence'}, ...
    'ShowLegend',true,'XLimits',axislimits,'YLimits',axislimits);

Также создайте Системный объект для канала AWGN, и фазу и смещение частоты, чтобы добавить ухудшения в сигнал. Смещение фазы, больше, чем 90 градусов, добавляется, чтобы вызвать неоднозначность фазы, которая приводит к сдвигу квадранта созвездия.

ebn0 = 8;
freqoffset = 110;
phaseoffset = 110;
awgnChannel = comm.AWGNChannel('EbNo',ebn0, ...
    'BitsPerSymbol',k,'SamplesPerSymbol',sps);
pfo = comm.PhaseFrequencyOffset('FrequencyOffset',freqoffset, ...
    'PhaseOffset',phaseoffset,'SampleRate',fs);

Сгенерируйте случайные символы данных, примените 16-QAM модуляцию и передайте модулируемый сигнал через формирующий фильтр импульса передачи.

txMod = qammod(data,M);
txSig = txFilter(txMod);

Примените фазу и смещения частоты с помощью pfo Системный объект, и затем передает сигнал через канал AWGN, чтобы добавить белый Гауссов шум.

txSigOffset = pfo(txSig);
rxSig = awgnChannel(txSigOffset);

Крупный Системный объект компенсатора частоты обеспечивает грубую коррекцию для смещения частоты. Для условий в этом примере, корректируя смещение частоты полученной коррекции сигнала к в 10 Гц переданного сигнала достаточно.

syncCoarse = coarse(rxSig);

Передайте сигнал через получить импульсный формирующий фильтр и примените прекрасную коррекцию частоты.

rxFiltSig = fine(rxFilter(syncCoarse));

Отобразите схему созвездия первых и последних 1 000 символов в сигнале. Перед сходимостью цикла синхронизации спиральная природа схемы указывает, что смещение частоты не корректируется. После того, как синхронизатор несущей сходился к решению, символы выравниваются со ссылочным созвездием.

constDiagram([rxFiltSig(1:1000) rxFiltSig(9001:end)])

Демодулируйте сигнал. Объясните задержку сигнала, вызванную передачей, и получите фильтры, чтобы выровнять принятые данные с передаваемыми данными. Вычислите и отобразите общие битовые ошибки и BER. При проверке битовых ошибок используйте более поздний фрагмент полученного сигнала быть уверенными, что цикл синхронизации сходился.

rxData = qamdemod(rxFiltSig,M);
delay = (txFilter.FilterSpanInSymbols + rxFilter.FilterSpanInSymbols) / 2;
idxSync = 2000; % Check BER for the received signal after the synchronization loop has converged
[syncDataTtlErr,syncDataBER] = biterr(data(idxSync:end-delay),rxData(idxSync+delay:end))
syncDataTtlErr = 16116
syncDataBER = 0.5042

В зависимости от случайных используемых данных могут быть битовые ошибки, следующие из неоднозначности фазы в полученном сигнале после того, как цикл синхронизации будет сходиться и будет блокировать. В этом случае можно использовать преамбулу, чтобы определить и затем удалить неоднозначность фазы из синхронизируемого сигнала уменьшать битовые ошибки. Если неоднозначность фазы минимальна, количество битовых ошибок может быть неизменным.

idx = 9000 + (1:barker.Length);
phOffset = angle(txMod(idx) .* conj(rxFiltSig(idx+delay)));

phOffsetEst = mean(phOffset);
disp(['Phase offset = ',num2str(rad2deg(phOffsetEst)),' degrees'])
Phase offset = -90.1401 degrees
resPhzSig = exp(1i*phOffsetEst) * rxFiltSig;

Демодулируйте сигнал после решения неоднозначности фазы. Повторно вычислите общие битовые ошибки и BER.

resPhzData = qamdemod(resPhzSig,M);
[resPhzTtlErr,resPhzBER] = biterr(data(idxSync:end-delay),resPhzData(idxSync+delay:end))
resPhzTtlErr = 5
resPhzBER = 1.5643e-04