规则帧的端到端DVB-S2X模拟与射频损伤和校正
本例介绍了如何测量规则帧恒定编码调制的单流数字视频广播卫星第二代扩展(DVB-S2X)链路的误码率(BER)和包错误率(PER)。实例详细介绍了码元定时和载波同步策略,重点介绍了在大噪声条件下如何估计射频前端损耗。单流信号添加射频前端损伤,然后通过加性高斯白噪声(AWGN)通道传递波形。
简介
DVB-S2X标准是DVB-S2规范的扩展,增强了对核心DVB-S2应用的支持,提高了卫星链路的整体效率。DVB-S2X标准支持以下附加功能:
更细粒度的调制和码率
更小的过滤器滚离选项,以更好地利用带宽
星座为线性和非线性通道优化
为关键的同信道干扰场景提供更多的置乱选项
DVB-S2X满足各种不同的目标应用,接收器根据应用的不同受到不同类型和水平的射频损伤。本示例设计了用于核心DVB-S2应用的DVB-S2X接收器的同步方面。该示例支持更新的码率、更高的调制方案(如64、128和256 APSK)和更小的滤波器滚离选项。
ETSI EN 302 307-2第6节表20a和表20c[1]总结了AWGN信道在不同调制方案和码率下的准无差错(QEF)性能要求。操作 不同传输模式的范围可考虑为+3或-2 dB从 观察QEF性能的点。因为操作 距离低,载波和符号定时同步策略是具有挑战性的设计问题。
此图总结了示例工作流。
主要处理循环
实例处理30个物理层(PL)数据帧 设置为25 dB,然后计算BER和PER。将载波频率偏移、采样时钟偏移和相位噪声损伤应用于调制信号,并在信号中添加AWGN。
在接收端,在匹配滤波之后,运行定时和载波恢复操作来恢复传输的数据。为了提取PL帧,采用了多种定时和载波恢复策略对失真波形进行处理,载波恢复算法采用导频辅助。为了解码数据帧,从PL报头中恢复物理层传输参数,如调制方案、码率和FEC帧类型。为了重新生成输入位流,解码基带(BB)头。
因为DVB-S2X标准支持分组和连续传输模式,BB帧既可以是用户包的串联,也可以是位流。回收BB头以确定传输模式。如果BB帧是用户包的串接帧,则返回每个包的CRC (packet cyclic redundancy check)状态和解码的比特,然后测量PER和BER。
这些框图显示了同步和输入位恢复工作流程。
下载DVB-S2X LDPC奇偶校验矩阵数据集
这个例子加载了一个带有DVB-S2X LDPC奇偶矩阵的mat文件。如果mat文件在MATLAB®路径上不可用,使用这些命令下载并解压mat文件。
如果~ (“dvbs2xLDPCParityMatrices.mat”,“文件”)如果~ (“s2xLDPCParityMatrices.zip”,“文件”) url =“https://ssd.mathworks.com/supportfiles/spc/satcom/DVB/s2xLDPCParityMatrices.zip”;websave (“s2xLDPCParityMatrices.zip”url);解压缩(“s2xLDPCParityMatrices.zip”);结束目录“s2xLDPCParityMatrices”);结束
DVB-S2X导频辅助配置
指定cfgDVBS2X
结构定义DVB-S2X传输配置参数。PLSDecimalCode
129和131不支持,因为它们用于生成VL-SNR帧。只支持常规帧。
cfgDVBS2X。StreamFormat =“t”;cfgDVBS2X。PLSDecimalCode = 191;7/9带飞行员cfgDVBS2X。分= 50128;cfgDVBS2X。ScalingMethod =“单元平均功率”;cfgDVBS2X。RolloffFactor = 0.35;cfgDVBS2X。SamplesPerSymbol = 2
cfgDVBS2X =结构体字段:流格式:"TS" PLSDecimalCode: 191 DFL: 50128 ScalingMethod: "单位平均功率" RolloffFactor: 0.3500 SamplesPerSymbol: 2
仿真参数
DVB-S2X标准支持灵活的通道带宽。使用典型的通道带宽,例如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
的Helper函数simParams
而且cfgDVBS2X
结构作为输入。该函数返回数据信号、传输和接收波形、作为结构的物理层配置参数以及接收器处理结构。接收到的波形被载波频率、定时相位偏移和相位噪声削弱,然后通过AWGN信道。接收机处理参数结构,rxParams
,包括参考导频字段、导频索引、计数器和缓冲区。绘制接收符号的星座图以及发射和接收波形的频谱图。
(数据、txOut rxIn phyConfig, rxParams] = HelperDVBS2XRxInputGenerate (cfgDVBS2X simParams);disp (phyConfig)
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)的形式实现,将频率偏移降低到精细频率估计器可以跟踪的水平。符号定时和粗频补偿的首选环路带宽取决于 设置。
36个导频块每1476个符号重复一次。粗频率误差估计使用36个导频符号中的34个。每块使用的导频(34)与导频周期(1476)之比为0.023。使用0.023值作为粗频同步器环路带宽的比例因子是首选。
当你减少 ,降低环路带宽,以滤除采集过程中更多的噪声。符号同步器和粗FLL收敛所需的帧数取决于环路带宽设置。
帧同步使用PL报头。由于载波同步是数据辅助的,因此帧同步必须准确检测帧的开始。 在决定帧同步精度方面起着至关重要的作用。当QPSK调制帧在 值低于3 dB时,必须在多个帧上进行帧同步,以便准确检测。
精细的频率估计可以跟踪高达4%的输入符号速率的载波频率偏移。精细频率估计必须处理多个导频块,以便将剩余载波频偏降低到相位估计算法可接受的水平。相位估计算法能处理小于0.02%的输入码率的剩余载频误差。
中分配这些设置rxParams
用于同步处理的结构。有关如何为low设置这些参数的详细信息
值,请参阅进一步的探索部分。
rxParams。carrSyncLoopBW = 1依照* 0.023;粗频率估计器环路带宽%由符号速率规范化rxParams。年代ymbSyncLoopBW = 8e-3;符号定时同步器环路带宽%由符号速率规范化rxParams。年代ymbSyncLock = 8;符号计时所需的帧数%误差收敛rxParams.frameSyncLock = 1;帧所需的帧数%%的同步rxParams。coarseFreqLock = 5;粗帧所需帧数%频率采集rxParams。fineFreqLock = 4;fine所需的帧数%频率估计%发生符号定时和粗频率锁定所需的总帧数rxParams。initialTimeFreqSync = rxParams。年代ymbSyncLock + rxParams.frameSyncLock +...rxParams.coarseFreqLock;用于整体同步的总帧数rxParams。totalSyncFrames = rxParams。initialTimeFreqSync + rxParams.fineFreqLock;创建时频同步系统对象HelperDVBS2TimeFreqSynchronizer助手对象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波形样本按以下步骤一次处理一帧。
应用匹配滤波,以每个符号两个样本的速率输出。
使用加德纳计时错误检测器应用符号计时同步,输出以符号速率产生。Gardner TED不是数据辅助的,所以它在载波同步之前执行。
应用帧同步来检测帧的开始和识别导频位置。
估计和应用粗频偏校正。
估计和应用精细的频率偏移校正。
估计和补偿剩余载波频率和相位噪声。
解码PL报头并计算传输参数。
解调和解码PL帧。
对BB报头进行CRC校验,如果校验通过,则恢复报头参数。
从BB帧中重新生成数据或包的输入流。
而stIdx <长度(rxIn)每次迭代使用一个DVB-S2X PL帧。endIdx = stIdx + rxParams.plFrameSize*simParams.sps;在最后一次迭代中,接收到的所有剩余的样本波形被考虑。isLastFrame = endIdx >长度(rxIn);endIdx长度(isLastFrame) = (rxIn);rxData = rxIn (stIdx + 1: endIdx);粗频偏环收敛后,FLL以a减少环路带宽。如果rxParams.frameCount < rxParams。initialTimeFreqSync coarseFreqLock = 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。initialTimeFreqSync symSyncOutLen(rxParams.frameCount) = length(coarseFreqSyncOut);如果any(abs(diff(symSyncOutLen(1:rxParams.frameCount))) > 5) error(['符号定时同步失败。循环不会`...“收敛。没有帧将被恢复。更新symbSyncLoopBW '...'参数根据EsNo设置为适当的循环收敛。']);结束结束rxParams。年代yncIndex = syncIndex;PL帧开始索引位于正在处理的块的中间位置。从精细的频率估计开始,处理作为PL帧进行。缓冲区用于存储填充一个PL帧所需的符号。如果isLastFrame resCnt = resSymb - length(coarseFreqSyncOut);如果resCnt <= 0 fineFreqIn = [rxParams.cfBuffer;coarseFreqSyncOut (1: resSymb)];其他的fineFreqIn = [rxParams.cfBuffer;coarseFreqSyncOut;0 (resCnt 1)];结束elseifrxParams.frameCount > 1 fineFreqIn = [rxParams.cfBuffer;coarseFreqSyncOut (1: rxParams.plFrameSize-length (rxParams.cfBuffer)));结束使用HelperDVBS2FineFreqEst估计精细频率误差% helper函数。向条件检查添加1,因为缓冲区用于获取一个PL%帧给循环计数带来1的延迟。如果(rxParams.frameCount > rxParams。initialTimeFreqSync + 1) &&...(rxParams.frameCount < = rxParams。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)/(*(N+1))其中N(18)是元素的个数%用于计算自相关(R)的平均值% HelperDVBS2FineFreqEst。频率=角(rxParams.fineFreqCorrVal) /(π* (19));使用frameCount和plFrameSize生成符号索引。从rxParams.frameCount中减去2,因为缓冲区曾经获得1% PL帧引入计数延迟1。印第安纳州= (rxParams.frameCount-2) * plFrameSize: (rxParams.frameCount-1) * plFrameSize-1;phErr = exp (1 j * 2 *π*频率*印第安纳州);fineFreqOut = fineFreqIn。* phErr (:);使用HelperDVBS2PhaseEst估计相位误差估计% helper函数。[phEstRes, rxParams。prevPhaseEst] = HelperDVBS2PhaseEst (...fineFreqOut (rxParams.pilotInd)、rxParams.refPilots rxParams.prevPhaseEst);通过使用补偿剩余的频率和相位偏移%的helper函数。使用两帧初始相位误差估计。从%第二帧,使用前一帧的相位误差估计和%当前帧的补偿。在帧数比较中增加3个以考虑延迟:1%帧由于rxParams。cfBuffer延迟和两帧用于phase%的错误估计。如果rxParams.frameCount > = rxParams。totalSyncFrames + 3 phaseCompOut = helperdvbs2phascompenscompensate (rxParams.ffBuffer,...rxParams.pilotEst、rxParams.pilotInd phEstRes (2));结束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、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。年代yncIndex = syncIndex; rxParams.frameCount = rxParams.frameCount + 1;如果isValid数据有效信号通过使用HelperDVBS2XPLHeaderRecover帮助程序解码PL报头%的功能。起始帧(SOF)是26个被丢弃的符号在解码报头之前。它们只在框架中需要%的同步。rxPLSCode = syncOut (1:90);帧的前90个符号是PL报头[plsDecCode, phyParams] = HelperDVBS2XPLHeaderRecover (rxPLSCode rxParams.s2xStatus);验证已解码的PL标头。如果plsDecCode ~ = cfgDVBS2X。PLSDecimalCode流(“% s \ n”,'PL头解码失败') dataStInd = dataStInd + 1;其他的解调和解码为frameCnt = 1:长度(syncOut) / rxParams。plFrameSize rxFrame = syncOut((frameCnt-1)*plFrameSize+1:frameCnt*plFrameSize);%估计噪声方差使用助手函数。据nVar = HelperDVBS2NoiseVarEstimate (rxFrame rxParams.pilotInd,...rxParams.refPilots rxParams.normFlag);数据从符号91开始(在标头符号之后)。rxDataFrame = rxFrame(91:结束);使用HelperDVBS2XBBFrameRecover恢复BB帧% helper函数。rxBBFrame = HelperDVBS2XBBFrameRecover (rxDataFrame phyParams,...rxParams.plScramblingIndex rxParams.numPilotBlks,据nVar、假);使用恢复输入位流% HelperDVBS2StreamRecover帮助函数。如果strcmpi (cfgDVBS2X。StreamFormat,“GS”) & & ~ rxParams。推高[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)计算出错位。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 fprintf(“所有帧都丢失了。没有包从BB帧中检索。”)其他的如果strcmpi (cfgDVBS2X。StreamFormat,“t”) pktLen = 1504;其他的pktLen = cfgDVBS2X.UPL;% UP长度,包括同步字节结束数量= bitsErr / (pktsRec * pktLen);每= pktsErr / pktsRec;流(“每:% 1.2 e \ n”,每)流(“方方面面:% 1.2 e \ n”, ber)结束结束
每:0.00 e + 00
数量:0.00 e + 00
进一步的探索
对于假定完全同步的AWGN中的误码率模拟,使用HelperDVBS2XBitRecover
辅助函数评估接收器的性能。的M-help部分提供的示例HelperDVBS2XBitRecover
helper函数。配置同步参数的详细信息rxParams
为其他cfgDVBS2X
而且simParams
的“进一步探索”部分带射频损伤和校正的端到端DVB-S2模拟的同步参数rxParams
为其他cfgDVBS2X
而且simParams
设置。对于更高的调制方案,如64 APSK及以上,下表显示了符号定时循环收敛所需的典型帧数。
附录
该示例使用了以下辅助函数:
HelperDVBS2XRxInputGenerate.m:生成由于射频损伤和参数结构而失真的DVB-S2X波形样本,用于接收机处理
HelperDVBS2PhaseNoise.m:生成不同DVB-S2X相位噪声掩模的相位噪声样本,并应用于输入信号
HelperDVBS2TimeFreqSynchronizer.m:匹配滤波、符号定时同步、帧同步、粗频估计与校正
HelperDVBS2FrameSync.m:同步帧并检测帧的开始
HelperDVBS2FineFreqEst.m:估计精细频偏
HelperDVBS2PhaseEst.m:估计载波相位偏移
HelperDVBS2PhaseCompensate.m:进行载波相位补偿
HelperDVBS2XPLHeaderRecover.m: PL报头解调解码,恢复传输参数
HelperDVBS2NoiseVarEstimate.m:估计接收数据的噪声方差
HelperDVBS2XBBFrameRecover.m:进行PL解置、解调、解码,并从PL帧中恢复BB帧
HelperDVBS2XDemapper.m:对所有基于DVB-S2X的调制方案进行软解调
HelperDVBS2XLDPCDecode.m:对所有基于DVB-S2X的LDPC帧格式和码率进行LDPC解码
HelperDVBS2XBCHDecode.m:对所有基于DVB-S2X的帧格式和码率进行BCH解码
HelperDVBS2StreamRecover.m:对BB报头进行CRC校验,根据报头参数从BB帧中恢复输入流
HelperDVBS2XBitRecover.m:执行PL报头解调解码、PL解置、解调解码和BB帧恢复。对BB报头进行CRC校验,并从BB帧恢复输入流。
参考书目
ETSI标准EN 302 307-2 V1.1.1(2015-11)。数字视频广播(DVB);广播、交互服务、新闻采集和其他宽带卫星应用的第二代帧结构、信道编码和调制系统第二部分:DVB-S2扩展(DVB-S2X).
ETSI标准TR 102 376-2 V1.2.1(2015-11)。数字视频广播(DVB);第二代广播、互动服务、新闻采集和其他宽带卫星应用系统实施指南第二部分:S2扩展(DVB-S2X).
ETSI标准TR 102 376-1 V1.2.1(2015-11)。数字视频广播(DVB);第二代广播、互动服务、新闻采集和其他宽带卫星应用系统(DVB-S2)实施指引.
蒙加利,翁贝托和奥尔多·德安德里亚。数字接收机同步技术.纽约:全会出版社,1997年。
E.卡西尼,R.德·高登齐,阿尔贝托·吉内西。“DVB‐S2调制解调器算法的设计和典型卫星频道的性能。”国际卫星通信与网络杂志22日,没有。3(2004): 281 - 318。
迈克尔大米,数字通信:离散时间方法.纽约:普伦蒂斯大厅,2008。