Сквозная симуляция телеметрии 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 относительно отношения сигнал/шум (ОСШ) для одного строения сигнала CCSDS TM. Этот рисунок показывает сквозную цепь симуляции.

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

  • Смещение частоты несущей (CFO)

  • Смещение фазы несущей (CPO)

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

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

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

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

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

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

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

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

Этот пример использует схему QPSK модуляции для генерации и приема сигнала и схему сверточного кодирования скорости 1/2 для канального кодирования. Сквозная цепь этого примера показов может также использоваться для схем канального кодирования, которые заданы в кодах [1]: Reed-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 системы CCSDS TM, выполните следующие шаги.

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

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

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

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

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

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

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

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

  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');

Всегда резервируйте начальные несколько TF для синхронизаторов (временных параметров символа и синхронизаторов частоты несущей), чтобы заблокировать. Этот пример отбрасывает первые 30 TF. Это число может варьироваться в зависимости от ОСШ, при котором работает приемник, и параметров циклов синхронизации, таких как шумовая полоса и коэффициент затухания. Если вы управляете приемником при низком ОСШ и наблюдаете большие ошибки в начальных значениях tfidx, тогда синхронизаторы еще не заблокированы. Для заданных параметров симуляции сбросьте начальные TF при необходимости. Вторые выходные аргументы 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.

См. также

Объекты

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте