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

В этом примере показано, как измерить частоту ошибок по битам (BER) сквозной цепи Консультативного Комитета по Системам передачи и обработки данных Пробела (CCSDS) телеметрия (TM) система. Цепь симуляции следует схемам кодирования и модуляции, которые заданы этими двумя стандартами:

  • Синхронизация TM и Кодирование Канала - CCSDS 131.0-B-3 для схем кодирования канала [1]

  • Радиочастота и Системы Модуляции - Наземные Станции части 1 и Космический корабль - CCSDS 401.0-B-30 для схем модуляции [2]

Введение

Данные из различных инструментов сгенерированы на борту спутник. Эти данные коллективно называются как данные TM. CCSDS задает схемы кодирования и модуляции передачи данных TM от спутника до Наземной станции. Этот пример показывает сквозную симуляцию спутника к Наземной линии связи станции. Пример показывает, как сгенерировать комплексный основополосный CCSDS форма волны TM от случайным образом сгенерированных систем координат передачи (TFs), ввести нарушения радиочастоты (RF) сгенерированному модулированному сигналу и добавить аддитивный белый гауссов шум (AWGN) в сигнал, которому повреждают. Затем пример показывает синхронизацию, демодуляцию и декодирование этого сигнала с шумом, которому повреждают, чтобы получить итоговые биты в форме TFs. Пример также показывает, как измерить BER относительно сигнала к шумовому отношению (ОСШ) для одной настройки сигнала TM CCSDS. Этот рисунок показывает сквозную цепь симуляции.

Этот пример демонстрирует эти нарушения RF:

  • Несущая частота возмещена (CFO)

  • Фаза Carrier возмещена (CPO)

  • Синхронизация символа возмещена (STO)

Этот рисунок показывает операции стороны приемника.

Синхронизация системы координат и шаг обработки декодирования канала выполняют эти три задачи.

  1. Выполните разрешение неоднозначности фазы

  2. Правильно синхронизируйте систему координат с запуском присоединенного синхронизирующего маркера (ASM)

  3. Выполните декодирование канала синхронизируемой системы координат, чтобы получить восстановленный TF

Этот рисунок показывает эти три задачи. Чтобы запуститься, сформируйте банк последовательностей ASM. Каждая последовательность соответствует исходному значению ASM, в котором введена неоднозначность фазы. Коррелируйте каждую из этих последовательностей с демодулируемыми символами. Выберите значение неоднозначности фазы, которое имеет самый высокий пик корреляции. Выполните синхронизацию системы координат с этим процессом корреляции. Процесс, чтобы выполнить корреляцию проиллюстрирован в разделе 9.3.7 в [3]. Этот пример принимает упрощенный алгоритм Massey для синхронизации системы координат. Разрешите неоднозначность фазы на полном наборе демодулируемых символов после того, как процесс синхронизации системы координат будет завершен. Наконец, выполните декодирование канала на этих символах, чтобы получить восстановленный TFs.

Параметры симуляции

Этот пример использует схему модуляции QPSK генерации сигнала и приема и уровня 1/2 сверточная схема кодирования кодирования канала. Сквозная цепь этот пример, показы могут также использоваться для схем кодирования канала, которые заданы в [1]: коды Тростника-Solomon (RS) и каскадные коды. Для сверточных и каскадных кодов этот пример поддерживает уровни 1/2 и 2/3 наряду с импульсной модуляцией кода (PCM) - формат не линия возврата к нулю (NRZ-L). Поддерживаемые схемы модуляции в этом примере являются BPSK и QPSK.

seeConstellation = true;         % Flag to toggle the visualization of constellation
channelCoding = "convolutional"; % Channel coding scheme
transferFrameLength = 1115;      % In bytes corresponding to 223*5
modScheme = "QPSK";              % Modulation scheme
alpha = 0.35;                    % Root raised cosine filter roll-off factor
sps = 8;                         % Samples per symbol

Установите частоты, которые используются для генерации сигнала и значений нарушения RF.

fSym = 2e6; % Symbol rate or Baud rate - this is useful while modeling RF impairments
cfo = 2e5;  % Percentage of symbol rate as CFO

