主要内容

端到端DVB-S2X模拟,具有规则帧的射频损伤和校正

这个例子展示了如何测量对常规帧具有恒定编码和调制的单流数字视频广播卫星第二代扩展(DVB-S2X)链路的误码率(BER)和包误码率(PER)。该实例详细描述了符号定时和载波同步策略,重点介绍了如何在重噪声条件下估计射频前端损伤。单流信号添加射频前端损害,然后将波形通过加性高斯白噪声(AWGN)通道。

介绍

DVB-S2X标准是DVB-S2规范的扩展,它增强了对核心DVB-S2应用程序的支持,并提高了卫星链路的整体效率。金宝appDVB-S2X标准支持以下额外功能:金宝app

  • 更细粒度的调制和码率

  • 更小的过滤器滚动选项,以更好地利用带宽

  • 线性和非线性信道的星座优化

  • 为关键的同信道干扰场景提供更多的置乱选项

DVB-S2X可满足多种不同的目标应用,接收器根据应用的不同受到不同类型和程度的射频损伤。这个例子设计了DVB-S2X接收器的同步方面,用于核心DVB-S2应用程序。该示例支持较新的码率、较金宝app高的调制方案,如64、128和256 APSK,以及较小的滤波器滚转选项。

ETSI EN 302 307-2 Section 6[1]总结了AWGN信道在不同调制方案和码率下的准无错误(QEF)性能要求。操作 E 年代 / N o 不同传输模式的范围可被认为是+3或-2 dB E 年代 / N o 观察QEF表现的点。因为操作 E 年代 / N o 范围低,载波和符号定时同步策略是具有挑战性的设计问题。

此图总结了示例工作流。

主要处理循环

该示例使用 E 年代 / N o 设置为25db,然后计算BER和PER。对调制信号施加载波频率偏移、采样时钟偏移和相位噪声损害,并在信号中加入AWGN。

在接收机处,在匹配滤波之后,运行定时和载波恢复操作以恢复发送的数据。为了提取PL帧,通过各种定时和载波恢复策略处理失真的波形。载波恢复算法是导频辅助的。为了解码数据帧,从PL报头恢复物理层传输参数,例如调制方案、码率和FEC帧类型。为了重新生成输入比特流,对基带(BB)报头进行解码。

由于DVB-S2X标准支持分组和连续传输模式,BB帧既可以金宝app是用户包的串联,也可以是比特流。恢复BB报头以确定传输模式。如果BB帧是用户数据包的串接,则返回每个数据包的循环冗余检查(CRC)状态和解码位,然后测量PER和BER。

这些框图显示了同步和输入位恢复工作流。

下载DVB-S2X LDPC奇偶校验矩阵数据集

这个例子加载一个带有DVB-S2X LDPC奇偶校验矩阵的mat文件。如果MAT-file在MATLAB®路径上不可用,使用这些命令下载并解压缩MAT-file。

