主要内容

带射频损伤和常规帧校正的端到端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第6节表20A和表20C[1]总结了AWGN信道在不同调制方案和码率下的准无错误(QEF)性能要求。操作 E 年代 / N o 不同传输模式的范围可被认为是+3或-2 dB E 年代 / N o 观察QEF表现的点。因为操作 E 年代 / N o 范围低,载波和符号定时同步策略是具有挑战性的设计问题。

此图总结了示例工作流。

主要处理循环

方法处理30个物理层数据帧 E 年代 / N o 设置为25 dB,然后计算BER和PER。载波频率偏移,采样时钟偏移和相位噪声损伤应用于调制信号,并且AWGN被添加到信号中。

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

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

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

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

此示例加载具有DVB-S2X LDPC奇偶校验矩阵的MAT文件。如果Matlab®Path上不可用MAT文件,请使用这些命令下载和解压缩MAT文件。

如果~ (“dvbs2xLDPCParityMatrices.mat”“文件”如果~ (“s2xLDPCParityMatrices.zip”“文件”) url ='https://ssd.mathwands.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使用典型的通道带宽,如36mhz。信道带宽可以改变。在这个例子中实现的粗频率同步算法可以跟踪载波频率偏移高达输入符号率的11%。码元速率计算为B/(1+R),其中B为信道带宽,R为发射滤波器滚动因子。在这个例子中实现的算法可以校正采样时钟偏差高达10ppm。

simParams。年代ps = cfgDVBS2X.SamplesPerSymbol;每符号样本%simParams。numFrames = 30;%待处理帧数simParams。chanBW = 36 e6;%信道带宽,单位为赫兹simParams。首席财务官= 2 e6;%以赫兹表示的载波频率偏移simParams。上海合作组织= 2;部分采样时钟偏差%%每百万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辅助函数Simparams.cfgDVBS2X结构作为输入。该函数返回数据信号、发送和接收的波形、作为结构的物理层配置参数和接收器处理结构。接收到的波形会受到载波频率、定时相位偏移和相位噪声的影响,然后通过AWGN通道。接收机处理参数结构,rxparams.,包括参考引导字段、引导索引、计数器和缓冲区。绘制接收符号的星座和发射和接收波形的频谱。

(数据、txOut rxIn phyConfig, rxParams] = HelperDVBS2XRxInputGenerate (cfgDVBS2X simParams);disp (phyConfig)
FECFRAME:“正常”调制化学:“64”LDPCCodeIdentier:“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.spectrumanalyzer('采样率'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 值以下3 dB,必须在多个帧上执行帧同步以精确检测。

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

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

rxparams.carrsyncloopbw = 1e-2 * 0.023;%粗频估计环路带宽按符号率规范化的%rxParams。年代ymbSyncLoopBW = 8e-3;%符号定时同步器环带宽按符号率规范化的%rxParams。年代ymbSyncLock = 8;符号时序所需的帧数%误差收敛rxparams.framesynclock = 1;%帧所需的帧数%的同步rxParams。coarseFreqLock = 5;%毛糙所需的帧数%频率采集rxparams.finefreqlock = 4;%罚金所需的帧数%频率估计符号定时和粗略频率锁定的%帧的总帧rxParams。initialTimeFreqSync = rxParams。年代ymbSyncLock + rxParams.frameSyncLock +...rxParams.coarseFreqLock;%用于整体同步的总帧数rxparams.totalsyncframes = rxparams.initialtimefefreqsync + rxparams.finefreqlock;%创建时间频率同步系统对象使用% HelperDVBS2TimeFreqSynchronizer helper对象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与a一起工作减少的环路带宽。如果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(ambsyncoutlen(1:rxparams.framecount))> 5)错误(['符号定时同步失败。循环不会'...“收敛。没有帧将被恢复。更新symbSyncLoopBW '...'参数,根据EsNo设置适当的环路收敛。]);结束结束rxparams.syncindex = 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将输入符号速率估计的频率归一化% freqEst =角度(R)/(pi*(N+1))其中N(18)为元素个数%用于计算中自相关(R)的均值% HelperDVBS2FineFreqEst。频率=角(rxParams.fineFreqCorrVal) /(π* (19));%使用frameCount和plFrameSize生成符号索引。从rxparams.frameCount中减去2,因为缓冲区用于获得一个% PL帧对计数引入了1的延迟。IND =(rxparams.framecount-2)* plframesize :( rxparams.framecount-1)* plframesize-1;pherr = exp(-1j * 2 * pi * freqest * ind);finefreqout = finefreqin。* pherr(:);%使用HelperDVBS2PhaseEst估计相位误差% helper函数。[phEstRes, rxParams。prevPhaseEst] = HelperDVBS2PhaseEst (...FineFreqout(rxparams.pilotind),rxparams.refpilots,rxparams.prevphaseest);%通过使用来补偿剩余频率和相位偏移%的% helperdvbs2phasecompensehelper功能。%使用两帧进行初始相位误差估计。从%秒帧,使用前一帧的相位误差估计和%当前帧在补偿中。%在帧数比较中增加3以考虑延迟:1%帧由于rxParams。cfBuffer延迟和两个用于相位的帧%的错误估计。如果rxparams.frameCount> = rxparams.totalsyncframes + 3 phasecompout = helperdvbs2phaseCompensate(rxparams.ffbuffer,...rxParams.pilotEst、rxParams.pilotInd phEstRes (2));结束rxparams.ffbuffer = finefreqout;rxparams.pilotest = 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,rxparams.pilotind,Estendph);结束结束%恢复输入位流。如果rxParams.frameCount > = rxParams。totalSyncFrames + 3 isValid = true;如果isLastFrame syncOut = [phaseCompOut;phaseCompOut1];其他的syncOut = phaseCompOut;结束其他的isValid = false;syncOut = [];结束%更新缓冲区和计数器。rxparams.cfbuffer = coarsefreqsyncout(rxparams.syncindex:结束);rxparams.syncindex = syncindex;rxparams.framecount = rxparams.framecount + 1;如果已验证数据有效信号%使用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)*plFrameSize+1:frameCnt*plFrameSize);估计噪声方差使用% helperdvbs2noisevareestimate helper函数。nvar = helperdvbs2noisevarestimate(rxframe,rxparams.pilotind,...rxparams.refpilots,rxparams.normflag);%数据从符号91开始(在标题符号之后)。rxDataFrame = rxFrame(91:结束);%使用helperdvbs2xbbframercover恢复BB帧% helper函数。rxBBFrame = HelperDVBS2XBBFrameRecover (rxDataFrame phyParams,...rxParams.plScramblingIndex rxParams.numPilotBlks,据nVar、假);使用。%恢复输入的位流% 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 = iSframEleost + NumFramesLoSt;流('%s(迷失帧数=%1d)\ n'、ts numFramesLost)%计算错误位。bitInd = (dataStInd-1) * dataSize + 1: dataStInd * dataSize;如果isLastFrame && ~isFrameLost bitsErr = bitsErr + sum(data(bitInd) ~= decBits);其他的如果~isFrameLost bitsErr = bitsErr + sum(data(bitInd) ~= 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)

可视化和错误日志

绘制同步数据的星座图,计算误码率和PER值。

%同步数据星座图syncConst = comm.ConstellationDiagram (“标题”“同步数据”...“XLimits”(-1.7 - 1.7),“YLimits”(-1.7 - 1.7),...“ShowReferenceConstellation”、假);syncConst (syncOut)

%错误指标显示%用于GS连续流如果Strcmpi(cfgdvbs2x.streamformat,'GS') & & ~ rxParams。推高如果(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长度,包括同步字节结束BER = BITSERR /(PKTSREC * PKTLEN);per = pktserr / pktsrec;流(“每:% 1.2 e \ n”,每)流(“方方面面:% 1.2 e \ n”, ber)结束结束
每周:0.00E + 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)。数字视频广播;用于广播、互动服务、新闻采集和其他宽带卫星应用的第二代帧结构、信道编码和调制系统;第2部分:DVB-S2扩展(DVB-S2X)

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

  3. ETSI标准TR 102 376-1 V1.2.1(2015-11)。数字视频广播;第二代广播、互动服务、新闻采集和其他宽带卫星应用系统(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。

另请参阅

对象

相关的话题