Инициализируйте энергию на бит к шумовому отношению степени (Eb/N0), который используется, чтобы вычислить ОСШ с помощью системных параметров.

EbN0 = 10; % To see a BER curve, run the simulation for 3.2:0.2:5

Инициализируйте параметры, чтобы отключить симуляцию. Параметры устанавливаются на маленькие значения в этом примере, чтобы получить быстрые результаты. Увеличьте эти параметры значение, чтобы получить более сглаженную кривую BER.

maxNumErrors = 1e2;  % Simulation stops after maxNumErrors bit errors
maxNumBits = 1e5;    % Simulation stops after processing maxNumBits irrespective of number of errors
                     % Set maxNumBits = 1e8 for a smoother BER curve
maxFramesLost = 1e2; % Simulation stops after maxFramesLost frames are lost

Системные параметры

Инициализируйте все объекты, которые требуются для надлежащего функционирования сквозной цепи.

Создайте генератор формы волны TM CCSDS этими параметрами при помощи ccsdsTMWaveformGenerator Система object™. Отобразите свойства объекта.

tmWaveGen = ccsdsTMWaveformGenerator("ChannelCoding",channelCoding, ...
    "NumBytesInTransferFrame",transferFrameLength, ...
    "Modulation",modScheme, ...
    "RolloffFactor",alpha, ...
    "SamplesPerSymbol",sps);
disp(tmWaveGen)
  ccsdsTMWaveformGenerator with properties:

             WaveformSource: "synchronization and channel coding"
    NumBytesInTransferFrame: 1115
              HasRandomizer: true
                     HasASM: true
                  PCMFormat: "NRZ-L"

   Channel coding properties:
              ChannelCoding: "convolutional"
      ConvolutionalCodeRate: "1/2"

   Digital modulation and filter properties:
                 Modulation: "QPSK"
         PulseShapingFilter: "root raised cosine"
              RolloffFactor: 0.3500
        FilterSpanInSymbols: 10
           SamplesPerSymbol: 8

  Use get to show all properties

Вычислите ОСШ от Eb/N0 и инициализируйте параметры, связанные с вычислением BER.

rate = tmWaveGen.info.ActualCodeRate;
M = tmWaveGen.info.NumBitsPerSymbol;
numBitsInTF = tmWaveGen.NumInputBits;
snr = EbN0 + 10*log10(rate) + 10*log10(M) - 10*log10(sps); % As signal power is scaled to one while introducing noise, snr value should be reduced by a factor of SPS
numSNR = length(snr);
ber = zeros(numSNR,1);                                     % Initialize the BER parameter
bercalc = comm.ErrorRate; 

Создайте получить объект фильтра при помощи comm.RaisedCosineReceiveFilter Системный объект.

b = rcosdesign(alpha,tmWaveGen.FilterSpanInSymbols,sps);
% |H(f)| = 1  for |f| < fN(1-alpha) - Annex 1 in Section 2.4.17A in [2]
Gain =  sum(b);
rxFilterDecimationFactor = sps/2;
rxfilter = comm.RaisedCosineReceiveFilter("DecimationFactor",rxFilterDecimationFactor, ...
    "InputSamplesPerSymbol",sps, ...
    "RolloffFactor",alpha, ...
    "Gain",Gain);

Частота модели и фаза возмещают при помощи comm.PhaseFrequencyOffset Системный объект. Компенсируйте частоту и смещение фазы в приемнике на двух шагах.

  1. Компенсируйте крупное смещение частоты при помощи comm.CoarseFrequencyCompensator Системный объект.

  2. Компенсируйте прекрасное смещение частоты и смещение фазы при помощи comm.CarrierSynchronizer Системный объект.

phaseOffset = pi/8;
fqyoffsetobj = comm.PhaseFrequencyOffset( ...
    "FrequencyOffset",cfo, ...
    "PhaseOffset",phaseOffset, ...
    "SampleRate",sps*fSym);
coarseFreqSync = comm.CoarseFrequencyCompensator( ...
    "Modulation",modScheme, ...
    "FrequencyResolution",100, ...
    "SampleRate",sps*fSym);
