Сквозная симуляция DVB-S2 с искажениями RF и коррекциями

Этот пример показывает, как измерить вероятность битовой ошибки (BER) и вероятность пакетной ошибки (PER) одного потока цифрового видеовещания спутника второй генерации ( DVB -S2 ссылки, который имеет постоянное кодирование и модуляцию. Пример подробно описывает стратегии синхронизации символа и несущей, подчеркивая, как оценить искажения RF переднего конца в условиях сильного шума. Сигнал с одним потоком добавляет искажения RF переднего конца, а затем пропускает форму волны через аддитивный канал белого Гауссова шума (AWGN).

Введение

DVB-S2 приемники подвергаются большим ошибкам несущей частоты в порядке 20% от входа скорости символа и значительной фазы шума. Использование мощных механизмов прямой коррекции ошибок (FEC), таких как коды Бозе-Чаудхури-Хокквенгема (BCH) и проверки четности низкой плотности (LDPC), заставило DVB-S2 систему работать с очень низкой энергией на символ к коэффициенту спектральной плотности степени шума (Es/No) значения, близкие к пределу Шеннона.

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

Эта схема суммирует пример рабочего процесса.

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

Пример обрабатывает 25 системы координат физического слоя (PL) данных с Es/No установите значение 20 дБ, а затем вычислите BER и PER. Смещение несущей частоты, смещение тактового сигнала дискретизации и фазы помехи применяются к модулированному сигналу, и AWGN добавляется к сигналу.

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

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

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

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

Этот пример загружает MAT-файл с DVB-S2 матрицами четности 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-S2 строение в пилотном режиме

Задайте cfgDVBS2 структура для определения параметров конфигурации DVB-S2 передачи. The ScalingMethod свойство применяется, когда MODCOD находится в области значений [18, 28] (то есть, когда схема модуляции является только APSK). UPL свойство применимо, когда вы устанавливаете StreamFormat в "GS".

cfgDVBS2.StreamFormat = "TS";
cfgDVBS2.FECFrame = "normal";
cfgDVBS2.MODCOD = 18;                             % 16APSK 2/3
cfgDVBS2.DFL = 42960;
cfgDVBS2.ScalingMethod = "Unit average power";
cfgDVBS2.RolloffFactor = 0.35;
cfgDVBS2.HasPilots = true;
cfgDVBS2.SamplesPerSymbol = 2
cfgDVBS2 = struct with fields:
        StreamFormat: "TS"
            FECFrame: "normal"
              MODCOD: 18
                 DFL: 42960
       ScalingMethod: "Unit average power"
       RolloffFactor: 0.3500
           HasPilots: 1
    SamplesPerSymbol: 2

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

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

simParams.sps = cfgDVBS2.SamplesPerSymbol;               % Samples per symbol
simParams.numFrames = 25;                                % Number of frames to be processed
simParams.chanBW = 36e6;                                 % Channel bandwidth in Hertz
simParams.cfo = 3e6;                                     % Carrier frequency offset in Hertz
simParams.sco = 5;                                       % Sampling clock offset in parts per million
simParams.phNoiseLevel = "Low";           % Phase noise level provided as 'Low', 'Medium', or 'High'
simParams. EsNodB = 20;                                   % Energy per symbol to noise ratio in decibels

Эта таблица определяет фазу шумовую маску (dBc/Hz), используемую для генерирования фазы шума, приложенного к переданному сигналу.

Сгенерируйте DVB-S2 сигнал, искаженный искажениями RF

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

[data,txOut,rxIn,rxParams] = HelperDVBS2RxInputGenerate(cfgDVBS2,simParams);

% Received signal constellation plot
rxConst = comm.ConstellationDiagram('Title','Received data', ...
    'XLimits',[-1 1],'YLimits',[-1 1], ...
    'ShowReferenceConstellation',false, ...
    'SamplesPerSymbol',simParams.sps);
rxConst(rxIn(1:length(txOut)))

% Transmitted and received signal spectrum visualization
Rsymb = simParams.chanBW/(1 + cfgDVBS2.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 настройка.

Блок из 36 пилотов повторяется каждые 1476 символов. При оценке крупной частотной ошибки используется 34 из 36 пилот-символов. Отношение используемых пилот-сигналов к блоку (34) и периодичности пилот-сигнала (1476) составляет 0,023. Использование значения 0,023 в качестве коэффициента масштабирования для полосы цикла грубой частотной синхронизации является предпочтительным.

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

При синхронизации системы координат используется заголовок PL. Поскольку синхронизация несущей осуществляется с использованием данных, синхронизация системы координат должна точно обнаруживать начало системы координат. Es/No играет решающую роль в определении точности синхронизации системы координат. Когда модулированные QPSK системы координат восстанавливаются Es/Noзначения ниже 3 дБ, синхронизация системы координат должна выполняться в нескольких системах координат для точного обнаружения.

Оценка тонкой частоты может отслеживать смещения несущей частоты до 4% от скорости входа символов. Оценка тонкой частоты должна обрабатывать несколько пилотных блоков, чтобы смещение остаточной несущей частоты было уменьшено до уровней, приемлемых для алгоритма оценки фазы. Алгоритм оценки фазы может обрабатывать остаточную несущую частоту ошибок менее 0,02% от скорости входа символов. Точная компенсация фазы требуется только для схем модуляции APSK при наличии значительной фазы шума.

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

rxParams.carrSyncLoopBW = 1e-2*0.023;        % Coarse frequency estimator loop bandwidth normalized by symbol rate
rxParams.symbSyncLoopBW = 8e-3;              % Symbol timing synchronizer loop bandwidth normalized by symbol rate
rxParams.symbSyncLock  = 6;                  % Number of frames required for symbol timing error convergence
rxParams.frameSyncLock = 1;                  % Number of frames required for frame synchronization
rxParams.coarseFreqLock = 3;                 % Number of frames required for coarse frequency acquisition
rxParams.fineFreqLock = 6;                   % Number of frames required for fine frequency estimation
rxParams.hasFinePhaseCompensation = false;   % Flag to indicate whether fine phase compensation is used
rxParams.finePhaseSyncLoopBW = 3.5e-4;       % Fine phase compensation loop bandwidth normalized by symbol rate

% Total frames taken for symbol timing and coarse frequency lock to happen
rxParams.initialTimeFreqSync = rxParams.symbSyncLock + rxParams.frameSyncLock + rxParams.coarseFreqLock;
% Total frames used for overall synchronization 
rxParams.totalSyncFrames = rxParams.initialTimeFreqSync + rxParams.fineFreqLock;

% Create time frequency synchronization System object by using
% HelperDVBS2TimeFreqSynchronizer helper object
timeFreqSync = HelperDVBS2TimeFreqSynchronizer( ...
    'CarrSyncLoopBW',rxParams.carrSyncLoopBW, ...
    'SymbSyncLoopBW',rxParams.symbSyncLoopBW, ...
    'SamplesPerSymbol',simParams.sps, ...
    'DataFrameSize',rxParams.xFecFrameSize, ...
    'SymbSyncTransitFrames',rxParams.symbSyncLock, ...
    'FrameSyncAveragingFrames',rxParams.frameSyncLock);

% Create fine phase compensation System object by using
% HelperDVBS2FinePhaseCompensator helper object. Fine phase
% compensation is only required for 16 and 32 APSK modulated frames
if cfgDVBS2.MODCOD >= 18 && rxParams.hasFinePhaseCompensation
    finePhaseSync = HelperDVBS2FinePhaseCompensator( ...
        'DataFrameSize',rxParams.xFecFrameSize, ...
        'NormalizedLoopBandwidth',rxParams.finePhaseSyncLoopBW);
end

normFlag = cfgDVBS2.MODCOD >= 18 && strcmpi(cfgDVBS2.ScalingMethod,'Outer radius as 1');

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

% Initialize data indexing variables
stIdx = 0;
dataSize = rxParams.inputFrameSize;
plFrameSize = rxParams.plFrameSize;
dataStInd = rxParams.totalSyncFrames + 1;
isLastFrame = false;
symSyncOutLen = zeros(rxParams.initialTimeFreqSync,1);

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

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

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

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

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

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

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

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

  7. Декодируйте заголовок PL и вычислите параметры передачи.

  8. Демодулируйте и декодируйте системы координат PL.

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

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

while stIdx < length(rxIn)

    % Use one DVB-S2 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 a reduced loop bandwidth.
    if rxParams.frameCount < rxParams.initialTimeFreqSync
        coarseFreqLock = false;
    else
        coarseFreqLock = true;
    end

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

    % Apply matched filtering, symbol timing synchronization, frame
    % synchronization, and coarse frequency offset compensation.
    [coarseFreqSyncOut,syncIndex,phEst] = timeFreqSync(syncIn,coarseFreqLock);
    if rxParams.frameCount <= rxParams.initialTimeFreqSync
        symSyncOutLen(rxParams.frameCount) = length(coarseFreqSyncOut);
        if any(abs(diff(symSyncOutLen(1:rxParams.frameCount))) > 5)
            error('Symbol timing synchronization failed. The loop will not converge. No frame will be recovered. Update the symbSyncLoopBW parameter according to the EsNo setting for proper loop convergence.');
        end
    end

    rxParams.syncIndex = syncIndex;

    % The PL frame start index lies somewhere in the middle of the chunk 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.
    if isLastFrame
        fineFreqIn = [rxParams.cfBuffer; coarseFreqSyncOut];
    else
        fineFreqIn = [rxParams.cfBuffer; coarseFreqSyncOut(1:rxParams.syncIndex-1)];
    end

    % 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) && ...
            (rxParams.frameCount <= rxParams.totalSyncFrames + 1)
        rxParams.fineFreqCorrVal = HelperDVBS2FineFreqEst( ...
            fineFreqIn(rxParams.pilotInd),rxParams.numPilots, ...
            rxParams.refPilots,rxParams.fineFreqCorrVal);
    end
    if rxParams.frameCount >= rxParams.totalSyncFrames + 1
        fineFreqLock = true;
    else
        fineFreqLock = false;
    end

    if fineFreqLock
        % Normalize the frequency estimate by the input symbol rate
        % freqEst = angle(R)/(pi*(N+1)), where N (18) is the number of elements
        % used to compute the mean of auto correlation (R) in
        % HelperDVBS2FineFreqEst.
        freqEst = angle(rxParams.fineFreqCorrVal)/(pi*(19));

        % Generate the symbol indices using frameCount and plFrameSize.
        % Subtract 2 from the rxParams.frameCount because the buffer used to get one
        % PL frame introduces a delay of one to the count.
        phErr = exp(-1j*2*pi*freqEst*((rxParams.frameCount-2)*plFrameSize:(rxParams.frameCount-1)*plFrameSize-1));
        fineFreqOut = fineFreqIn.*phErr(:);

        % Estimate the phase error estimation by using the HelperDVBS2PhaseEst
        % helper function.
        [phEstRes,rxParams.prevPhaseEst] = HelperDVBS2PhaseEst( ...
            fineFreqOut(rxParams.pilotInd),rxParams.refPilots,rxParams.prevPhaseEst);

        % Compensate for the residual frequency and phase offset by using
        % the
        % HelperDVBS2PhaseCompensate helper function.
        % Use two frames for initial phase error estimation. Starting with the
        % second frame, use the phase error estimates from the previous frame and
        % the current frame in compensation.
        % Add 3 to the frame count comparison to account for delays: One
        % frame due to rxParams.cfBuffer delay and two frames used for phase
        % error estimate.
        if rxParams.frameCount >= rxParams.totalSyncFrames + 3
            coarsePhaseCompOut = HelperDVBS2PhaseCompensate(rxParams.ffBuffer, ...
                rxParams.pilotEst,phEstRes(2),rxParams.pilotInd);
            % MODCOD >= 18 corresponds to APSK modulation schemes
            if cfgDVBS2.MODCOD >= 18 && rxParams.hasFinePhaseCompensation
                phaseCompOut = finePhaseSync(coarsePhaseCompOut);
            else
                phaseCompOut = coarsePhaseCompOut;
            end
        end

        rxParams.ffBuffer = fineFreqOut;
        rxParams.pilotEst = phEstRes;

        % The phase compensation on the data portion is performed by
        % interpolating the phase estimates computed on consecutive pilot
        % blocks. The second phase estimate is not available for the data
        % portion after the last pilot block in the last frame. Therefore,
        % the slope of phase estimates computed on all pilot blocks in the
        % last frame is extrapolated and used to compensate for the phase
        % error on the final data portion.
        if isLastFrame
            pilotBlkLen = 36;    % Symbols
            pilotBlkFreq = 1476; % Symbols
            avgSlope = mean(diff(phEstRes(2:end)));
            chunkLen = rxParams.plFrameSize - rxParams.pilotInd(end) + ...
                rxParams.pilotInd(pilotBlkLen);
            estEndPh = phEstRes(end) + avgSlope*chunkLen/pilotBlkFreq;
            coarsePhaseCompOut1 = HelperDVBS2PhaseCompensate(rxParams.ffBuffer, ...
                rxParams.pilotEst,estEndPh,rxParams.pilotInd);
            % MODCOD >= 18 corresponds to APSK modulation schemes
            if cfgDVBS2.MODCOD >= 18 && rxParams.hasFinePhaseCompensation
                phaseCompOut1 = finePhaseSync(coarsePhaseCompOut1);
            else
                phaseCompOut1 = coarsePhaseCompOut1;
            end
        end
    end

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

    % Update the buffers and counters.
    rxParams.cfBuffer = coarseFreqSyncOut(rxParams.syncIndex:end);
    rxParams.syncIndex = syncIndex;
    rxParams.frameCount = rxParams.frameCount + 1;

    if isValid  % Data valid signal

        % Decode the PL header by using the HelperDVBS2PLHeaderRecover helper
        % function. Start of frame (SOF) is 26 symbols, which are discarded
        % before header decoding. They are only required for frame
        % synchronization.
        rxPLSCode = syncOut(27:90);
        [M,R,fecFrame,pilotStat] = HelperDVBS2PLHeaderRecover(rxPLSCode);
        xFECFrameLen = fecFrame/log2(M);
        % Validate the decoded PL header.
        if M ~= rxParams.modOrder || R ~= rxParams.codeRate || ...
                fecFrame ~= rxParams.cwLen || ~pilotStat
            fprintf('%s\n','PL header decoding failed')
        else % Demodulation and decoding
            for frameCnt = 1:length(syncOut)/rxParams.plFrameSize
                rxFrame = syncOut((frameCnt-1)*rxParams.plFrameSize+1:frameCnt*rxParams.plFrameSize);
                % Estimate noise variance by using
                % HelperDVBS2NoiseVarEstimate helper function.
                nVar = HelperDVBS2NoiseVarEstimate(rxFrame,rxParams.pilotInd,rxParams.refPilots,normFlag);
                % The data begins at symbol 91 (after the header symbols).
                rxDataFrame = rxFrame(91:end);
                % Recover the BB frame.
                rxBBFrame = satcom.internal.dvbs.s2BBFrameRecover(rxDataFrame,M,R, ...
                    fecFrame,pilotStat,nVar,false);
                % Recover the input bit stream by using
                % HelperDVBS2StreamRecover helper function.
                if strcmpi(cfgDVBS2.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 packet error rate 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 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 isLastFrame && ~isFrameLost
                    bitsErr = bitsErr + sum(data((dataStInd-1)*dataSize+1:dataStInd*dataSize) ~= decBits);
                else
                    if ~isFrameLost
                        bitsErr = bitsErr + sum(data((dataStInd-1)*dataSize+1:dataStInd*dataSize) ~= decBits);
                    end
                end
                dataStInd = dataStInd + 1;
            end
        end
    end
    stIdx = endIdx;
end
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
BB header decoding passed.(Number of frames lost = 0)
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',[-2 2],'YLimits',[-2 2], ...
    'ShowReferenceConstellation',false);
syncConst(syncOut)

% Error metrics display
% For GS continuous streams
if strcmpi(cfgDVBS2.StreamFormat,'GS') && ~rxParams.UPL
    if (simParams.numFrames-rxParams.totalSyncFrames == numFramesLost)
        fprintf("All frames are lost. No bits are retrieved from BB frames.")
    else
        ber = bitsErr/((dataStInd-rxParams.totalSyncFrames)*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(cfgDVBS2.StreamFormat,'TS')
            pktLen = 1504;
        else
            pktLen = cfgDVBS2.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 Область значений стандарта DVB-S2 очень низкая, требует, чтобы нормированный цикл полоса пропускания символьного синхронизатора и грубый FLL были очень маленькими для точной оценки. Эти параметры устанавливаются через rxParams.symbSyncLoopBW и rxParams.carrSyncLoopBW.

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

Попробуйте запустить симуляцию с помощью символьной синхронизации, сконфигурированной с нормированного цикла полосой пропускания 1e-4. С шумовыми полосами на этом уровне эта таблица показывает типичное количество систем координат, необходимых для сходимости символьного цикла синхронизации для конкретных схем модуляции и 'normal' Системы координат FEC.

Для 'short'FEC-кадры, количество кадров, используемых для временной синхронизации символа, в три раза превышает количество, необходимое для' normal'FEC-системы координат. Чтобы достичь сходимости цикла синхронизации, отношение rxParams.symbSyncLoopBW/simParams.sps должно быть больше 1e-5. Если цикл символа синхронизации не сходится, попробуйте увеличить rxParams.carrSyncLoopBW .

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

Выбор rxParams.symbSyncLock значение из таблицы, представленной в разделе Configure Symbol Timing Synchronization Parameters. Задайте rxParams.frameSyncLock как значение в области значений [ 5 , 15 ] систем координат на основе Es/No настройка. Если выход отличается от ожидаемого, увеличьте количество систем координат, необходимых для синхронизации систем координат.

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

Попробуйте запустить симуляцию с использованием грубого FLL, сконфигурированного с нормализованной циклом полосой пропускания 1e-4 * 0,023 для сигналов PSK и 4e-4 * 0,023 для сигналов APSK.

Когда вы устанавливаете FECFrame свойство к 'normal', установите rxParams.coarseFreqLock свойство до 20. Когда вы устанавливаете FECFrame свойство к 'short', установите rxParams.coarseFreqLock свойство до 80. Задайте simParams.EsNodB к самой низкой Es/No для выбранной схемы модуляции из ETSI EN 302 307-1, раздел 6 [1]. Для HelperDVBS2TimeFreqSynchronizer системный объект, установите его свойства как обсуждалось в предыдущих разделах на основе выбранного строения.

% timeFreqSync = HelperDVBS2TimeFreqSynchronizer( ...
%    'CarrFreqLoopBW',rxParams.carrSyncLoopBW, ...
%    'SymbTimeLoopBW',rxParams.symbSyncLoopBW, ...
%    'SamplesPerSymbol',simParams.sps, ...
%    'DataFrameSize',rxParams.xFecFrameSize, ...
%    'SymbSyncTransitFrames',rxParams.symbSyncLock, ...
%    'FrameSyncAveragingFrames',rxParams.frameSyncLock)

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

% [out,index,phEst] = timeFreqSync(rxData,false);
% Frequency offset estimate normalized by symbol rate
% freqOffEst = diff(phEst(1:simParams.sps:end))/(2*pi);
% plot(freqOffEst)
% actFreqOff = simParams.cfo/(simParams.chanBW/(1 + cfgDVBS2.RolloffFactor));
% resCoarseCFO = abs(actFreqOff-freqOffEst(end));

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

Для 'normal' FEC системы координат, установите rxParams.fineFreqLock значение до 10. Для 'short' FEC системы координат, установите rxParams.fineFreqLock значение до 40. Замените код в разделе оценки тонкой частотной ошибки этим кодом.

% rxParams.fineFreqCorrVal = HelperDVBS2FineFreqEst(fineFreqIn(rxParams.pilotInd), ...
%         rxParams.numPilots,rxParams.refPilots,rxParams.fineFreqCorrVal);
% fineFreqEst = angle(rxParams.fineFreqCorrVal)/(pi*(19));
% resFineCFO = abs(actFreqOff-freqOffEst(end)-fineFreqEst);

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

Когда остаточное значение CFO (resFineCFO) уменьшается приблизительно до 0,0001 или 0,0002, устанавливает rxParams.frameCount+1 на rxParams.coarseFreqLock значение.

Тонкая компенсация фазы PLL используется только для 16 APSK и 32 APSK схем модуляции с существенной фазой шумом.

После уточнения параметров синхронизации, установленных в rxParams structure, выполните симуляцию BER для обновлённого строения.

Приложение

В примере используются следующие вспомогательные функции:

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

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

  • HelperDVBS2TimeFreqSynchronizer.m: Выполните согласованную фильтрацию, временную синхронизацию символов, системы координат синхронизацию и грубую оценку частоты и коррекцию

  • HelperDVBS2FrameSync.m: Выполните синхронизацию системы координат и обнаружите начало системы координат

  • HelperDVBS2FineFreqEst.m: Оценка смещения мелкой частоты

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

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

  • HelperDVBS2FinePhaseCompensator.m: Выполните тонкое отслеживание ошибок фазы несущей и компенсацию для схем модуляции APSK

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

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

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

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

  1. Стандарт ETSI EN 302 307-1 V1.4.1 (2014-11). Цифровое видеовещание (DVB); Структура кадрирования второй генерации, системы кодирования и модуляции канала для вещания, интерактивные услуги, сбор новостей и другие широкополосные спутниковые приложения (DVB-S2).

  2. Стандарт ETSI TR 102 376-1 V1.2.1 (2015-11). Цифровое видеовещание (DVB); Руководство по реализации системы второй генерации для вещания, интерактивных услуг, сбора новостей и других широкополосных спутниковых приложений (DVB-S2).

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

  4. Э. Касини, Р. Де Гауденци, и Альберто Гинези. DVB‐S2 алгоритмы модема проекта и эффективности по типичным спутниковым каналам. International Journal of Satellite Communications and Networking 22, № 3 (2004): 281-318.

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

См. также

Объекты

Похожие темы

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