Сквозная симуляция DVB-S2X с ухудшениями RF и коррекции для систем координат VL-SNR

В этом примере показано, как измерить частоту ошибок по битам (BER), и пакетный коэффициент ошибок (PER) Второго поколения Спутника Цифрового телевидения единого потока расширил (DVB-S2X) ссылку, которая имеет постоянное кодирование и модуляцию для очень низкого сигнала к шумовому отношению (VL-SNR) системы координат. Пример описывает символьную синхронизацию, систему координат и стратегии синхронизации несущей, подробно подчеркивая о том, как оценить ухудшения фронтенда RF при серьезных шумовых условиях. Сигнал единого потока добавляет нарушения фронтенда РЧ и затем передает форму волны через канал аддитивного белого Гауссова шума (AWGN).

Введение

Растущее число терминалов DVB-S2X используется на, обучается, шины, лодки и самолеты. Много приложений, таких как сети датчика, контроль удаленной инфраструктуры, и экстренные службы, требуют повсеместного покрытия и низких скоростей передачи данных. Поддержка этих приложений была поэтому включена в проект DVB-S2X, введя настройки VL-SNR, чтобы увеличить рабочий диапазон, чтобы покрыть текущие и появляющиеся приложения, которые могут извлечь выгоду из операции в очень низком ОСШ. Стандарт DVB-S2X добавил девять дополнительных схем модуляции и кодирования (MODCODs) в области значений BPSK и QPSK. Эти MODCODs позволяют спутниковым сетям иметь дело с тяжелым атмосферным исчезновением и включить использование меньших антенн для приложений в движении (земля, море и воздух).

Эти рисунки показывают эти два формата, используемые для систем координат VL-SNR.

Этот пример проектирует аспекты синхронизации приемника DVB-S2X, используемого для приложений VL-SNR. Пример поддерживает все девять MODCODs, заданные стандартом.

ETSI EN 302 Раздел 307-2 6 Таблиц 20a, Таблица 20b и Таблица 20c [1] обобщает Квазибезошибочное (QEF) требование к производительности по каналу AWGN для различных схем модуляции и скоростей кода. Работа Es/No область значений для приложений VL-SNR рассматривается от-2 дБ до-10 дБ. Поскольку работа Es/No область значений является низкой, несущая, система координат, и стратегии символьной синхронизации бросают вызов проблемам проектирования.

Эта схема обобщает рабочий процесс в качестве примера.

Основной цикл обработки

Пример обрабатывает 20 кадров физического уровня (PL) данных с Es/No установите на 5 дБ, и затем вычислите BER и PER. Смещение несущей частоты, дрейф частоты, смещение символьной синхронизации, смещение частоты выборок и ухудшения шума фазы применяются к модулируемому сигналу, и AWGN добавляется к сигналу. ETSI EN 302 Раздел 307-2 4.4.4 описывает типичные области значений ухудшения RF, используемые при условиях VL-SNR.

Чтобы извлечь системы координат PL, приемник обрабатывает искаженную форму волны посредством различной синхронизации и стратегий восстановления несущей. Прекрасная частота и алгоритмы восстановления фазы несущей помогаются пилотами. Чтобы декодировать системы координат данных, параметры передачи физического уровня, такие как тип набора VL-SNR, MODCOD и тип системы координат FEC восстанавливаются с заголовка VL-SNR. Чтобы регенерировать входной поток битов, основная полоса (BB), заголовок декодируется.

Поскольку стандарт DVB-S2X поддерживает packetized и непрерывные режимы передачи, система координат BB может быть или конкатенацией пользовательских пакетов или потоком битов. Заголовок BB восстанавливается, чтобы определить режим передачи. Если кадры BB является объединенными с пользовательскими пакетами, пакетное состояние контроля циклическим избыточным кодом (CRC) каждого пакета возвращено наряду с декодируемыми битами, и затем PER и BER измеряются.

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

Загрузите набор данных матриц четности DVB-S2X LDPC

Этот пример загружает MAT-файл с матрицами четности DVB-S2X LDPC. Если MAT-файл не доступен на пути MATLAB®, используйте эти команды, чтобы загрузить и разархивировать MAT-файл.

if ~exist('dvbs2xLDPCParityMatrices.mat','file')
    if ~exist('s2xLDPCParityMatrices.zip','file')
        url = 'https://ssd.mathworks.com/supportfiles/spc/satcom/DVB/s2xLDPCParityMatrices.zip';
        websave('s2xLDPCParityMatrices.zip',url);
        unzip('s2xLDPCParityMatrices.zip');
    end
    addpath('s2xLDPCParityMatrices');
end

Настройка DVB-S2X