fineFreqSync = comm.CarrierSynchronizer("DampingFactor",1/sqrt(2), ...
    "NormalizedLoopBandwidth",0.0007, ...
    "SamplesPerSymbol",1, ...
    "Modulation",modScheme);

Создайте переменный дробный объект задержки при помощи dsp. Системный объект VariableFractionalDelay, который вводит дробную задержку переданной формы волны. Создайте объект синхронизации символа при помощи comm.SymbolSynchronizer Системный объект, который выполняет временную синхронизацию символа.

varDelay = dsp.VariableFractionalDelay("InterpolationMethod","Farrow");
fixedDelayVal = 10.2;
Kp = 1/(pi*(1-((alpha^2)/4)))*cos(pi*alpha/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);

Демодулируйте и декодируйте полученный сигнал при помощи HelperCCSDSTMDemodulator и HelperCCSDSTMDecoder файлы помощника, соответственно. Отобразите свойства полученных объектов.

demodobj = HelperCCSDSTMDemodulator("Modulation",modScheme,"ChannelCoding",channelCoding);
decoderobj = HelperCCSDSTMDecoder("ChannelCoding",channelCoding, ...
    "NumBytesInTransferFrame",transferFrameLength, ...
    "Modulation",modScheme);
disp(demodobj)
  HelperCCSDSTMDemodulator with properties:

       Modulation: "QPSK"
        PCMFormat: "NRZ-L"
    ChannelCoding: "convolutional"
disp(decoderobj)
  HelperCCSDSTMDecoder with properties:

                      ChannelCoding: "convolutional"
                      HasRandomizer: true
                             HasASM: true
        DisableFrameSynchronization: 0
    DisablePhaseAmbiguityResolution: 0
            NumBytesInTransferFrame: 1115
              ConvolutionalCodeRate: "1/2"
              ViterbiTraceBackDepth: 60
                     ViterbiTrellis: [1x1 struct]
                  ViterbiWordLength: 8
                         Modulation: "QPSK"
                          PCMFormat: "NRZ-L"

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

costellationobj = comm.ConstellationDiagram; % Default view is for QPSK
if strcmp(modScheme,'BPSK')
    costellationobj.ReferenceConstellation = [1, -1]
end

Обработка цепи

Чтобы симулировать сквозную цепь и измерить BER системы TM CCSDS, выполните эти шаги.

  1. Сгенерируйте случайные биты, чтобы сформировать TF.

  2. Сгенерируйте форму волны TM путем передачи TF через ccsdsTMWaveformGenerator Системный объект.

  3. Введите нарушения RF, такие как задержка символа и CFO.

  4. Добавьте, что AWGN к RF повредил сигнал. Этот сигнал с шумом рассматривается полученным сигналом.

  5. Передайте полученный сигнал посредством крупной коррекции частоты, которая выполняет начальную крупную синхронизацию несущей частоты. Крупная оценка частоты сделана с помощью "основанного на БПФ" алгоритма.

  6. Используйте согласованный фильтр (корневой фильтр приподнятого косинуса) с той же настройкой, которая применяется в конце передатчика. Поскольку модуль временной синхронизации символа работает на частоте дискретизации, которая выше, чем уровень символа, комплексные основополосные выборки вниз не производятся к уровню символа после фильтрации. Это вниз производится такой в наименьшем количестве существуют, 2 выборки на символ.

  7. Выполните временную синхронизацию символа при помощи синхронизации детектора ошибок (TED) Гарднера, чтобы удалить смещение синхронизации, которое присутствует в сигнале.

  8. Выполните несущую частоту и отслеживание фазы при помощи comm.CarrierSynchronizer Системный объект, который имеет замкнутый цикл фазы (PLL) типа 2. Этот Системный объект может отследить стационарное смещение несущей частоты. Системный объект также вводит неоднозначность фазы, которая затем удалена модулем синхронизации системы координат.

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

  10. Демодулируйте полученный сигнал и проверьте, что сигнал на уровне символа (то есть, выборки на символ 1).

  11. Выполните синхронизацию системы координат и декодирование канала, чтобы разрешить неоднозначность фазы, синхронизировать систему координат с запуском ASM, и затем декодировать синхронизируемую систему координат, чтобы восстановить TF.

