Этот пример показывает, как измерить вероятность битовой ошибки (BER) и вероятность пакетной ошибки (PER) одного потока цифрового видеовещания спутника второй генерации ( DVB -S2 ссылки, который имеет постоянное кодирование и модуляцию. Пример подробно описывает стратегии синхронизации символа и несущей, подчеркивая, как оценить искажения RF переднего конца в условиях сильного шума. Сигнал с одним потоком добавляет искажения RF переднего конца, а затем пропускает форму волны через аддитивный канал белого Гауссова шума (AWGN).
DVB-S2 приемники подвергаются большим ошибкам несущей частоты в порядке 20% от входа скорости символа и значительной фазы шума. Использование мощных механизмов прямой коррекции ошибок (FEC), таких как коды Бозе-Чаудхури-Хокквенгема (BCH) и проверки четности низкой плотности (LDPC), заставило DVB-S2 систему работать с очень низкой энергией на символ к коэффициенту спектральной плотности степени шума () значения, близкие к пределу Шеннона.
ETSI EN 302 307-1, Раздел 6, Таблица 13 [1], суммирует требования к эффективности без квази-ошибок (QEF) по каналу AWGN для различных схем модуляции и скоростей кода. Работа область значений для различных режимов передачи может быть рассмотрен как + 2 или -2 дБ от точка, где наблюдается эффективность QEF. Потому что работает Область значений низкий, стратегии временной синхронизации несущей и символа являются сложными проектами задачами.
Эта схема суммирует пример рабочего процесса.
Пример обрабатывает 25 системы координат физического слоя (PL) данных с установите значение 20 дБ, а затем вычислите BER и PER. Смещение несущей частоты, смещение тактового сигнала дискретизации и фазы помехи применяются к модулированному сигналу, и AWGN добавляется к сигналу.
В приемнике после согласованной фильтрации выполняются операции синхронизации и восстановления несущей для восстановления передаваемых данных. Для извлечения систем координат PL искаженная форма волны обрабатывается с помощью различных стратегий синхронизации и восстановления несущей для извлечения систем координат PL. Алгоритмы восстановления несущей управляются. Для декодирования систем координат данных параметры передачи физического слоя, такие как схема модуляции, скорость кода и тип системы координат FEC, восстанавливаются из заголовка PL. Чтобы регенерировать вход поток битов, заголовок основной полосы (BB) декодируется.
Поскольку стандарт DVB-S2 поддерживает пакетированный и непрерывный режимы передачи, системы координат BB может быть либо конкатенацией пользовательских пакетов, либо потоком бит. Заголовок BB восстанавливается, чтобы определить режим передачи. Если система координат BB является конкатенацией пользовательских пакетов, состояние проверки пакетной циклической избыточности (CRC) каждого пакета возвращается вместе с декодированными битами, и затем измеряются PER и BER.
Эти блоки показывают рабочие процессы синхронизации и восстановления входных битов.
Этот пример загружает 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
Задайте 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 сигнал, используйте 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), уменьшает смещение частоты до уровня, который может отслеживать оценщик мелкой частоты. Предпочтительный цикл полоса для синхронизации символа и компенсации грубой частоты зависит от настройка.
Блок из 36 пилотов повторяется каждые 1476 символов. При оценке крупной частотной ошибки используется 34 из 36 пилот-символов. Отношение используемых пилот-сигналов к блоку (34) и периодичности пилот-сигнала (1476) составляет 0,023. Использование значения 0,023 в качестве коэффициента масштабирования для полосы цикла грубой частотной синхронизации является предпочтительным.
Когда вы уменьшаете , можно уменьшить шумовую полосу цикла, чтобы отфильтровать больше шума во время сбора. Количество систем координат, необходимых для сходимости синхронизатора символов и грубого FLL, зависит от настройки полосы пропускания цикла.
При синхронизации системы координат используется заголовок PL. Поскольку синхронизация несущей осуществляется с использованием данных, синхронизация системы координат должна точно обнаруживать начало системы координат. играет решающую роль в определении точности синхронизации системы координат. Когда модулированные QPSK системы координат восстанавливаются значения ниже 3 дБ, синхронизация системы координат должна выполняться в нескольких системах координат для точного обнаружения.
Оценка тонкой частоты может отслеживать смещения несущей частоты до 4% от скорости входа символов. Оценка тонкой частоты должна обрабатывать несколько пилотных блоков, чтобы смещение остаточной несущей частоты было уменьшено до уровней, приемлемых для алгоритма оценки фазы. Алгоритм оценки фазы может обрабатывать остаточную несущую частоту ошибок менее 0,02% от скорости входа символов. Точная компенсация фазы требуется только для схем модуляции APSK при наличии значительной фазы шума.
Эти настройки назначены в rxParams
структура для обработки синхронизации. Для получения дополнительной информации о том, как задать эти параметры для низких значения см. в разделе «Дальнейшие исследования».
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 выборки формы волны обрабатываются по одной системе координат за раз путем выполнения этих шагов.
Примените согласованную фильтрацию, выводя из расчета две выборки на символ.
Применить временную синхронизацию символа с помощью детектора временных ошибок Гарднера с выходом, сгенерированным со скоростью символа. TED Гарднера не управляется данными, поэтому он выполняется перед синхронизацией поставщика услуг.
Примените систему координат синхронизацию, чтобы обнаружить начало системы координат и идентифицировать положения пилот-сигнала.
Оцените и примените грубую коррекцию смещения частоты.
Оцените и примените коррекцию смещения тонкой частоты.
Оцените и компенсируйте остаточные частоту несущей и фазовый шум.
Декодируйте заголовок PL и вычислите параметры передачи.
Демодулируйте и декодируйте системы координат PL.
Выполните проверку CRC заголовка BB, если проверка прошла, восстановите параметры заголовка.
Перегенерируйте входной поток данных или пакетов из систем координат 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
Работа Область значений стандарта 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 ] систем координат на основе настройка. Если выход отличается от ожидаемого, увеличьте количество систем координат, необходимых для синхронизации систем координат.
Попробуйте запустить симуляцию с использованием грубого FLL, сконфигурированного с нормализованной циклом полосой пропускания 1e-4 * 0,023 для сигналов PSK и 4e-4 * 0,023 для сигналов APSK.
Когда вы устанавливаете FECFrame
свойство к 'normal'
, установите rxParams.coarseFreqLock
свойство до 20. Когда вы устанавливаете FECFrame
свойство к 'short'
, установите rxParams.coarseFreqLock
свойство до 80. Задайте simParams.EsNodB
к самой низкой для выбранной схемы модуляции из 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 и восстановите входной поток из системы координат на основе параметров заголовка
Стандарт ETSI EN 302 307-1 V1.4.1 (2014-11). Цифровое видеовещание (DVB); Структура кадрирования второй генерации, системы кодирования и модуляции канала для вещания, интерактивные услуги, сбор новостей и другие широкополосные спутниковые приложения (DVB-S2).
Стандарт ETSI TR 102 376-1 V1.2.1 (2015-11). Цифровое видеовещание (DVB); Руководство по реализации системы второй генерации для вещания, интерактивных услуг, сбора новостей и других широкополосных спутниковых приложений (DVB-S2).
Менгали, Умберто и Альдо Н.Д 'Андреа. Методы синхронизации для цифровых приемников. Нью-Йорк: Пленум Press,1997.
Э. Касини, Р. Де Гауденци, и Альберто Гинези. DVB‐S2 алгоритмы модема проекта и эффективности по типичным спутниковым каналам. International Journal of Satellite Communications and Networking 22, № 3 (2004): 281-318.
Майкл Райс, цифровые коммуникации: подход в дискретном времени. Нью-Йорк: Prentice Hall, 2008.