Задайте cfgDVBS2X структура, чтобы задать параметры конфигурации передачи DVB-S2X. PLSDecimalCode 129 и 131 единственные поддерживаемые форматы, потому что они используются для генерации систем координат VL-SNR.

cfgDVBS2X.StreamFormat = "TS";
cfgDVBS2X.PLSDecimalCode = 129;                   
cfgDVBS2X.CanonicalMODCODName = "QPSK 2/9";
cfgDVBS2X.DFL = 14128;
cfgDVBS2X.RolloffFactor = 0.35;
cfgDVBS2X.SamplesPerSymbol = 2
cfgDVBS2X = struct with fields:
           StreamFormat: "TS"
         PLSDecimalCode: 129
    CanonicalMODCODName: "QPSK 2/9"
                    DFL: 14128
          RolloffFactor: 0.3500
       SamplesPerSymbol: 2

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

Стандарт DVB-S2X поддерживает гибкие полосы пропускания канала. Используйте типичную полосу пропускания канала, такую как 36 МГц. Полоса пропускания канала может варьироваться от 10 МГц до 72 МГц. Грубый алгоритм синхронизации частоты, реализованный в этом примере, может отследить до 20% смещение несущей частоты от скорости входного символа. Символьная скорость вычисляется как B / (1+R), где B является полосой пропускания канала, и R является фактором сглаживания формирующего фильтра. Алгоритмы, реализованные в этом примере, могут откорректировать до 10 ppm.

Эта таблица задает маску шума фазы (дБн/Гц), используемый, чтобы сгенерировать шум фазы, который применяется к переданному сигналу. Эти шумовые маски заданы в Разделе ETSI TR 102 376-1 4.3 [2]. Пиковый Доплер и поддерживаемый дрейф частоты заданы в Разделе ETSI TR 102 376-1 4.4.4.

simParams.sps = cfgDVBS2X.SamplesPerSymbol;    % Samples per symbol
simParams.numFrames = 20;                      % Number of frames to be processed
simParams.chanBW = 36e6;                       % Channel bandwidth in Hertz
simParams.cfo = 3e6;                           % Carrier frequency offset in Hertz due
                                               % to oscillator instabilities
simParams.dopplerRate = 3e3;                   % Doppler rate in Hertz/sec
simParams.peakDoppler = 20e3;                  % Peak doppler shift due to receiver motion
simParams.sco = 10;                            % Sampling clock offset in parts per
                                               % million
simParams.phNoiseLevel = "Level-1";            % Phase noise level
simParams.EsNodB = 5;                          % Energy per symbol to noise ratio

Сгенерируйте форму волны DVB-S2X-VL-SNR, искаженную ухудшениями RF

Чтобы создать форму волны DVB-S2X, используйте HelperDVBS2XVLSNRRxInputGenerate функция помощника с simParams и cfgDVBS2X структуры как входные параметры. Функция возвращает сигнал данных, переданный, и принятые формы волны, параметры конфигурации физического уровня как структура и структура обработки приемника. Принятой форме волны повреждают с несущей частотой, дрейфом частоты, символьной синхронизацией, смещениями частоты выборок и шумом фазы и затем проходят канал AWGN. Приемник, обрабатывающий структуру параметров, rxParams, включает ссылочные экспериментальные поля, экспериментальные индексы, счетчики и буферы. Постройте созвездие полученных символов и спектр переданных и принятых форм волны.

[data,txOut,rxIn,phyConfig,rxParams] = ...
    HelperDVBS2XVLSNRRxInputGenerate(cfgDVBS2X,simParams);
disp(phyConfig)
              FECFrame: "normal"
      ModulationScheme: "QPSK"
    LDPCCodeIdentifier: "2/9"
% Received signal constellation plot
rxConst = comm.ConstellationDiagram('Title','Received data', ...
    'XLimits',[-1 1],'YLimits',[-1 1], ...
    'ShowReferenceConstellation',false, ...
    'SamplesPerSymbol',simParams.sps);
rxConst(rxIn(1:rxParams.plFrameSize*simParams.sps))

% Transmitted and received signal spectrum visualization
Rsymb = simParams.chanBW/(1 + cfgDVBS2X.RolloffFactor);
Fsamp = Rsymb*simParams.sps;
specAn = dsp.SpectrumAnalyzer('SampleRate',Fsamp, ...
    'ChannelNames',{'Transmitted waveform','Received waveform'}, ...
    'ShowLegend',true);
specAn([txOut,rxIn(1:length(txOut))]);

Сконфигурируйте параметры приемника