如果~ (“dvbs2xLDPCParityMatrices.mat”“文件”如果~ (“s2xLDPCParityMatrices.zip”“文件”)网址=“https://ssd.mathworks.com/金宝appsupportfiles/spc/satcom/DVB/s2xLDPCParityMatrices.zip”;websave (“s2xLDPCParityMatrices.zip”url);解压缩(“s2xLDPCParityMatrices.zip”);终止目录“s2xLDPCParityMatrices”);终止

DVB-S2X导航辅助模式配置

指定cfgDVBS2X定义DVB-S2X传输配置参数的结构。PLSDecimalCode不支持129和131,因为它们用于生成V金宝appL-SNR帧。只有规则框架是受支撑的。金宝app

cfgDVBS2X。StreamFormat =“t”;cfgDVBS2X。PLSDecimalCode = 191;% 64APSK 7/9带飞行员cfgDVBS2X。分= 50128;cfgDVBS2X。ScalingMethod =“单位平均功率”;cfgDVBS2X。RolloffFactor = 0.35;cfgDVBS2X。SamplesPerSymbol = 2
cfgDVBS2X =结构体字段:StreamFormat:“TS”PLSDecimalCode: 191 DFL: 50128 ScalingMethod:“单位平均功率”RolloffFactor: 0.3500 SamplesPerSymbol: 2

仿真参数

DVB-S2X标准支持灵活的信道带宽。使用金宝app典型的信道带宽,如36 MHz。信道带宽可以变化。本示例中实现的粗略频率同步算法可以跟踪高达输入符号速率11%的载波频率偏移。符号速率计算为B/(1+R),其中B是信道带宽,R是发射滤波器衰减因子。本例中实现的算法可以校正高达10ppm的采样时钟偏移。

simParams。年代ps = cfgDVBS2X.SamplesPerSymbol;每符号样本%simParams。numFrames = 30;%待处理帧数simParams.chanBW=36e6;%信道带宽,单位为赫兹simParams。首席财务官= 2 e6;%以赫兹表示的载波频率偏移simParams。上海合作组织= 2;%采样时钟偏差(ppm)simParams。phNoiseLevel =“低”%相位噪声电平提供为“低”、“中”或“高”simParams。E年代NodB = 25;每符号能量与噪音之比,单位为分贝

本表定义了用于产生应用于传输信号的相位噪声的相位噪声屏蔽(dBc/Hz)。这些噪声屏蔽取自ETSI TR 102 376-1第4.3.2.1.3节图12[2]

产生失真的射频干扰DVB-S2X波形

要创建DVB-S2X波形,请使用HelperDVBS2XRxInputGenerate辅助函数simParamscfgDVBS2X结构作为输入。该函数返回数据信号、发送和接收的波形、作为结构的物理层配置参数和接收器处理结构。接收到的波形会受到载波频率、定时相位偏移和相位噪声的影响,然后通过AWGN通道。接收机处理参数结构,rxParams,包括参考引导字段、引导索引、计数器和缓冲区。绘制接收符号的星座和发射和接收波形的频谱。

(数据、txOut rxIn phyConfig, rxParams] = HelperDVBS2XRxInputGenerate (cfgDVBS2X simParams);disp (phyConfig)
FECFrame: "normal" ModulationScheme: "64APSK" LDPCCodeIdentifier: "7/9"
%接收信号星座图rxConst = comm.ConstellationDiagram (“标题”接收的数据的...“XLimits”[1],“YLimits”[1],...“ShowReferenceConstellation”假的,...“SamplesPerSymbol”,simParams.sps);rxConst(rxIn(1:长度(txOut)))

%发射和接收信号频谱可视化Rsymb = simParams。chanBW / (1 + cfgDVBS2X.RolloffFactor);Fsamp = Rsymb * simParams.sps;specAn = dsp。简介(“SampleRate”,Fsamp,...“ChannelNames”, {传输波形的接收波形的},...“ShowLegend”,真正的);specAn ([txOut rxIn(1:长度(txOut))));

配置接收机参数

在接收端,对接收的数据执行符号定时同步,然后进行帧同步。接收机算法包括粗频和细频减值校正算法。载波频率估计算法可以跟踪高达输入符号速率20%的载波频率偏移。粗频率估计,实现为一个锁频环(FLL),减少频率偏移到一个水平,以精细频率估计器可以跟踪。用于符号定时和粗频率补偿的首选环路带宽取决于 E 年代 / N o 设置。

每1476个符号重复一个由36个导频组成的块。粗频误差估计使用36个导频符号中的34个。每个块(34)使用的导频和导频周期(1476)的比率是0.023。使用0.023值作为粗频同步器环路带宽的比例因子是首选。

当你减少 E 年代 / N o ,降低环路带宽,以滤除采集过程中的更多噪声。符号同步器和粗FLL收敛所需的帧数取决于环路带宽设置。

帧同步使用PL报头。由于载波同步是数据辅助的,帧同步必须准确地检测帧的开始。 E 年代 / N o 对确定帧同步的准确性起着至关重要的作用。当QPSK调制帧在 E 年代 / N o 值小于3db时,必须对多帧进行同步才能准确检测。

优良的频率估计可以跟踪载波频率偏移高达4%的输入符号率。精细的频率估计必须处理多个导频块,以便将残余载波频率偏移降低到相位估计算法可接受的水平。该相位估计算法能够处理输入符号率的0.02%以下的载波频率误差。

这些设置在rxParams用于同步处理的结构。详细说明low的设置方法 E 年代 / N o 值,请参阅进一步的探索部分。

rxParams。carrSyncLoopBW = 1依照* 0.023;%由符号速率归一化的粗频估计环路带宽rxParams。年代ymbSyncLoopBW = 8e-3;%符号定时同步器环路带宽按符号速率标准化rxParams。年代ymbSyncLock = 8;%符号定时误差收敛所需的帧数rxParams.frameSyncLock = 1;%帧同步所需的帧数rxParams。coarseFreqLock = 5;%粗频采集所需的帧数rxParams。fineFreqLock = 4;%精确频率估计所需的帧数%发生符号定时和粗频锁定的总帧数rxParams.initialTimeFreqSync=rxParams.symbSyncLock+rxParams.frameSyncLock+rxParams.grossFreqlock;%用于整体同步的总帧数rxParams。totalSyncFrames = rxParams。initialTimeFreqSync + rxParams.fineFreqLock;%创建时间频率同步系统对象使用%HelperDBS2TimeReqSynchronizer帮助对象timeFreqSync=HelperDVBS2TimeFreqSynchronizer(...“CarrSyncLoopBW”,rxParams.carrSyncLoopBW,...“SymbSyncLoopBW”rxParams.symbSyncLoopBW,...“SamplesPerSymbol”simParams.sps,...“DataFrameSize”rxParams.xFecFrameSize,...“SymbSyncTransitFrames”rxParams.symbSyncLock,...“FrameSyncAveragingFrames”, rxParams.frameSyncLock);%初始化错误计算参数[numFramesLost, pktsErr bitsErr pktsRec] =交易(0);%初始化数据索引变量stIdx = 0;dataSize = rxParams.inputFrameSize;plFrameSize = rxParams.plFrameSize;dataStInd = rxParams。totalSyncFrames + 1;isLastFrame = false;symSyncOutLen = 0 (rxParams.initialTimeFreqSync, 1);

定时和载波同步和数据恢复

为了同步接收到的数据并恢复输入的比特流,按照以下步骤对失真的DVB-S2X波形采样逐帧处理。

  1. 应用匹配滤波,以每个符号两个样本的速率输出。

  2. 使用Gardner定时错误检测器应用符号定时同步,输出按符号速率生成。Gardner TED没有数据辅助,所以它是在载波同步之前执行的。

  3. 应用帧同步来检测帧的开始和识别导频位置。

  4. 估计和应用粗频偏校正。

  5. 估计和应用精细的频率偏移校正。

  6. 估计和补偿剩余载波频率和相位噪声。

  7. 解码PL报头并计算传输参数。

  8. 解调和解码PL帧。

  9. 对BB报头进行CRC检查,如果检查通过,恢复报头参数。

  10. 从BB帧重新生成数据或数据包的输入流。

stIdx <长度(rxIn)%每次迭代使用一个DVB-S2X PL帧。endIdx = stIdx + rxParams.plFrameSize*simParams.sps;%在最后一次迭代中,接收到的所有剩余样本%波形被考虑。isLastFrame = endIdx > length(rxIn);endIdx长度(isLastFrame) = (rxIn);rxData = rxIn (stIdx + 1: endIdx);%在粗频偏环收敛后,FLL工作在减小环路带宽的情况下。如果rxParams.frameCount < rxParams。initialTimeFreqSync粗糙freqlock = false;其他的coarseFreqLock = true;终止%检索最后一帧样本。如果isLastFrame resSymb = plFrameSize - length(rxParams.cfBuffer);resSampCnt = resSymb * rxParams。sps -长度(rxData);如果resSampCnt > = 0%填充最后一帧的样本数量不足syncIn = [rxData;0 (resSampCnt 1)];其他的%剩余样本可填充最后一帧syncIn = rxData (1: resSymb * rxParams.sps);终止其他的syncIn=rxData;终止%应用匹配过滤,符号定时同步,帧%同步,并进行粗频偏补偿。[coarseFreqSyncOut, syncIndex, ph值]= timeFreqSync (syncIn coarseFreqLock);如果rxParams.frameCount < = rxParams。initaltimefreqsync symSyncOutLen(rxParams.frameCount) = length(coarseFreqSyncOut);如果任何(abs(diff(symSyncOutLen(1:rxParams.frameCount)))) > 5)错误('符号定时同步失败。环路不会收敛。没有帧将被恢复。根据EsNo设置更新symbSyncLoopBW参数,以使循环收敛。);终止终止rxParams。年代yncIndex = syncIndex;% PL帧开始索引位于正在处理的块的中间位置。%从精细的频率估计开始,处理作为PL帧进行。%缓冲区用于存储填满一个PL帧所需的符号。如果isLastFrame fineFreqIn = [rxParams.cfBuffer;coarseFreqSyncOut];其他的fineFreqIn = [rxParams.cfBuffer;coarseFreqSyncOut (1: rxParams.syncIndex-1)];终止%使用HelperDVBS2FineFreqEst估计精细频率误差% helper函数。%在条件检查中添加1,因为用于获取PL帧的缓冲区对循环引入了1的延迟%计算。如果(rxParams.frameCount > rxParams。initialTimeFreqSync + 1) &&...(rxParams.frameCount < = rxParams。totalSyncFrames + 1) rxParams。fineFreqCorrVal = HelperDVBS2FineFreqEst (...rxParams.numPilotBlks fineFreqIn (rxParams.pilotInd),...rxParams.refPilots rxParams.fineFreqCorrVal);终止如果rxParams.frameCount > = rxParams。totalSyncFrames + 1 fineFreqLock = true;其他的fineFreqLock = false;终止如果fineFreqLock将输入符号速率估计的频率归一化%frequest=角度(R)/(pi*(N+1)),其中N(18)是元素的数量%用于计算中自相关(R)的平均值% HelperDVBS2FineFreqEst。频率=角(rxParams.fineFreqCorrVal) /(π* (19));%使用frameCount和plFrameSize生成符号索引。%从rxParams.frameCount中减去2,因为缓冲区用来得到1% PL帧对计数引入了1的延迟。phErr = exp (1 j * 2 *π*频率* ((rxParams.frameCount-2) * plFrameSize: (rxParams.frameCount-1) * plFrameSize-1));fineFreqOut = fineFreqIn。* phErr (:);%使用HelperDVBS2PhaseEst估计相位误差% helper函数。[phEstRes,rxParams.prevPhaseEst]=HelperDBBS2PhaseEst(...fineFreqOut (rxParams.pilotInd)、rxParams.refPilots rxParams.prevPhaseEst);%补偿剩余的频率和相位偏移%的%HelperDVBS2PhaseCompensate helper函数。%使用两帧进行初始相位误差估计%第二帧,使用前一帧的相位误差估计值,然后补偿当前帧。%在帧数比较中增加3以考虑延迟:1%帧由于rxParams。cfBuffer延迟和两个用于相位的帧%的错误估计。如果rxParams.frameCount > = rxParams。totalSyncFrames + 3 phaseCompOut = helperdvbs2phasecompout (rxParams.ffBuffer,...rxParams.pilotEst phEstRes (2) rxParams.pilotInd);终止rxParams。ffBuffer = fineFreqOut;rxParams。飞行员= phEstRes;%数据部分上的相位补偿由以下步骤执行:%插值在连续导频上计算的相位估计%街区。第二阶段估算不适用于该数据%最后一帧中最后一个导频块之后的部分。因此%在系统中所有导频块上计算的相位估计斜率最后一帧是外推的,用来补偿相位最终数据部分的%错误。如果isLastFrame pilotBlkLen=36;%符号pilotBlkFreq=1476;%符号avgSlope =意味着(diff (phEstRes(2:结束)));chunkLen = rxParams。plFrameSize - rxParams.pilotInd(end) +...rxParams.pilotInd (pilotBlkLen);estEndPh = phEstRes(end) + avgSlope*chunkLen/pilotBlkFreq;phaseCompOut1 = HelperDVBS2PhaseCompensate (rxParams.ffBuffer,...rxParams.pilotEst,estEndPh,rxParams.Pilotin);终止终止%恢复输入位流。如果rxParams.frameCount > = rxParams。totalSyncFrames + 3 isValid = true;如果isLastFrame syncOut = [phaseCompOut;phaseCompOut1];其他的syncOut = phaseCompOut;终止其他的isValid = false;syncOut = [];终止%更新缓冲区和计数器。rxParams。cfBuffer = coarseFreqSyncOut (rxParams.syncIndex:结束);rxParams。年代yncIndex = syncIndex; rxParams.frameCount = rxParams.frameCount + 1;如果isValid数据有效信号%使用HelperDVBS2XPLHeaderRecover helper解码PL报头%的功能。帧的开始(SOF)是26个被丢弃的符号头码解码前的%。它们只需要框架%的同步。rxPLSCode = syncOut (1:90);%帧的前90个符号是PL报头[plsDecCode, phyParams] = HelperDVBS2XPLHeaderRecover(rxPLSCode,rxParams.s2xStatus);%验证解码的PL报头。如果plsDecCode ~ = cfgDVBS2X。PLSDecimalCode流(“% s \ n”'PL头解码失败'其他的%解调与解码对于frameCnt = 1:长度(syncOut) / rxParams。plFrameSize rxFrame = syncOut(((frameCnt-1)*rxParams.plFrameSize+1:frameCnt*rxParams.plFrameSize);估计噪声方差使用% helperdvbs2noisevareestimate helper函数。nVar=HelperDVBS2NoiseValestimate(rxFrame、rxParams.PilotId、rxParams.refPilots、rxParams.NormalFlag);%数据从符号91开始(在标题符号之后)。rxDataFrame=rxFrame(91:结束);%使用helperdvbs2xbbframercover恢复BB帧% helper函数。rxBBFrame = HelperDVBS2XBBFrameRecover (rxDataFrame phyParams rxParams.plScramblingIndex,...rxParams.numPilotBlks、nVar、false);使用。%恢复输入的位流%HelperDVBS2StreamRecover helper函数。如果strcmpi (cfgDVBS2X。StreamFormat,“GS”)&&&~rxParams.UPL[decBits,isFrameLost] = HelperDVBS2StreamRecover(rxBBFrame);如果~isFrameLost && length(decBits) ~= dataSize isFrameLost = true;终止其他的[decBits, isFrameLost pktCRC] = HelperDVBS2StreamRecover (rxBBFrame);如果~isFrameLost&&length(decBits)~=dataSize isFrameLost=true;pktCRC=0(0,1,“逻辑”);终止%计算TS或GS分组错误率%模式。pktsErr = pktsErr + numel(pktCRC) - sum(pktCRC);pktsRec = pktsRec + numel(pktCRC);终止如果~isFrameLost ts = sprintf(' % s '“BB报头解码已通过。”);其他的ts = sprintf (' % s ''BB报头解码失败。');终止%计算丢失的帧数。CRC的失败基带报头被认为是帧丢失。numFramesLost = isFrameLost + numFramesLost;流('%s(丢失的帧数= %1d)\n'、ts numFramesLost)%计算错误位。如果isastframe && ~isFrameLost bitsErr = bitsErr + sum(data((dataStInd-1)*dataSize+1:dataStInd*dataSize) ~= decBits);其他的如果~isFrameLost bitsErr = bitsErr + sum(data((dataStInd-1)*dataSize+1:dataStInd*dataSize) ~= decBits);终止终止dataStInd = dataStInd + 1;终止终止终止stIdx = endIdx;终止
BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)BB报头解码通过。(丢失帧数= 0)