numBitsForBER = 8; % For detecting which frame is synchronized
numMessagesInBlock = 2^numBitsForBER;
for isnr = 1:numSNR
    rng default;                         % Reset for every SNR value to get repeatable results
    reset(bercalc);                      % Reset the comm.ErrorRate object for every SNR point
    berinfo = bercalc(int8(1), int8(1)); % Initialize berinfo to be used before BER is calculated
    tfidx = 1;
    numFramesLost = 0;
    prevdectfidx = 0;
    inputBuffer = zeros(numBitsInTF, 256,"int8");
    while((berinfo(2) < maxNumErrors) && (berinfo(3) < maxNumBits) && (numFramesLost < maxFramesLost))
        seed = randi([0 2^32-1],1,1);    % Generate seed and use in AWGN channel for repeatable simulation

        % Transmitter side processing
        bits = int8(randi([0 1],numBitsInTF-numBitsForBER,1));
        % The first 8 bits correspond to the TF index modulo 256. When
        % synchronization modules are included, there can be few frames
        % where synchronization is lost temporarily and then locks again.
        % In such cases, to calculate the BER, these 8 bits aid in
        % identifying which TF is decoded. If an error in these 8 bits
        % exists, then this error is detected by looking at the difference
        % between consecutive decoded bits. If an error is detected, then
        % that frame is considered lost. Even though the data link layer is
        % out of scope of this example, the data link layer has a similar
        % mechanism. In this example, only for calculating the BER, this
        % mechanism is adopted. The mechanism that is adopted in this
        % example is not as specified in the data link layer of the CCSDS
        % standard. And this mechanism is not specified in the physical
        % layer of the CCSDS standard.
        msg = [de2bi(mod(tfidx-1,numMessagesInBlock),numBitsForBER,"left-msb").';bits];
        inputBuffer(:,mod(tfidx-1,numMessagesInBlock)+1) = msg;
        tx = tmWaveGen(msg);

        % Introduce RF impairments
        cfoInroduced = fqyoffsetobj(tx);                % Introduce CFO
        delayed = varDelay(cfoInroduced,fixedDelayVal); % Introduce timing offset
        rx = awgn(delayed, snr(isnr),'measured',seed);  % Add AWGN

        % Receiver side processing
        coarseSynced = coarseFreqSync(rx);     % Apply coarse frequency synchronization
        filtered = rxfilter(coarseSynced);     % Filter received samples through RRC filter
        TimeSynced = symsyncobj(filtered);     % Apply symbol timing synchronization
        fineSynced = fineFreqSync(TimeSynced); % Track Frequency and phase
        
        % Visualize constellation
        if seeConstellation
            % Plot constellation of first 1000 symbols in a TF so
            % that variable size of fineSynced does not impede the
            % requirement of constant input size for the
            % comm.ConstellationDiagram System object.
            costellationobj(fineSynced(1:1000));
        end

        demodData = demodobj(fineSynced); % Demodulate
        decoded = decoderobj(demodData);  % Perform phase ambiguity resolution, frame synchronization and channel decoding

        % Calculate BER and adjust all buffers accordingly
        dectfidx = bi2de(double(decoded(1:8).'),"left-msb")+1; % See the value of first 8 bits
        if tfidx > 30 % Consider to calculate BER only after 30 TFs are processed
            % As the value of first 8 bits is increased by one in each
            % iteration, if the difference between the current decoded
            % value of decimal value of first 8 bits is not equal to the
            % previous decoded one, then it indicates a frame loss.
            if dectfidx - prevdectfidx ~= 1
                numFramesLost = numFramesLost + 1;
                disp(['Frame lost at tfidx: ' num2str(tfidx) '. Total frames lost: ' num2str(numFramesLost)]);
            else
                berinfo = bercalc(inputBuffer(:,dectfidx),decoded);
                if nnz(inputBuffer(:,dectfidx)-decoded)
                    disp(['Errors occurred at tfidx: ' num2str(tfidx) '. Num errors: ' num2str(nnz(inputBuffer(:,dectfidx) - decoded))])
                end
            end
        end
        prevdectfidx = dectfidx;
        
        % Update tfidx
        tfidx = tfidx + 1;
    end
    fprintf("\n");
    currentBer = berinfo(1);
    ber(isnr) = currentBer;
    disp(['Eb/N0: ' num2str(EbN0(isnr)) '. BER: ' num2str(currentBer) '. Num frames lost: ' num2str(numFramesLost)]);
    
    % Reset objects
    reset(tmWaveGen);
    reset(fqyoffsetobj);
    reset(varDelay);
    reset(coarseFreqSync);
    reset(rxfilter);
    reset(symsyncobj);
    reset(fineFreqSync);
    reset(demodobj);
    reset(decoderobj);
end

Figure Constellation Diagram contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains 2 objects of type line. This object represents Channel 1.

Eb/N0: 10. BER: 0. Num frames lost: 0

Дальнейшее исследование

Этот пример демонстрирует симуляцию BER для сверточных кодов с модуляцией QPSK в присутствии нескольких нарушений RF. Чтобы наблюдать сквозную цепь симуляции для различных сценариев, измените свойства, связанные со схемами кодирования и модуляции канала. Схемы модуляции, которые поддерживаются приемником в этом примере, являются BPSK и QPSK. Схемы кодирования канала, которые поддерживаются приемником в этом примере, не являются ни одним (который не является никаким кодированием канала), RS, сверточные и каскадные коды.

Запустите полную симуляцию BER значением установки Eb/N0 к 3.2:0.2:5 и наблюдайте BER установкой maxNumBits к 1e8. Используйте этот код, чтобы построить результаты BER.

% semilogy(EbN0,ber);
% grid on;
% xlabel('E_b/N_0 (dB)');
% ylabel('BER');
% title('BER plot');

Всегда резервируйте начальные немного TFs для синхронизаторов (синхронизация символа и синхронизаторы несущей частоты), чтобы заблокировать. Этот пример отбрасывает первые 30 TFs. Этот номер может варьироваться на основе ОСШ, в котором приемник действует и параметры циклов синхронизации, таких как пропускная способность цикла и коэффициент затухания. Если вы работаете приемником с низким ОСШ и наблюдаете большие ошибки в начальных значениях tfidx, затем синхронизаторы еще не заблокированы. Для данных параметров симуляции отбросьте начальный TFs как соответствующий. Вторые выходные аргументы comm.CoarseFrequencyCompensator и comm.CarrierSynchronizer Системные объекты содержат информацию, связанную с предполагаемым CFO, который может использоваться, чтобы оценить, заблокированы ли циклы синхронизации или нет.

Приложение

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

  • HelperCCSDSTMDemodulator.m - Выполняет демодуляцию сигналов, которые заданы в CCSDS TM [2]

  • HelperCCSDSTMDecoder.m - Выполняет, разрешение неоднозначности фазы, синхронизация системы координат и декодирование канала кодов, заданных в [1]

Ссылки

[1] Синхронизация TM и кодирование канала. Рекомендация для стандартов системы передачи и обработки данных пробела, CCSDS 131.0-B-3. Синяя книга. Выпуск 3. Вашингтон, округ Колумбия: CCSDS, сентябрь 2017.

[2] Радиочастота и системы модуляции - часть 1: заземлите станции и космический корабль. Рекомендация для стандартов системы передачи и обработки данных пробела, CCSDS 401.0-B-30. Синяя книга. Выпуск 30. Вашингтон, округ Колумбия: CCSDS, февраль 2020.

[3] Синхронизация TM и кодирование канала - сводные данные концепции и объяснения. Сообщите о касающихся стандартах системы передачи и обработки данных пробела, CCSDS 130.1-G-3. Зеленая книга. Выпуск 3. Вашингтон, округ Колумбия: CCSDS, июнь 2020.

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

Объекты

Похожие темы