В приемнике крупная синхронизация частоты выполняется на принятых данных и затем сопровождается согласованной фильтрацией и символьной синхронизацией. Крупная частота и средства оценки символьной синхронизации являются неданными, которым помогают. Алгоритм грубой оценки частоты может отследить смещения несущей частоты до 20% уровня символьной скорости. Грубая оценка частоты, реализованная как замкнутый цикл частоты (FLL) первого порядка, уменьшает смещение частоты к уровню, который может отследить точное средство оценки частоты. Предпочтительная полоса пропускания контура для символьной синхронизации и крупной компенсации частоты зависит от Es/No установка.

Когда вы уменьшаетесь Es/No, уменьшайте полосу пропускания контура, чтобы отфильтровать больше шума во время захвата. Количество кадров, требуемое для синхронизатора символа и грубого FLL, чтобы сходиться, зависит от установки полосы пропускания контура.

Символьная синхронизация сопровождается кадровой синхронизацией и обнаружением формата MODCOD. Кадровая синхронизация использует заголовок VL-SNR. Поскольку прекрасная частота и синхронизация фазы несущей помогаются данными, кадровая синхронизация должна обнаружить запуск системы координат точно.

Прекрасная оценка частоты может отследить смещения несущей частоты до 3,5% уровня символьной скорости. Прекрасная оценка частоты должна обработать несколько экспериментальных блоков для остаточного смещения несущей частоты, которое будет уменьшаться до уровней, приемлемых для алгоритма оценки фазы. Алгоритм оценки фазы может обработать остаточную ошибку несущей частоты меньше чем 0,05% уровня символьной скорости.

Эти настройки присвоены в rxParams структура для обработки синхронизации. Для получения дополнительной информации о том, как установить эти параметры для низко Es/No значения, смотрите раздел Further Exploration.

rxParams.carrSyncLoopBW = 1e-4;          % Coarse frequency estimator loop bandwidth
                                         % normalized by symbol rate
rxParams.symbSyncLoopBW = 1e-4;          % Symbol timing synchronizer loop bandwidth
                                         % normalized by symbol rate  
rxParams.initialTimeFreqSync = 5;        % Number of frames required for coarse frequency
                                         % and symbol timing error convergence
rxParams.fineFreqLock = 4;               % Number of frames required for fine
                                         % frequency estimation
rxParams.NeedSmoothening = false;        % Smoothen the phase estimate

% Total frames used for overall synchronization
rxParams.totalSyncFrames = rxParams.initialTimeFreqSync + rxParams.fineFreqLock;

% Create coarse frequency synchronization System object by using
% HelperDVBS2XVLSNRCoarseFreqSynchronizer helper object
freqSync = HelperDVBS2XVLSNRCoarseFreqSynchronizer('SamplesPerSymbol',simParams.sps, ...
    'NormalizedLoopBandwidth',rxParams.carrSyncLoopBW);

% Create symbol timing synchronization System object by using
% comm.SymbolSynchronizer object
symSync = comm.SymbolSynchronizer('TimingErrorDetector','Gardner (non-data-aided)', ...
    'NormalizedLoopBandwidth',rxParams.symbSyncLoopBW);

% Create matched filter System object by using
% comm.RaisedCosineReceiveFilter object
if simParams.sps == 2
    decFac = 1;
else
    decFac = simParams.sps/(simParams.sps/2);
end
rxFilter = comm.RaisedCosineReceiveFilter( ...
    'RolloffFactor',0.35, ...
     'InputSamplesPerSymbol',simParams.sps,'DecimationFactor',decFac);
b = rxFilter.coeffs;
rxFilter.Gain = sum(b.Numerator);

% Initialize error computing parameters
[numFramesLost,pktsErr,bitsErr,pktsRec] = deal(0);

% Initialize data indexing variables
stIdx = 0;
dataSize = rxParams.inputFrameSize;
plFrameSize = rxParams.plFrameSize;
isLastFrame = false;
rxParams.fineFreqCorrVal = zeros(rxParams.fineFreqLock,1);
[formatIdx,formatIdxTemp] = deal(1);
vlsnrSyncStIdx = 93;
payloadStIdx = 899;
vlSNRFrameLen = plFrameSize - vlsnrSyncStIdx + 1;

Символьная синхронизация и синхронизация несущей и восстановление данных

Чтобы синхронизировать принятые данные и восстановить входной поток битов, обработайте искаженные выборки формы волны DVB-S2X одна система координат за один раз путем выполнения этих шагов.

  1. Примените крупную синхронизацию частоты с помощью сбалансированного quadricorrelator детектора ошибок частоты (BQ-FED) в FLL [5].

  2. Примените согласованную фильтрацию, с использованием двух выборок на символ.

  3. Примените символьную синхронизацию с помощью детектора ошибок Гарднера, с выходной символьной скоростью на скорости символа.

  4. Примените кадровую синхронизацию, чтобы обнаружить запуск системы координат и формата MODCOD, чтобы идентифицировать экспериментальные положения.

  5. Оцените и примените точную коррекцию смещения частоты.

  6. Оцените и компенсируйте остаточную несущую частоту и шум фазы.

  7. Демодулируйте и декодируйте системы координат VL-SNR.

  8. Выполните проверку CRC на заголовке BB, если проверка выполнена, восстановите параметры заголовка.

  9. Регенерируйте входной поток данных или пакетов от систем координат BB.

