主要内容

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

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

介绍

DVB-S2X标准是DVB-S2规范的扩展,增强了对核心DVB-S2应用程序的支持,并提高了卫星链路的总体效率。DVB-S2X标准支持以下附加功能:万博1manbetx

  • 更精细的调制和码率

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

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

  • 关键同频干扰场景的更多置乱选项

DVB-S2X适用于各种不同的目标应用,并且接收机根据所使用的应用受到不同类型和级别的射频损伤。本示例设计了用于核心DVB-S2应用的DVB-S2X接收机的同步方面。本示例支持更新的码率、更高的调制方案uch如64、128和256 APSK,以及更小的过滤器卷取选项。万博1manbetx

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

此图总结了示例工作流。

主要处理循环

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

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

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

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

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

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

如果~存在(“dvbs2xLDPCParityMatrices.mat”,“文件”)如果~存在('s2xLDPCParityMatrices.zip',“文件”) url =“https://ssd.mathworks.com/万博1manbetxsupportfiles/spc/satcom/DVB/s2xLDPCParityMatrices.zip”;websave ('s2xLDPCParityMatrices.zip'url);解压缩('s2xLDPCParityMatrices.zip');终止地址路径(“s2xLDPCParityMatrices”);终止

DVB-S2X导航辅助模式配置

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

cfgDVBS2X。StreamFormat =“TS”;cfgDVBS2X。PLSDecimalCode = 191;%64APSK 7/9带飞行员cfgDVBS2X。分= 50128;cfgDVBS2X。ScalingMethod =“单位平均功率”;cfgDVBS2X.RolloffFactor=0.35;cfgDVBS2X.SamplesPerSymbol=2
cfgDVBS2X=结构体字段:StreamFormat:“TS”PLSDecimalCode:191 DFL:50128缩放方法:“单位平均功率”翻转系数:0.3500样本符号:2

模拟参数

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

simParams.sps=cfgDVBS2X.SamplesPerSymbol;每符号样本%simParams。numFrames = 30;%待处理帧数simParams.chanBW=36e6;%信道带宽,单位为赫兹simParams。首席财务官= 2 e6;%以赫兹表示的载波频率偏移simParams.sco=2;%部分采样时钟偏移%百万分之simParams.phNoiseLevel=“低”相位噪声电平提供为%“低”、“中”或“高”simParams.EsNodB=25;每符号的能量与噪声的比率%的分贝

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

产生因射频损伤而失真的DVB-S2X波形

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

[data,txOut,rxIn,phyConfig,rxParams]=HelperDVBS2XRxInputGenerate(cfgDVBS2X,simParams);disp(phyConfig)
FECFrame: "normal" ModulationScheme: "64APSK" LDPCCodeIdentifier: "7/9"
%接收信号星座图rxConst=通信星座图(“头衔”,“接收数据”,...“XLimits”[1],“YLimits”[1],...“ShowReferenceTellation”假的,...“SamplesPerSymbol”,simParams.sps);rxConst(rxIn(1:length(txOut)))

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

配置接收器参数

在接收机中,对接收到的数据执行符号定时同步,然后进行帧同步。接收机算法包括粗略和精细频率损伤校正算法。载波频率估计算法可以跟踪高达输入符号速率20%的载波频率偏移。粗略频率估计算法可以跟踪高达输入符号速率20%的载波频率偏移频率估计作为频率锁定环(FLL)实现,将频率偏移降低到精细频率估计器可以跟踪的水平。符号定时和粗略频率补偿的首选环路带宽取决于 E s / N o 背景

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

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

帧同步使用PL报头。因为载波同步是数据辅助的,所以帧同步必须准确地检测帧的开始。 E s / N o 在决定帧同步的准确性方面起着至关重要的作用 E s / N o 值小于3db时,必须对多帧进行同步才能准确检测。

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

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

