Компенсация значительных фазовых и частотных сдвигов для 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
Создайте системный объект для фильтрации формы импульса передачи, фильтрации формы импульса приема, грубой компенсации частоты КАМ, синхронизации несущей и диаграммы созвездия.
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);
Также создайте объект System для канала 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));
Отображение диаграммы созвездий первого и последнего 1000 символов в сигнале. Перед сходимостью контура синхронизации спиральный характер диаграммы указывает на то, что сдвиг частоты не корректируется. После того, как синхронизатор несущей сходится к решению, символы выравниваются по опорной совокупности.
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