while stIdx < length(rxIn)

    % Use one DVB-S2X PL frame for each iteration.
    endIdx = stIdx + rxParams.plFrameSize*simParams.sps;

    % In the last iteration, all the remaining samples in the received
    % waveform are considered.
    isLastFrame = endIdx > length(rxIn);
    endIdx(isLastFrame) = length(rxIn);
    rxData = rxIn(stIdx+1:endIdx);

    % After coarse frequency offset loop is converged, the FLL works with
    % previous frequency estimate.
    if rxParams.frameCount < rxParams.initialTimeFreqSync
        coarseFreqLock = false;
    else
        coarseFreqLock = true;
    end

    % Retrieve the last frame samples.
    if isLastFrame
        resSampCnt = plFrameSize*rxParams.sps - length(rxData);
        % Inadequate number of samples to fill last frame
        syncIn = [rxData; zeros(resSampCnt,1)];
    else
        syncIn = rxData;
    end

    % Apply coarse frequency offset compensation.
    [coarseFreqSyncOut,phEst] = freqSync(syncIn,coarseFreqLock);

    % Perform matched filtering and downsample the signal to 2 samples per
    % symbol.
    filtOut = rxFilter(coarseFreqSyncOut);

    % Apply symbol timing synchronization.
    symSyncOut = symSync(filtOut);

    % Apply frame synchronization and identify the MODCOD format. VL-SNR
    % sync frame is detected. PL header preceding the VL-SNR header is
    % ignored.
    if rxParams.frameCount > rxParams.initialTimeFreqSync && ~isLastFrame
        [~,rxParams.syncIndex,formatIdx] = ...
            HelperDVBS2XVLSNRFrameSync(symSyncOut,rxParams.SegLength);
        % MODCOD format identification failure verification
        formatFail = formatIdxTemp ~= rxParams.refFormat;
        if formatFail && ~isLastFrame
            % Update the counters, state variables, and buffers
            stIdx = endIdx;
            rxParams.frameCount = rxParams.frameCount + 1;
            formatIdxTemp = formatIdx;
            rxParams.cfBuffer = symSyncOut(rxParams.syncIndex:end);
            fprintf('%s\n','MODCOD format detection failed')
            continue;
        else
            fprintf('%s\n','MODCOD format detection passed')
            [setNum,phyParams] = getVLSNRParams(formatIdxTemp);
        end
    end

    % The PL frame start index lies somewhere in the middle of the data
    % being processed. From fine frequency estimation onwards, the
    % processing happens as a PL frame. A buffer is used to store symbols
    % required to fill one PL frame. PL frame is considered from
    % the start of VL-SNR header, precisely from the start of the 896 bit
    % length Walsh Hadamard (WH) sequence. 90 represents the PL header
    % length, and 2 accounts for the two zeros appended before the WH sequence.
    fineFreqIn = [rxParams.cfBuffer;...
        symSyncOut(1:vlSNRFrameLen-length(rxParams.cfBuffer))];

    % Estimate the fine frequency error by using the HelperDVBS2FineFreqEst
    % helper function.
    % Add 1 to the conditional check because the buffer used to get one PL
    % frame introduces a delay of one to the loop count.
    if (rxParams.frameCount > rxParams.initialTimeFreqSync + 1)
        % Extract the payload by removing header
        payload = fineFreqIn(payloadStIdx:end); 

        % Get the correlation estimate from the regular 36 length pilot blocks.
        est1 = HelperDVBS2FineFreqEst( ...
            payload(rxParams.regPilotInd),rxParams.regNumPilotBlks, ...
            rxParams.regPilotSeq,rxParams.fineFreqState,36,rxParams.NumLags);

        % Get the correlation estimate from the VL-SNR extra pilot blocks.
        % vlSNRPilotBlk1Params contains the VL-SNR type 1 pilot block
        % length and number of blocks in one frame.
        Lp = rxParams.vlSNRPilotBlk1Params(1);
        est2 = HelperDVBS2FineFreqEst( ...
            payload(rxParams.vlSNRPilotInd1),rxParams.vlSNRPilotBlk1Params(2), ...
            rxParams.vlSNRPilotSeq1,rxParams.fineFreqState,Lp,rxParams.NumLags);

        % vlSNRPilotBlk2Params contains the VL-SNR type 2 pilot block
        % length and number of blocks in one frame.
        Lp = rxParams.vlSNRPilotBlk2Params(1);
        est3 = HelperDVBS2FineFreqEst( ...
            payload(rxParams.vlSNRPilotInd2),rxParams.vlSNRPilotBlk2Params(2), ...
            rxParams.vlSNRPilotSeq2,rxParams.fineFreqState,Lp,rxParams.NumLags);

        estVal = est1 + est2 + est3;
        % Use the correlation values calculated over pilot fields spanning over
        % multiple frames to calculate the fine frequency error estimate.
        % The estimation uses a sliding window technique.
        rxParams.fineFreqCorrVal = [rxParams.fineFreqCorrVal(2:end);estVal];
    end

    if rxParams.frameCount >= rxParams.totalSyncFrames
        fineFreqLock = true;
    else
        fineFreqLock = false;
    end

    if fineFreqLock
        freqEst = angle(sum(rxParams.fineFreqCorrVal))/(pi*(rxParams.NumLags+1));
        ind = (rxParams.frameCount-2)*plFrameSize:(rxParams.frameCount-1)*plFrameSize-1;
        phErr = exp(-1j*2*pi*freqEst*ind).';
        % 92 accounts for the PL header (90), and 2 for zeros appended before the WH
        % sequence.
        fineFreqOut = fineFreqIn(1:vlSNRFrameLen).*phErr(vlsnrSyncStIdx:end);
        % 898 accounts for the 896 length WH sequence, and 2 zeros padded to the
        % header.
        rxPilots = fineFreqOut(rxParams.pilotInd+payloadStIdx-1);
        phErrEst = HelperDVBS2PhaseEst(rxPilots,rxParams.pilotSeq, ...
            rxParams.phErrState,rxParams.IsVLSNR,setNum,rxParams.Alpha);
        if rxParams.NeedSmoothening
            phErrEst =  smoothenEstimate(phErrEst);
        end
        phaseCompOut = HelperDVBS2PhaseCompensate(fineFreqOut(payloadStIdx:end), ...
            phErrEst,rxParams.pilotInd,setNum,rxParams.IsVLSNR);
    end

    % Recover the input bit stream.
    if rxParams.frameCount >= rxParams.totalSyncFrames
        isValid = true;
        syncOut = phaseCompOut;
    else
        isValid = false;
        syncOut = [];
    end

    % Update the buffers and counters.
    rxParams.cfBuffer = symSyncOut(rxParams.syncIndex:end);

    if isValid  % Data valid signal
        % Estimate noise variance by using
        % HelperDVBS2NoiseVarEstimate helper function.
        nVar = HelperDVBS2NoiseVarEstimate(syncOut,rxParams.pilotInd, ...
            rxParams.pilotSeq,false);
        % Recover the BB frame by using HelperDVBS2XBBFrameRecover
        % helper function.
        rxBBFrame = HelperDVBS2XBBFrameRecover(syncOut,phyParams, ...
            rxParams.plScramblingIndex,rxParams.regNumPilotBlks,nVar,true,setNum);
        % Recover the input bit stream by using
        % HelperDVBS2StreamRecover helper function.
        if strcmpi(cfgDVBS2X.StreamFormat,'GS') && ~rxParams.UPL
            [decBits,isFrameLost] = HelperDVBS2StreamRecover(rxBBFrame);
            if ~isFrameLost && length(decBits) ~= dataSize
                isFrameLost = true;
            end
        else
            [decBits,isFrameLost,pktCRC] = HelperDVBS2StreamRecover(rxBBFrame);
            if ~isFrameLost && length(decBits) ~= dataSize
                isFrameLost = true;
                pktCRC = zeros(0,1,'logical');
            end
            % Compute the PER for TS or GS packetized
            % mode.
            pktsErr = pktsErr + numel(pktCRC) - sum(pktCRC);
            pktsRec = pktsRec + numel(pktCRC);
        end
        if ~isFrameLost
            ts = sprintf('%s','BB header decoding passed.');
        else
            ts = sprintf('%s','BB header decoding failed.');
        end
        % Compute the number of frames lost. CRC failure of the
        % baseband header is considered a frame loss.
        numFramesLost = isFrameLost + numFramesLost;
        fprintf('%s(Number of frames lost = %1d)\n',ts,numFramesLost)
        % Compute the bits in error.
        if ~isFrameLost
            dataInd = (rxParams.frameCount-2)*dataSize+1:(rxParams.frameCount-1)*dataSize;
            errs = sum(data(dataInd) ~= decBits);
            bitsErr = bitsErr + errs;
        end
    end

    stIdx = endIdx;
    rxParams.frameCount = rxParams.frameCount + 1;
    formatIdxTemp = formatIdx;