rxParams。carrSyncLoopBW = 1依照* 0.023;%环路带宽粗频率估计器%按符号速率标准化rxParams。symbSyncLoopBW = 8e-3;符号定时同步器环路带宽%按符号速率标准化rxParams.symbSyncLock=8;%符号定时所需的帧数%误差收敛rxParams.frameSyncLock = 1;%帧所需的帧数%的同步rxParams.freqlock=5;%毛糙所需的帧数%频率采集rxParams.fineFreqLock=4;%罚金所需的帧数%频率估计%发生符号定时和粗频锁定的总帧数rxParams.initialTimeFreqSync=rxParams.symbSyncLock+rxParams.frameSyncLock+...rxParams.lock;%用于整体同步的总帧数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]=deal(0);%初始化数据索引变量stIdx=0;dataSize=rxParams.inputFrameSize;plFrameSize=rxParams.plFrameSize;dataStInd=rxParams.totalSyncFrames+1;isLastFrame=false;symSyncOutLen=零(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其他的freqlock=true;终止%检索最后一帧样本。如果isLastFrame resSymb=plFrameSize—长度(rxParams.cfBuffer);resSampCnt=resSymb*rxParams.sps—长度(rxData);如果resSampCnt>=0%样本数量不足,无法填充最后一帧syncIn = [rxData;0 (resSampCnt 1)];其他的%剩余样本可填充最后一帧syncIn=rxData(1:resSymb*rxParams.sps);终止其他的syncIn=rxData;终止%应用匹配滤波、符号定时同步、帧%同步,并进行粗频偏补偿。[GrossFreqSyncout,syncIndex,phEst]=timeFreqSync(syncIn,GrossFreqLock);如果rxParams.frameCount<=rxParams.initialTimeFreqSync symSyncOutLen(rxParams.frameCount)=长度(粗略频率同步输出);如果任何(abs(diff(symSyncOutLen(1:rxParams.frameCount))) > 5)错误(['符号定时同步失败。循环将不会停止'...'收敛。不会恢复任何帧。请更新symbSyncLoopBW'...'参数根据EsNo设置进行适当的循环收敛。']);终止终止rxParams.syncIndex=syncIndex;%的PL帧开始索引位于正在处理的块的中间。%从精细频率估计开始,处理作为PL帧进行。%缓冲区用于存储填满一个PL帧所需的符号。如果isLastFrame FINEFREKIN=[rxParams.cfBuffer;粗略频率同步];其他的fineFreqIn=[rxParams.cfBuffer;粗略频率同步输出(1:rxParams.syncIndex-1)];终止%使用HelperDBS2FineFrequest估计精细频率误差%辅助函数。%向条件检查添加1,因为缓冲区用于获取一个PL%帧为循环计数引入一个延迟。如果(rxParams.frameCount>rxParams.initialTimeReqSync+1)&&...(rxParams.frameCount<=rxParams.totalSyncFrames+1)rxParams.fineFreqCorrVal=HelperDVBS2FineFrequest(...fineFreqIn(rxParams.pilottind),rxParams.numplotblks,...rxParams.refPilots,rxParams.fineFreqCorrVal);终止如果rxParams.frameCount>=rxParams.totalSyncFrames+1 fineFreqLock=true;其他的fineFreqLock = false;终止如果细频锁%通过输入符号速率规范化频率估计%frequest=角度(R)/(pi*(N+1)),其中N(18)是元素的数量%用于计算中自相关(R)的平均值% HelperDVBS2FineFreqEst。Frequest=角度(rxParams.fineFreqCorrVal)/(pi*(19));%使用frameCount和plFrameSize生成符号索引。%从rxParams.frameCount中减去2,因为缓冲区用来得到1%PL帧为计数引入一个延迟。印第安纳州= (rxParams.frameCount-2) * plFrameSize: (rxParams.frameCount-1) * plFrameSize-1;phErr = exp (1 j * 2 *π*频率*印第安纳州);fineFreqOut = fineFreqIn。* phErr (:);%使用HelperDVBS2PhaseEst估计相位误差%辅助函数。[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,rxParams.pilotInd,phEstRes(2));终止rxParams。ffBuffer = fineFreqOut;rxParams。飞行员= phEstRes;%数据部分上的相位补偿由以下步骤执行:%插值在连续导频上计算的相位估计%块。数据的第二阶段估算不可用%最后一帧中最后一个导频块之后的部分。因此,%在系统中所有导频块上计算的相位估计斜率%最后一帧被外推并用于补偿相位最终数据部分的%错误。如果isLastFrame pilotBlkLen=36;%符号pilotBlkFreq=1476;%符号平均坡度=平均值(差值(phEstRes(2:end));chunkLen=rxParams.plFrameSize-rxParams.pilotInd(结束)+...rxParams.pilotInd(pilotbllen);estEndPh=phEstRes(end)+平均坡度*chunkLen/PilotbleFreq;phaseCompOut1=HelperDVS2PhaseCompensate(rxParams.ffBuffer,...rxParams.pilotEst、rxParams.pilotInd estEndPh);终止终止%恢复输入位流。如果rxParams.frameCount > = rxParams。totalSyncFrames + 3 isValid = true;如果isLastFrame syncOut=[phaseCompOut;phaseCompOut1];其他的syncOut=相位合成;终止其他的isValid=false;syncOut=[];终止%更新缓冲区和计数器。rxParams。cfBuffer = coarseFreqSyncOut (rxParams.syncIndex:结束);rxParams.syncIndex=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 fprintf(“%s\n”,“PL标头解码失败”)其他的%解调与解码对于frameCnt=1:length(syncOut)/rxParams.plFrameSize rxFrame=syncOut((frameCnt-1)*plFrameSize+1:frameCnt*plFrameSize);%利用小波变换估计噪声方差%helperDVBS2NoiseValestimate辅助函数。据nVar = HelperDVBS2NoiseVarEstimate (rxFrame rxParams.pilotInd,...rxParams.refPilots rxParams.normFlag);%数据从符号91开始(在标题符号之后)。rxDataFrame=rxFrame(91:结束);%使用HelperDBS2XBBFrameRecover恢复BB帧%辅助函数。rxBBFrame = HelperDVBS2XBBFrameRecover (rxDataFrame phyParams,...rxParams.plScramblingIndex,rxParams.numplotblks,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=zero(0,1,“合乎逻辑”);终止%计算TS或GS分组的数据包错误率%模式。pktsErr=pktsErr+numel(pktCRC)-sum(pktCRC);pktsRec=pktsRec+numel(pktCRC);终止如果~isframets=sprintf(' % s ',“BB头解码已通过。”);其他的ts = sprintf (' % s ','BB报头解码失败。');终止%计算丢失的帧数。CRC的失败%基带报头被认为是帧丢失。numFramesLost = isFrameLost + numFramesLost;流('%s(丢失的帧数= %1d)\n',ts,numFramesLost)%计算错误位。bitInd=(dataStInd-1)*dataSize+1:dataStInd*dataSize;如果isLastFrame&&~isFrameLost bitsErr=bitsErr+sum(数据(比特数)~=decBits);其他的如果~isFrameLost bitsErr=bitsErr+sum(数据(比特数)~=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。

%同步数据星座图SyncConsist=通信星座图(“头衔”,“同步数据”,...“XLimits”,[-1.7 1.7],“YLimits”,[-1.7 1.7],...“ShowReferenceTellation”,false);syncConst(syncOut)

%错误度量显示%对于GS连续流如果strcmpi (cfgDVBS2X。StreamFormat,“GS”)&&&~rxParams.UPL如果(simParams.numFrames-rxParams。totalSyncFrames == numFramesLost) fprintf(“所有帧都丢失。无法从BB帧中检索任何位。”)其他的ber=bitsErr/((dataStInd rxParams.totalSyncFrames)*数据大小);fprintf('误码率:%1.2e\n', ber)终止其他的%用于GS和TS分组流如果pktsRec==0 fprintf(“所有帧都丢失。无法从BB帧检索数据包。”)其他的如果strcmpi (cfgDVBS2X。StreamFormat,“TS”)pktLen=1504;其他的pktLen = cfgDVBS2X.UPL;%包括同步字节的上行长度终止数量= bitsErr / (pktsRec * pktLen);每= pktsErr / pktsRec;流('每:%1.2e\n',per)fprintf(“方方面面:% 1.2 e \ n”, ber)终止终止
每:0.00 e + 00
误码率:0.00e+00

进一步的探索

对于AWGN中假设完全同步的BER模拟,请使用HelperDVBS2XBitRecover帮助函数来评估接收器性能。请参阅HelperDVBS2XBitRecover有关如何配置的同步参数的详细信息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。

另见

物体

相关的话题