Сквозная симуляция DVB-S2 с ухудшениями РЧ и коррекцией

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

Введение

Приемники DVB-S2 подвергаются большим ошибкам несущей частоты в порядке 20% уровня символьной скорости и существенного шума фазы. Использование мощных механизмов прямого исправления ошибок (FEC), таких как Боуза — Чоудхури — Хоквингема (БЧХ) и коды с низкой плотностью проверок на четность (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. 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

Эта таблица задает маску шума фазы (дБн/Гц), используемый, чтобы сгенерировать шум фазы, применился к переданному сигналу.

Смещения часов выборки

Чтобы создать форму волны 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 пилотов повторяется каждые 1 476 символов. Крупная оценка погрешности частоты использует 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 значения, смотрите раздел Further Exploration.

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.
        ind = (rxParams.frameCount-2)*plFrameSize:(rxParams.frameCount-1)*plFrameSize-1;
        phErr = exp(-1j*2*pi*freqEst*ind);
        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,rxParams.pilotInd,phEstRes(2));
            % 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,rxParams.pilotInd,estEndPh);
            % 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)/plFrameSize
                rxFrame = syncOut((frameCnt-1)*plFrameSize+1:frameCnt*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.
                bitInd = (dataStInd-1)*dataSize+1:dataStInd*dataSize;
                if isLastFrame && ~isFrameLost
                    bitsErr = bitsErr + sum(data(bitInd) ~= decBits);
                else
                    if ~isFrameLost
                        bitsErr = bitsErr + sum(data(bitInd) ~= 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)

pause(0.5)
% 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 структура, выполните симуляцию 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 и восстановите входной поток с системы координат BB на основе параметров заголовка

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

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

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

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

  4. E. Казино, Р. Де Годанзи и Альберто Джинези. "Модемный проект алгоритмов DVB‐S2 и эффективность по типичным спутниковым каналам". Международный журнал Спутниковой связи и Организации сети 22, № 3 (2004): 281-318.

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

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

Объекты

Похожие темы