end
MODCOD format detection passed
MODCOD format detection passed
MODCOD format detection passed
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
MODCOD format detection passed
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)

Визуализация и журналы ошибок

Постройте созвездие синхронизируемых данных и вычислите BER и PER.

% Synchronized data constellation plot
syncConst = comm.ConstellationDiagram('Title','Synchronized data', ...
    'XLimits',[-1.7 1.7],'YLimits',[-1.7 1.7], ...
    'ShowReferenceConstellation',false);
syncConst(syncOut)

pause(0.5)
% Error metrics display
% For GS continuous streams
if strcmpi(cfgDVBS2X.StreamFormat,'GS') && ~rxParams.UPL
    if (simParams.numFrames-rxParams.totalSyncFrames == numFramesLost)
        fprintf("All frames are lost. No bits are retrieved from BB frames.")
    else
        numFramesRec = simParams.numFrames - rxParams.totalSyncFrames - numFramesLost;
        ber = bitsErr/(numFramesRec*dataSize);
        fprintf('BER           : %1.2e\n',ber)
    end
else
    % For GS and TS packetized streams
    if pktsRec == 0
        fprintf("All frames are lost. No packets are retrieved from BB frames.")
    else
        if strcmpi(cfgDVBS2X.StreamFormat,'TS')
            pktLen = 1504;
        else
            pktLen = cfgDVBS2X.UPL;      % UP length including sync byte
        end
        ber = bitsErr/(pktsRec*pktLen);
        per = pktsErr/pktsRec;
        fprintf('PER: %1.2e\n',per)
        fprintf('BER: %1.2e\n',ber)
    end
