В этом примере показано, как измерить частоту ошибок по битам (BER) сквозной цепи Консультативного Комитета по Системам передачи и обработки данных Пробела (CCSDS) гибкая усовершенствованная схема (FACM) кодирования и модуляции телеметрии высокого показателя (TM) система приложений [1].
Данные из различных инструментов сгенерированы в спутнике. Эти данные коллективно называются данными TM. Миссии наземной услуги спутниковой связи исследования (EESS) несут полезные нагрузки, которые производят существенные скорости передачи данных TM, начинающие с нескольких сотен из Мбит/с. Чтобы достигнуть высокого спектрального КПД для таких миссий, кодирование и схемы модуляции должны быть настроены на основе бюджета ссылки. Схема CCSDS FACM высокого показателя приложения TM [1] стандарт поддерживает высокую скорость передачи данных путем принятия последовательных конкатенированных сверточных кодов (SCCC) и схем модуляции от семейства манипулирования сдвига фазы (PSK) и амплитудного манипулирования сдвига фазы (APSK). В этом примере показано, как сгенерировать комплексную основополосную форму волны CCSDS FACM от случайным образом сгенерированных передаваемых кадров (TFs), введите ухудшения радиочастоты (RF) сгенерированному модулированному сигналу и добавьте аддитивный белый Гауссов шум (AWGN) в сигнал, которому повреждают. Затем пример показывает восстановление символьной синхронизации, синхронизацию несущей частоты, демодуляцию и декодирование этого сигнала с шумом, которому повреждают, чтобы получить итоговые биты в форме TFs. Этот пример также показывает, как измерить BER относительно отношения сигнал-шум (SNR) для одной настройки сигнала CCSDS FACM.
Этот пример демонстрирует эти ухудшения RF на сгенерированном модулированном сигнале:
Несущая частота возмещена (CFO)
Доплеровский уровень
Частота дискретизации возмещена (SRO)
Фазовый шум
Этот рисунок показывает процесс приемника, который восстанавливает символьную синхронизацию, несущую частоту и фазу несущей в присутствии ухудшений RF.
В цепи приемника замкнутый цикл частоты (FLL) использует маркер системы координат (FM), который доступен в заголовке физического уровня (PL). Модуль восстановления фазы использует экспериментальные поля, чтобы восстановить фазу. Поскольку алгоритм восстановления фазы основан на пилотах, необходимо позволить экспериментальным полям для примера работать. Модуль восстановления фазы может терпеть некоторую сумму остаточного CFO, который оставляют после операции FLL.
Этот рисунок показывает структуру системы координат PL формы волны FACM. В одной системе координат PL существуют 16 разделов кодовой комбинации (CWS), и каждый раздел кодовой комбинации формируется из каждого энкодера SCCC выход. Используйте ccsdsTMWaveformGenerator
Системный объект, чтобы сгенерировать форму волны FACM.
Этот пример показывает различную визуализацию, такую как графики созвездия и спектр сигнала. Можно опционально отключить эту визуализацию. В данном примере включите им.
showVisualizations = true;
Установите параметры конфигурации, которые управляют свойствами формы волны.
sps = 2; % Samples per symbol (SPS) rolloff = 0.35; % Filter roll-off factor cfgCCSDSFACM.NumBytesInTransferFrame = 223; cfgCCSDSFACM.SamplesPerSymbol = sps; cfgCCSDSFACM.RolloffFactor = rolloff; cfgCCSDSFACM.FilterSpanInSymbols = 10; cfgCCSDSFACM.ScramblingCodeNumber = 1; cfgCCSDSFACM.ACMFormat = 1; cfgCCSDSFACM.HasPilots = true; % HasPilots must be set to true % for this example to work
Задайте параметры симуляции в simParams
структура. Задайте ОСШ в дБ как энергия на символ к отношению шумовой мощности (Es/No) в EsNodB
поле .
simParams.EsNodB = 1;
Задайте CFO и SRO. CFO модели с помощью comm.PhaseFrequencyOffset
Системный объект. Смоделируйте смещение частоты дискретизации, использует comm.SampleRateOffset
Системный объект.
simParams.CFO = 1e6; % In Hz simParams.SRO = 20; % In PPM
Задайте фактор затухания для сигнала. В случае никакого затухания задайте это значение как 1
.
simParams.AttenuationFactor = 0.1; % Must be less than or equal to 1
Задайте количество систем координат PL, которые будут сгенерированы путем определения количества кадров для начальной синхронизации, которые не считаются в вычислении BER и количестве кадров, которые считаются в вычислениях BER. В этом примере, набор simParams.NumFramesForBER
к 10, чтобы завершить симуляцию рано. Чтобы видеть соответствующее значение BER, установите это значение к 200.
% Initialize the number of frames used for synchronization simParams.InitalSyncFrames = 15; % Initialize the number of frames that are used for calculation of BER simParams.NumFramesForBER = 10; simParams.NumPLFrames = simParams.InitalSyncFrames + simParams.NumFramesForBER;
Задайте уровень символа и выборки на символ (SPS).
simParams.SymbolRate = 100e6; % 100 MBaud
simParams.SPS = sps;
Calculate Latency and Doppler in a Satellite Scenario
пример показывает, как эффект Доплера изменяется со временем на основе спутниковой орбиты. Эффект Доплера следует за синусоидальной кривой с пиковым появлением эффекта Доплера, когда спутник начинает становиться видимым к приемнику на земле, или когда спутник отступает. Такое циклическое изменение в эффекте Доплера моделируется как синусоидальный Доплеровский профиль. Текущий пример симулирует Доплеровскую частоту, которая изменяется, как дали в этом уравнении от [2].
пиковый эффект Доплера, и Доплеровский уровень. Задайте эти свойства Доплеровского профиля.
simParams.PeakDoppler = 1e6; % In Hz simParams.DopplerRate = 50e3; % In Hz/Sec
В случае необходимости отключите ухудшения RF для отладки.
simParams.DisableRFImpairments = false; % Disable RF impairments
Чтобы создать форму волны CCSDS FACM, используйте HelperCCSDSFACMRxInputGenerate
функция помощника, с simParams
и cfgCCSDSFACM
структуры как входные параметры. Эта функция использует ccsdsTMWaveformGenerator
Системный объект, чтобы сгенерировать переданную форму волны. Эта функция возвращает сигнал данных, переданные и принятые формы волны и структуру обработки приемника. Принятой форме волны повреждают с несущей частотой, эффектом Доплера, синхронизируя смещения фазы и шум фазы и затем проходят канал AWGN. Приемник, обрабатывающий структуру параметров, rxParams
, включает ссылочные экспериментальные поля и экспериментальные индексы. Постройте созвездие полученных символов и спектр переданных и принятых форм волны.
[bits,txOut,rxIn,phyParams,rxParams] = ... HelperCCSDSFACMRxInputGenerate(cfgCCSDSFACM,simParams); if showVisualizations == true % Plot the received signal constellation rxConst = comm.ConstellationDiagram('Title','Received data', ... 'XLimits',[-1 1],'YLimits',[-1 1], ... 'ShowReferenceConstellation',true, ... 'SamplesPerSymbol',simParams.SPS); % Calculate the reference constellation for the specified ACM format. refConstellation = HelperCCSDSFACMReferenceConstellation(cfgCCSDSFACM.ACMFormat); rxConst.ReferenceConstellation = refConstellation; rxConst(rxIn(1:rxParams.plFrameSize*sps)) % Plot the transmitted and received signal spectrum Fsamp = simParams.SymbolRate*simParams.SPS; scope = dsp.SpectrumAnalyzer('SampleRate',Fsamp, ... 'ChannelNames',{'Transmitted waveform','Received waveform'}, ... 'ShowLegend',true); scope([txOut,rxIn(1:length(txOut))]); end
Создайте квадратный корень повысил косинус (SRRC), получают фильтр.
rxFilterDecimationFactor = sps/2; rrcfilt = comm.RaisedCosineReceiveFilter( ... 'RolloffFactor',double(rolloff), ... 'FilterSpanInSymbols',double(cfgCCSDSFACM.FilterSpanInSymbols), ... 'InputSamplesPerSymbol',sps, ... 'DecimationFactor',rxFilterDecimationFactor); b = coeffs(rrcfilt); % |H(f)| = 1 for |f| < fN(1-alpha), as per Section 6 in the standard [1] rrcfilt.Gain = sum(b.Numerator);
Создайте Системный объект символьной синхронизации, comm.SymbolSynchronizer
.
% Initialize the detector gain. See Eq 8.47 in Digital communications by % Michael Rice [3]. Kp = 1/(pi*(1-((rolloff^2)/4)))*sin(pi*rolloff/2); symsyncobj = comm.SymbolSynchronizer( ... 'DampingFactor',1/sqrt(2), ... 'DetectorGain',Kp, ... 'TimingErrorDetector','Gardner (non-data-aided)', ... 'Modulation','PAM/PSK/QAM', ... 'NormalizedLoopBandwidth',0.0001, ... 'SamplesPerSymbol',sps/rxFilterDecimationFactor);
Визуализируйте график созвездия после синхронизации и восстановления частоты путем создания comm.ConstellationDiagram
Системный объект.
if showVisualizations == true constelDiag = comm.ConstellationDiagram(); constelDiag.ReferenceConstellation = refConstellation; end
Инициализируйте FLL для синхронизации несущей частоты. Этот рисунок показывает реализацию FLL, как описано в разделе 5.7 в [2]. В этом случае детектор частоты реализован с основанным на быстром преобразовании Фурье (FFT) подходом, где пик в частотном диапазоне указывает на остаточную несущую частоту. Поскольку этот подход ограничивается разрешением БПФ, интерполируйте вокруг пика в частотном диапазоне, чтобы обнаружить остаточную частоту. Поскольку этот подход использует FM, который доступен в заголовке PL, завершите кадровую синхронизацию прежде, чем передать сигнал через FLL. Этот рисунок показывает FLL типа 2, который обрабатывает большие Доплеровские уровни.
Инициализируйте FLL. Когда вы устанавливаете K2
к 0, этот FLL становится FLL типа 1.
fll = HelperCCSDSFACMFLL('SampleRate',simParams.SymbolRate, ... 'K1',0.17,'K2',0);
Инициализируйте локальные переменные для цепи приемника, чтобы работать.
plFrameSize = rxParams.plFrameSize; stIdx = 0; % PL frame starting index % Use one PL frame for each iteration. endIdx = stIdx + plFrameSize*sps; rxParams.ffBuffer = complex(zeros(plFrameSize,1));
Чтобы восстановить данные из полученного сигнала, выполните эти шаги.
Передача полученные основополосные выборки через SRRC получает фильтр.
Выполните символьную синхронизацию. используйте comm.SymbolSynchronizer
Системный объект для символьной синхронизации. SRO компенсируется при выполнении символьной синхронизации.
Примените кадровую синхронизацию, чтобы обнаружить контуры системы координат.
Передайте синхронизируемые символы кадра через FLL. В FLL, наряду с CFO, также прослежены Доплеровский уровень и эффект Доплера.
Оцените и компенсируйте остающееся смещение частоты в FM с помощью ссылочного FM.
Восстановите остаточную фазу с модуля восстановления фазы. Модуль восстановления фазы может терпеть некоторый остаточный CFO.
Оцените, что ОСШ в сигнале при помощи фазы компенсировал FM.
Передайте фазу компенсированный сигнал через цифровой автоматический контроллер усиления (DAGC).
Демодулируйте синхронизируемые символы, чтобы получить мягкие биты.
Выполните SCCC, декодирующий на мягких битах, чтобы получить декодируемые биты. Декодирование SCCC может быть сделано с помощью Системного объекта декодера по опыту вероятности (APP), comm.APPDecoder
.
Восстановите передаваемые кадры с декодируемых битов.
Этот рисунок показывает блок-схему декодера SCCC.
% Initialize the number of symbols in a code block. Assuming pilots are % present in the signal, 15*16 pilots and 8100 data symbols exist in one % code block. n = 8100 + 15*16; % Perform frame synchronization for the first frame outside the loop. % In the last frame, consider all of the remaining samples in the received % waveform. isLastFrame = endIdx > length(rxIn); endIdx(isLastFrame) = length(rxIn); rxData = rxIn(stIdx+1:endIdx); stIdx = endIdx; % Update start index after extracting required data filteredRx = rrcfilt(rxData); % RRC filter syncsym = symsyncobj(filteredRx); % Symbol timing synchronization % Frame synchronization syncidx = HelperCCSDSFACMFrameSync(syncsym,rxParams.RefFM); fineCFOSync = comm.PhaseFrequencyOffset('SampleRate',simParams.SymbolRate); leftOutSym = syncsym(syncidx(1):end); extraBits = []; numIterations = 10; frameIndex = 1; berinfo = struct('NumBitsInError',0, ... 'TotalNumBits',0, ... 'BitErrorRate',0); snrAveragingFactor = 6; % Average over 6 frames to get accurate estimate of SNR SNREst = zeros(snrAveragingFactor,1); idxTemp = 0; G = 1; numFramesLost = 0; fqyoffset = zeros(1000,1); while stIdx < length(rxIn) isFrameLost = false; % Use one PL frame for each iteration. endIdx = stIdx + rxParams.plFrameSize*sps; % In the last frame, consider all of the remaining samples in the received % waveform. isLastFrame = endIdx > length(rxIn); endIdx(isLastFrame) = length(rxIn); rxData = rxIn(stIdx+1:endIdx); stIdx = endIdx; % Update start index after extracting required data if ~isLastFrame % Filter the received data filteredRx = rrcfilt(rxData); % RRC filter % Synchronize the symbol timing syncsym = symsyncobj(filteredRx); % Synchronize the data to the frame boundaries syncidx = HelperCCSDSFACMFrameSync(syncsym,rxParams.RefFM); % Consider one complete PL frame beginning with a header. Append % zeros if data is not sufficient. This situation typically happens % when samples are lost while doing timing synchronization or when % synchronization is lost. tempSym = [leftOutSym;syncsym(1:syncidx(1)-1)]; leftOutSym = syncsym(syncidx(1):end); if length(tempSym)<n*16+320 % 16 code blocks and 320 header symbols fllIn = [tempSym;zeros(n*16+320-length(tempSym),1)]; else % length(tempSym)>=n*16 + 320 fllIn = tempSym(1:n*16+320); end % Track the frequency offset [fllOut,fqyoffset(frameIndex)] = fll(fllIn); % Estimate and compensate the CFO from the FM. cfoEst = HelperCCSDSFACMFMFrequencyEstimate(fllOut(1:256), ... rxParams.RefFM,simParams.SymbolRate); fineCFOSync.FrequencyOffset = -cfoEst; fqysyncedFM = fineCFOSync(fllOut(1:256)); % Estimate and compensate for the phase offset in each frame % independently. Remove the pilots in the process. [noPilotsSym,frameDescriptor] = ... HelperCCSDSFACMPhaseRecovery(fllOut,rxParams.PilotSeq,rxParams.RefFM); agcIn = [frameDescriptor;noPilotsSym]; % Estimate the SNR. See CCSDS 130.11-G-1 Section 5.5 [2]. SNREst(idxTemp+1) = HelperCCSDSFACMSNREstimate(fqysyncedFM(1:256), ... rxParams.RefFM); % Average the estimated SNR over multiple frames finalSNREst = mean(SNREst); idxTemp = mod(idxTemp+1,6); % Pass the signal through DAGC if frameIndex >= snrAveragingFactor [agcRecovered,G] = HelperDigitalAutomaticGainControl(agcIn,finalSNREst,G); else agcRecovered = agcIn; end if showVisualizations == true % Plot the constellation. constelDiag(agcRecovered(:)) end % Recover the ACM format pilots availability indicator. [ACMFormat, hasPilots,decFail] = HelperCCSDSFACMFDRecover(agcRecovered(1:64)); if decFail isFrameLost = true; end if (ACMFormat ~= cfgCCSDSFACM.ACMFormat) || (hasPilots ~= cfgCCSDSFACM.HasPilots) isFrameLost = true; end % Continue further processing only if the frame is not lost. if ~isFrameLost % De-randomize the PL-frame. derandomized = agcRecovered(65:end).*conj(rxParams.PLRandomSymbols(:)); % Demodulate the signal nVar = 1/finalSNREst; demodulated = reshape(HelperCCSDSFACMDemodulate(derandomized,ACMFormat,nVar), ... [],16); fullFrameDecoded = zeros(16*phyParams.K,1); for iCodeWord = 1:16 decoded = HelperSCCCDecode(demodulated(:,iCodeWord),ACMFormat,numIterations); fullFrameDecoded((iCodeWord-1)*phyParams.K+1:iCodeWord*phyParams.K) = ... decoded; end % Extract TFs. [initBits,deccodedBuffer,extraBits] = ... HelperCCSDSFACMTFSynchronize([extraBits;fullFrameDecoded], ... phyParams.ASM, ... phyParams.NumInputBits); PRNSeq = satcom.internal.ccsds.tmrandseq(phyParams.NumInputBits); if ~isempty(deccodedBuffer) finalBits = xor(deccodedBuffer(33:end,:)>0,PRNSeq); else isFrameLost = true; extraBits = []; end end if isFrameLost numFramesLost = numFramesLost + 1; end % Find BER if frameIndex>simParams.InitalSyncFrames && ~isFrameLost berinfo = HelperBitErrorRate(bits,finalBits,berinfo); disp(['frameIndex = ' num2str(frameIndex) '. BER = ' ... num2str(berinfo.BitErrorRate)]) end frameIndex = frameIndex + 1; end end
frameIndex = 16. BER = 0 frameIndex = 17. BER = 0 frameIndex = 18. BER = 0 frameIndex = 19. BER = 0 frameIndex = 20. BER = 0 frameIndex = 21. BER = 0 frameIndex = 22. BER = 0 frameIndex = 23. BER = 0 frameIndex = 24. BER = 0 frameIndex = 25. BER = 0 frameIndex = 26. BER = 0 frameIndex = 27. BER = 0 frameIndex = 28. BER = 0 frameIndex = 29. BER = 0
frameIndex = 30. BER = 0
disp(['ACM format = ' num2str(cfgCCSDSFACM.ACMFormat) '. Es/No(dB) = ' ... num2str(simParams.EsNodB) '. BER = ' num2str(berinfo.BitErrorRate)])
ACM format = 1. Es/No(dB) = 1. BER = 0
Этот график показывает сходимость частоты предполагаемого смещения частоты. Этот график является показами количество кадров, требуемое для FLL сходиться. График показывает, что смещение частоты сходится даже в очень низком ОСШ (Es/No на 0 дБ). Это наблюдение показывает, что FLL может действовать эффективно в низких значениях ОСШ.
if showVisualizations == true plot(fqyoffset(1:frameIndex-1)); grid on ylabel('Estimated Frequency Offset (Hz)') xlabel('Number of Frames') title('Frequency Offset Convergence') end
Этот пример показывает вычисление BER для одного формата ACM в одной точке ОСШ. Запустите симуляции BER для нескольких точек ОСШ и нескольких форматов ACM.
Этот пример использует Es/No в качестве метрики ОСШ. Чтобы преобразовать это в энергию на бит к отношению шумовой мощности (Eb/No), используйте этот код.
% ccsdsWaveGen = ccsdsTMWaveformGenerator('WaveformSource','flexible advanced coding and modulation', ... % 'ACMFormat',cfgCCSDSFACM.ACMFormat); % codeRate = ccsdsWaveGen.info.ActualCodeRate; % modOrder = ccsdsWaveGen.info.NumBitsPerSymbol; % EbNodB = simParams.EsNodB - 10*log10(codeRate) - 10*log10(modOrder);
Пример использует эти файлы помощника:
HelperBitErrorRate.m - Вычислите частоту ошибок по битам
HelperCCSDSFACMDemodulate.m - Демодулируйте полученный сигнал FACM
HelperCCSDSFACMFDRecover.m - Восстановите дескриптор системы координат
HelperCCSDSFACMFLL.m - FLL для восстановления несущей частоты
HelperCCSDSFACMFMFrequencyEstimate.m - Оцените смещение частоты в FM
HelperCCSDSFACMFrameMarker.m - Сгенерируйте ссылочный FM
HelperCCSDSFACMFrameSync.m - Оцените начало системы координат
Фаза HelperCCSDSFACMPhaseRecovery.m - Recover в сигнале
HelperCCSDSFACMReferenceConstellation.m - Сгенерируйте ссылочное созвездие для данного формата ACM
HelperCCSDSFACMRxInputGenerate.m - Сгенерируйте форму волны передатчика, ухудшения модели RF, и добавьте AWGN
HelperCCSDSFACMSNREstimate.m - Оцените ОСШ в полученном сигнале
HelperCCSDSFACMTFSynchronize.m - Синхронизация передаваемого кадра
HelperDigitalAutomaticGainControl.m - Цифровое автоматическое управление усилением
HelperDopplerShift.m - Синусоидальный Доплеровский профиль модели
HelperSCCCDecode.m - Итеративный декодер для SCCC
[1] CCSDS 131.2-B-1. Синяя книга. Выпуск 1. "Гибкая усовершенствованная схема кодирования и модуляции телеметрических приложений высокого показателя". Рекомендация для стандартов системы передачи и обработки данных пробела. Вашингтон, округ Колумбия: CCSDS, март 2012.
[2] CCSDS 130.11-G-1. Зеленая книга. Выпуск 1. "SCCC — сводные данные определения и эффективности". Информационный отчет относительно стандартов системы передачи и обработки данных пробела. Вашингтон, округ Колумбия: CCSDS, апрель 2019.
[3] Рис, Майкл. Цифровая связь: подход дискретного времени. Pearson/Prentice Холл, 2008.