Сквозная гибкая усовершенствованная симуляция кодирования и модуляции CCSDS с ухудшениями RF и коррекции

В этом примере показано, как измерить частоту ошибок по битам (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].

f(t)=fDcos(fRfDt)

fD пиковый эффект Доплера, и fR Доплеровский уровень. Задайте эти свойства Доплеровского профиля.

simParams.PeakDoppler = 1e6;  % In Hz
simParams.DopplerRate = 50e3; % In Hz/Sec

В случае необходимости отключите ухудшения RF для отладки.

simParams.DisableRFImpairments = false; % Disable RF impairments

Генерация формы волны CCSDS FACM, искаженной ухудшениями RF

Чтобы создать форму волны 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));

Синхронизация и восстановление данных

Чтобы восстановить данные из полученного сигнала, выполните эти шаги.

  1. Передача полученные основополосные выборки через SRRC получает фильтр.

  2. Выполните символьную синхронизацию. используйте comm.SymbolSynchronizer Системный объект для символьной синхронизации. SRO компенсируется при выполнении символьной синхронизации.

  3. Примените кадровую синхронизацию, чтобы обнаружить контуры системы координат.

  4. Передайте синхронизируемые символы кадра через FLL. В FLL, наряду с CFO, также прослежены Доплеровский уровень и эффект Доплера.

  5. Оцените и компенсируйте остающееся смещение частоты в FM с помощью ссылочного FM.

  6. Восстановите остаточную фазу с модуля восстановления фазы. Модуль восстановления фазы может терпеть некоторый остаточный CFO.

  7. Оцените, что ОСШ в сигнале при помощи фазы компенсировал FM.

  8. Передайте фазу компенсированный сигнал через цифровой автоматический контроллер усиления (DAGC).

  9. Демодулируйте синхронизируемые символы, чтобы получить мягкие биты.

  10. Выполните SCCC, декодирующий на мягких битах, чтобы получить декодируемые биты. Декодирование SCCC может быть сделано с помощью Системного объекта декодера по опыту вероятности (APP), comm.APPDecoder.

  11. Восстановите передаваемые кадры с декодируемых битов.

Этот рисунок показывает блок-схему декодера 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);

Приложение

Пример использует эти файлы помощника:

Ссылки

[1] CCSDS 131.2-B-1. Синяя книга. Выпуск 1. "Гибкая усовершенствованная схема кодирования и модуляции телеметрических приложений высокого показателя". Рекомендация для стандартов системы передачи и обработки данных пробела. Вашингтон, округ Колумбия: CCSDS, март 2012.

[2] CCSDS 130.11-G-1. Зеленая книга. Выпуск 1. "SCCC — сводные данные определения и эффективности". Информационный отчет относительно стандартов системы передачи и обработки данных пробела. Вашингтон, округ Колумбия: CCSDS, апрель 2019.

[3] Рис, Майкл. Цифровая связь: подход дискретного времени. Pearson/Prentice Холл, 2008.

Смотрите также

Объекты

Похожие темы