end
PER: 0.00e+00
BER: 0.00e+00

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

Работа Es/No область значений режима VL-SNR, являющегося очень низким, требует, чтобы нормированная полоса пропускания контура синхронизатора символа и грубого FLL очень была мала для точной оценки. Установите эти параметры с помощью rxParams.symbSyncLoopBW и rxParams.carrSyncLoopBW.

Сконфигурируйте крупные параметры синхронизации несущей

Инициализируйте HelperDVBS2XVLSNRCoarseFreqSynchronizer Системный объект с rxParams.carrSyncLoopBW установите как 2e-5 и затем запустите симуляцию.

Когда вы устанавливаете PLSDecimalCode свойство к 129, установите rxParams.initialTimeFreqSync свойство к 15. Когда вы устанавливаете PLSDecimalCode свойство к 131, установите rxParams.coarseFreqLock свойство к 30. Установите simParams.EsNodB к самому низкому Es/No для выбранной схемы модуляции от ETSI EN 302 Раздел 307-1 6 [1].

Замените код в крупном разделе синхронизации частоты с этими строками кода. Запустите симуляцию для различных значений несущей частоты возмещена (CFO). После крупной компенсации частоты просмотрите график и остаточное значение CFO (resCoarseCFO) по каждой системе координат, чтобы наблюдать эффективность алгоритма грубой оценки частоты. Идеально, крупная компенсация частоты уменьшает ошибку до 2% уровня символа. Если остаточная ошибка CFO не уменьшается меньше чем до 2% уровня символа, попытайтесь уменьшить полосу пропускания контура и увеличить rxParams.initialTimeFreqSync. Крупная частота является FLL первого порядка, и она может только обнаружить статическое смещение несущей частоты. Это не может отследить Доплеровские изменения уровня.

% [coarseFreqSyncOut,phEst] = freqSync(syncIn,false);
% Frequency offset estimate normalized by symbol rate
% freqOffEst = diff(phEst(1:simParams.sps:end))/(2*pi);
% plot(freqOffEst)
% Rsym = simParams.chanBW/(1+cfgDVBS2X.RolloffFactor);
% actFreqOff = (simParams.cfo + simParams.peakDoppler)/Rsym;
% resCoarseCFO = abs(actFreqOff-freqOffEst(end));

Когда остаточная несущая частота возместила значение (resCoarseCFO) уменьшается до приблизительно 0,02, установите rxParams.frameCount как rxParams.initialTimeFreqSync значение.

Сконфигурируйте параметры символьной синхронизации

Попытайтесь запустить симуляцию с помощью синхронизатора символьной синхронизации, сконфигурированного с нормированной полосой пропускания контура 1e-4. Достигнуть сходимости цикла синхронизации, отношение rxParams.symbSyncLoopBW/simParams.sps должен быть больше 1e-5. Если цикл символьной синхронизации не сходится, попытайтесь уменьшить rxParams.symbSyncLoopBW.

Сконфигурируйте параметры кадровой синхронизации

