Компенсация значительной фазы и смещений частоты для 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