可视化和错误日志

绘制同步数据的星座图,并计算BER和PER。

%同步数据星座图syncConst = comm.ConstellationDiagram (“标题”“同步数据”...“XLimits”,[-1.7 1.7],“YLimits”,[-1.7 1.7],...“ShowReferenceConstellation”,假);同步常数(同步输出)

%错误指标显示%用于GS连续流如果strcmpi (cfgDVBS2X。StreamFormat,“GS”)&&&~rxParams.UPL如果(simParams.numFrames-rxParams。totalSyncFrames == numFramesLost) fprintf(“所有的帧都丢失了。不能从BB帧中提取比特。”其他的数量= bitsErr / ((dataStInd-rxParams.totalSyncFrames) * dataSize);流(“方方面面:% 1.2 e \ n”, ber)终止其他的%用于GS和TS分组流如果pktsRec == 0“所有的帧都丢失了。没有数据包从BB帧中被检索。”其他的如果strcmpi (cfgDVBS2X。StreamFormat,“t”) pktLen = 1504;其他的pktLen = cfgDVBS2X.UPL;% UP长度,包括同步字节终止数量= bitsErr / (pktsRec * pktLen);每= pktsErr / pktsRec;流('每:%1.2e\n',per)fprintf(“方方面面:% 1.2 e \ n”, ber)终止终止
每:0.00 e + 00
数量:0.00 e + 00

进一步的探索

对于在AWGN中假设完美同步的误码率模拟,使用HelperDVBS2XBitRecover辅助功能来评估接收机的性能。的M-help一节中提供的示例HelperDVBS2XBitRecoverhelper函数。具体操作请参见配置同步参数rxParams为其他cfgDVBS2XsimParams的“进一步探索”部分带射频损伤和校正的端到端DVB-S2仿真关于如何配置的同步参数rxParams为其他cfgDVBS2XsimParams设置。对于更高的调制方案,如64 APSK及以上,该表显示了符号定时循环收敛所需的典型帧数。

附录

这个例子使用了这些辅助函数:

参考书目

  1. ETSI标准EN 302 307-2 V1.1.1(2015-11)。数字视频广播(DVB).广播、交互服务、新闻采集和其他宽带卫星应用的第二代帧结构、信道编码和调制系统.第2部分:DVB-S2扩展(DVB-S2X)

  2. ETSI标准TR 102 376-2 V1.2.1(2015-11)。数字视频广播(DVB);第二代广播、互动服务、新闻采集和其他宽带卫星应用系统的实施指南;第2部分:S2扩展(DVB-S2X)

  3. ETSI标准TR 102 376-1 V1.2.1(2015-11)。数字视频广播(DVB);第二代广播、互动服务、新闻采集和其他宽带卫星应用系统(DVB-S2)的实施指南

  4. 蒙加利,翁贝托和阿尔多·n·d 'Andrea。数字接收机的同步技术.纽约:三中全会出版社,1997。

  5. E.Casini、R.De Gaudenzi和Alberto Ginesi.“典型卫星信道上的DVB-S2调制解调器算法设计和性能。”国际卫星通信和网络杂志22,第3号(2004):281-318。

  6. 迈克尔大米,数字通信:一种离散时间方法.纽约:Prentice Hall, 2008。

另请参阅

物体

相关的话题