Соответствующая кадровая синхронизация зависит от длины сегмента, rxParams.SegLength, который используется, чтобы разделить ссылочные символы заголовка VL-SNR на меньшие сегменты, чтобы выполнить сегмент когерентная корреляция. rxParams.SegLength зависит от остаточного CFO, который присутствует после крупной синхронизации частоты и должен быть меньше round(3 / (8*resCoarseCFO)). Предпочтите использовать значение, которое является целочисленным кратным 896 (длина последовательности VL-SNR WH). Если CFO отсутствует, выполните корреляцию с помощью rxParams.SegLength как 896.

Сконфигурируйте прекрасные параметры синхронизации частоты

Когда вы устанавливаете PLSDecimalCode свойство к 129, установите rxParams.fineFreqLock свойство к 10. Когда вы устанавливаете PLSDecimalCode свойство к 131, установите rxParams.coarseFreqLock свойство к 20. Установите simParams.EsNodB к самому низкому Es/No для выбранной схемы модуляции от ETSI EN 302 Раздел 307-1 6 [1].

Замените код в прекрасном разделе оценки погрешности частоты с этим кодом. Точное средство оценки частоты отслеживает Доплеровские изменения уровня. Чтобы оценить остаточную ошибку CFO, включайте синусоидальное изменение эффекта Доплера, включенного в actFreqOff оценка. Для легкого обходного решения не вводите Доплеровский уровень в ухудшении. Вместо этого добавьте только статический CFO и анализируйте количество кадров, требуемое сгенерировать точную оценку. Как правило, те, которые количество кадров достаточно, чтобы оценить CFO, изменяются из-за Доплеровского уровня. Когда Доплеровские изменения уровня обработаны точным средством оценки частоты, 2*simParams.peakDoppler должен быть меньше области значений оценки точного средства оценки частоты. Область значений оценки зависит от rxParams.NumLags параметр и нормированный CFO, который может быть оценен, даны 1 / (rxParams.NumLags+1). Чтобы увеличить область значений оценки, попытайтесь уменьшать rxParams.NumLags . Вам может быть нужно больше экспериментальных блоков, потому что точность оценки понижается.

% fineFreqEst = angle(sum(rxParams.fineFreqCorrVal))/(pi*(rxParams.NumLags+1));
% resFineCFO = abs(actFreqOff-freqOffEst(end)-fineFreqEst);

Повторите процесс симуляции и наблюдайте остаточное значение CFO (resFineCFO) по каждой системе координат. Если точное средство оценки частоты не уменьшает остаточную ошибку несущей частоты приблизительно до 0,03% уровня символа, попытайтесь увеличить rxParams.fineFreqLock значение свойства.

Когда остаточное значение CFO (resFineCFO) уменьшается до приблизительно 0,0003, обновление rxParams.totalSyncFrames на основе rxParams.initialTimeFreqSyncrxParams и rxParams.fineFreqLock значения.

Сконфигурируйте параметры синхронизации фазы

HelperDVBS2PhaseEstimate оценивает остаточный CFO и ошибку фазы соответственно до-8 дБ Es/Noдля Es/No меньше чем-8 дБ, набор rxParams.Alpha к меньше, чем 0.5 если данные, которые прошли через HelperDVBS2PhaseEstimate имеет только ошибку фазы. Если данные имеют остаточный CFO наряду с ошибкой фазы, сохраните rxParams.Alpha как 1 и набор rxParams.NeedSmoothening как true. Сглаживание улучшает phaseEst полученный из HelperDVBS2PhaseEstimate.

После совершенствования набора параметров синхронизации в rxParams структура, выполните симуляцию BER для обновленной настройки.

Приложение

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

  • HelperDVBS2XVLSNRRxInputGenerate.m: Сгенерируйте выборки формы волны DVB-S2X, искаженные ухудшениями RF и структурой параметров для обработки приемника

  • HelperDVBS2PhaseNoise.m: Сгенерируйте выборки шума фазы для различных масок шума фазы DVB-S2X и примените его к входному сигналу

  • HelperDopplerShift.m: Сгенерируйте синусоидальный различный эффект Доплера и примените его к входному сигналу

  • HelperDVBS2XVLSNRCoarseFreqSynchronizer.m: Выполните крупную оценку смещения частоты и коррекцию

  • HelperDVBS2XVLSNRFrameSync.m: Выполните кадровую синхронизацию и обнаружьте, запускаются заголовка VL-SNR и идентификации MODCOD

  • HelperDVBS2FineFreqEst.m: Оцените прекрасное смещение частоты

  • HelperDVBS2PhaseEst.m: Оцените смещение фазы несущей

  • HelperDVBS2PhaseCompensate.m: Выполните компенсацию фазы несущей

  • HelperDVBS2XPLHeaderRecover.m: Демодулируйте и декодируйте заголовок PL, чтобы восстановить параметры передачи

  • HelperDVBS2NoiseVarEstimate.m: Оцените шумовое отклонение принятых данных

  • HelperDVBS2XBBFrameRecover.m: Выполните дескремблирование PL, демодуляцию, декодируя и восстановите систему координат BB с системы координат PL

  • HelperDVBS2XDemapper.m: Выполните мягкую демодуляцию для всех основанных на DVB-S2X схем модуляции

  • HelperDVBS2XLDPCDecode.m: Выполните LDPC, декодирующий для всего DVB-S2X базирующиеся форматы системы координат LDPC и скорости кода

  • HelperDVBS2XBCHDecode.m: Выполните BCH, декодирующий для всех основанных на DVB-S2X форматов системы координат и скоростей кода

  • HelperDVBS2StreamRecover.m: Выполните проверку CRC заголовка BB и восстановите входной поток с системы координат BB на основе параметров заголовка

  • HelperDVBS2XBitRecover.m: Выполните демодуляцию заголовка PL и декодирование, дескремблирование PL, демодуляцию, декодируя и восстановите систему координат BB. Выполните проверку CRC заголовка BB и восстановите входной поток с системы координат BB.

Библиография

  1. EN 302 307-2 V1.1.1 Стандарта ETSI (2015-11). Цифровое телевидение (DVB); Структура Структурирования Второго поколения, Кодирование Канала и Системы Модуляции для Широковещательной передачи, Interactive Services, Сбора Новостей и других Широкополосных Спутниковых Приложений; Часть 2: расширения DVB-S2 (DVB-S2X).

  2. TR 102 376-2 V1.2.1 Стандарта ETSI (2015-11). Цифровое телевидение (DVB); Инструкции по Реализации для Системы Второго поколения для Широковещательной передачи, Interactive Services, Сбора Новостей и других Широкополосных Спутниковых Приложений; Часть 2: расширения S2 (DVB-S2X).

  3. TR 102 376-1 V1.2.1 Стандарта ETSI (2015-11). Цифровое телевидение (DVB); Инструкции по Реализации для Системы Второго поколения для Широковещательной передачи, Interactive Services, Сбора Новостей и других Широкополосных Спутниковых Приложений (DVB-S2).

  4. Mengali, Умберто и Альдо Н.Д'Андрея. Методы синхронизации для цифровых приемников. Нью-Йорк: нажатие пленума, 1997.

  5. Д'Андреа, A. N. и У. Менгали. “Проект Quadricorrelators для Автоматических Систем управления Частоты”. Транзакции IEEE на Коммуникациях, издании 41, № 6, июнь 1993, стр 988–97.

  6. Казино, E., и др. “Модемный Проект Алгоритмов DVB-S2 и Эффективность по Типичным Спутниковым Каналам”. Международный журнал Спутниковой связи и Организации сети, издания 22, № 3, май 2004, стр 281–318.

  7. Майкл Райс, цифровая связь: подход дискретного времени. Нью-Йорк: Prentice Hall, 2008.

Локальные функции

function [setNum,phyParams] = getVLSNRParams(formatIdx)

tableVLSNR = [4 64800 2/9 0; ...
    2 32400 1/5 0; ...
    2 32400 11/45 0; ...
    2 32400 1/3 0; ...
    2 16200 1/5 1; ...
    2 16200 11/45 1; ...
    2 16200 1/5 0; ...
    2 16200 4/15 0; ...
    2 16200 1/3 0];

params = tableVLSNR(formatIdx,:);
phyParams.ModOrder = params(1);
phyParams.FECFrameLen = params(2);
phyParams.CodeRate = params(3);
[n, d] = rat(phyParams.CodeRate);
phyParams.CodeIDF = [sprintf('%0.0f',n) '/' sprintf('%0.0f',d)];
phyParams.HasPilots = true;
phyParams.HasSpread = params(4);

if formatIdx > 6
    setNum = 2;
else
    setNum = 1;
end
end
% Smoothen the phase estimate using moving average filter
function newEst = smoothenEstimate(est)
errDiff = diff(est(2:end));
thres = -2*sign(mean(errDiff));
width = 5;
if thres > 0
   index = find(errDiff > thres); 
else
  index = find(errDiff < thres);  
end
if ~isempty(index)
    for k = 1:length(index)
        est(index(k)+2:end) = est(index(k)+2:end)-sign(thres)*2*pi;
    end
end
temp = est(2:end);
n = length(temp);
c = filter(ones(width,1)/width,1,temp);
cbegin = cumsum(temp(1:width-2));
cbegin = cbegin(1:2:end)./(1:2:(width-2))';
cend = cumsum(temp(n:-1:n-width+3));
cend = cend(end:-2:1)./(width-2:-2:1)';
c = [cbegin;c(width:end);cend];
newEst = [est(1);c];
end

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

Объекты

Похожие темы

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