主要内容

NR相位噪声建模与补偿

本示例演示了相位噪声对5G OFDM系统的影响,并展示了如何使用相位跟踪参考信号(PT-RS)来补偿常见相位误差(CPE)。该示例测量了有和没有CPE补偿的错误向量幅度(EVM)和误码率(BER)。

简介

在5G NR中,3GPP引入了一种新的参考信号,称为相位跟踪参考信号(PT-RS),以处理振荡器噪声。在振荡器中产生的噪声导致信息信号的相位调制,导致信息信号的频谱和定时特性发生显著变化。这种与振荡器有关的现象称为相位噪声。局部振荡器产生的相位噪声在毫米波(mmWave)频率下产生了显著的退化,这取决于相位噪声的功率谱密度。相位噪声会导致CPE和载波间干扰(ICI)。CPE导致接收到的符号在每个子载波中进行相同的旋转。ICI导致子载波间正交性的丧失。由于PT-RS在频域的分布结构,本例主要使用PT-RS来估计和最小化CPE对系统性能的影响。实例将相位噪声应用于由物理下行共享信道(PDSCH)组成的波形中,并给出了无CPE补偿和有CPE补偿时EVM和误码率的变化。该图显示了本例中实现的处理链。

相位噪声建模

振荡器功率谱密度模拟相位噪声。本例使用多极零模型来近似振荡器的功率谱密度。使用PNModel字段simParameters结构来选择相位噪声模型:'A', 'B',或'C'。参数集“A”和“B”分别从工作在30 GHz和60 GHz的实际振荡器中获得,如TDoc R1-163984所述。参数集“C”是从工作在29.55 GHz的实际振荡器中获得的,如TR 38.803节6.1.10所述。

该示例使用子载波间距为60 kHz的载波,传输带宽为50 MHz。

%配置运营商carrier = nrCarrierConfig;母舰。SubcarrierSpacing = 60;母舰。CyclicPrefix =“正常”;母舰。NSizeGrid = 66;设置工作频率,选择相位噪声模型simParameters = [];simParameters。Fc = 30e9;%频率(Hz)simParameters。PNModel =“一个”'A' (TDoc R1-163984 Set A), 'B' (TDoc R1-163984 Set B), 'C' (TR 38.803)得到抽样率ofdmInfo = nrOFDMInfo(载体);sr = ofdmInfo.SampleRate;相位噪声级offsetlog = (4:0.2:log10(sr/2));%从1e4hz到sr/ 2hz的模型偏移foffset = 10.^ offsetlog;线性频偏pn_PSD = hPhaseNoisePoleZeroModel(foffset,simParameters.Fc,simParameters.PNModel);% dBc /赫兹设置相位噪声电平pnoise = com . phasenoise (“FrequencyOffset”foffset,“水平”pn_PSD,“SampleRate”、sr);pnoise。RandomStream =“mt19937ar with seed”可视化相位噪声的频谱掩码xlabel(foffset,pn_PSD)“频率偏移(Hz)”) ylabel (“dBc /赫兹”)标题(“相位噪声幅度响应”网格)

图中包含一个轴对象。标题为“相位噪声幅度响应”的axis对象包含一个类型为line的对象。

配置PDSCH

示例配置PDSCH占用完整载波,调制方案设置为'64QAM',层数设置为1。该示例默认为单个层和单个随机未编码位的码字。

设置PDSCH参数pdsch = nrPDSCHConfig;pdsch。PRBSet = 0:carrier. nsizgrid -1;pdsch。SymbolAllocation = [0 14];pdsch。调制=64 qam;pdsch。NumLayers = 1;pdsch。MappingType =“一个”;pdsch。Nid = 1;pdsch。Rnti = 2;设置DM-RS参数pdsch.DMRS.DMRSConfigurationType = 1;pdsch. dmrs . dmrstypeposition = 2;pdsch.DMRS.DMRSAdditionalPosition = 0;pdsch.DMRS.DMRSLength = 1;pdsch.DMRS.DMRSPortSet = [];pdsch.DMRS.NumCDMGroupsWithoutData = 1;pdsch.DMRS.NIDNSCID = 1;pdsch.DMRS.NSCID = 0;设置PT-RS参数pdsch。EnablePTRS = 1;pdsch.PTRS.TimeDensity = 1;pdsch.PTRS.FrequencyDensity = 2;pdsch.PTRS.REOffset =“00”;pdsch.PTRS.PTRSPortSet = [];

生成波形

波形为2帧和场生成NumFramessimParameters结构控制波形的帧数。所涉及的步骤是:

  • 生成PDSCH位容量的随机码字

  • 获取随机码字的PDSCH符号并将它们映射到网格

  • 生成DM-RS符号并将其映射到网格

  • 生成PT-RS符号并将其映射到网格

  • 对所有帧的完整网格进行OFDM调制

%生成波形的帧数simParameters。NumFrames = 2;获取波形中的槽数和槽中的符号数*simParameters.NumFrames = carrier.SlotsPerFrame;nSlotSymb = carrier.SymbolsPerSlot;初始化指定帧数的网格txGrid = 0 (carrier.NSizeGrid*12,nSlotSymb*numSlots, pdch . numlayers);%处理循环Txbits = [];rng (“默认”slotIdx = 0:numSlots - 1%设置槽位号母舰。NSlot = slotIdx;获取PDSCH指数和结构信息[pdschInd,pdschIndicesInfo] = nrPDSCHIndices(carrier,pdsch);生成随机码字numCW = pdsch.NumCodewords;%码字个数data = cell(1,numCW);i = 1:numCW data{i} = randi([0 1],pdschIndicesInfo.G(i),1);Txbits = [Txbits;数据我{});% #好< AGROW >结束获得调制符号pdschSym = nrPDSCH(载体,pdsch,数据);获取DM-RS符号和索引dmrsSym = nrPDSCHDMRS(载体,pdsch);dmrsInd = nrPDSCHDMRSIndices(载体,pdsch);获取PT-RS符号和索引ptrsSym = nrPDSCHPTRS(载体,pdsch);ptrsInd = nrPDSCHPTRSIndices(载体,pdsch);映射到插槽网格的资源元素slotGrid = nrResourceGrid(载体,pdch . numlayers);slotGrid(pdschInd) = pdschSym;slotGrid(dmrsInd) = dmrsSym;slotGrid(ptrsInd) = ptrsSym;通过映射slotGrid,为所有帧生成txGrid%的位置txGrid(:,slotIdx*nSlotSymb+1:(slotIdx+1)*(nSlotSymb),:) = slotGrid;结束执行OFDM调制母舰。NSlot = 0;将OFDM调制槽位号重置为0tx波形= nrofdm调制(载波,txGrid);

应用相位噪声

将相位噪声应用于传输波形。为了清楚地观察相位噪声的影响,本例除相位噪声外,没有应用任何热噪声或通道模型。该示例将相同的相位噪声应用于所有层。

rx波形= pnoise(tx波形);

接收机

在返回均衡的PDSCH符号和解码的位之前,接收器执行以下步骤:

  • 时间同步

  • OFDM解调

  • 信道估计

  • 均衡

  • CPE估计和校正

  • PDSCH解码

对于CPE估计和校正步骤,接收方使用逻辑字段CompensateCPEsimParameters结构。因为这个示例没有使用传播信道,所以计时同步、信道估计和均衡这些步骤并不是严格必要的。但是,如果引入信道,这些步骤有助于研究相位噪声效应。

该示例显示了均衡的星座符号、EVM和误码率,有和没有CPE补偿。

案例1:没有CPE补偿

如果不启用CPE补偿,可以设置该字段CompensateCPEsimParameters结构到0。

simParameters。CompensateCPE= 0; [eqSymbols,rxbits] = practicalReceiver(carrier,pdsch,simParameters,rxWaveform); refSymbols = getConstellationPoints(pdsch);显示星座图图绘制(eqSymbols,“。”)举行情节(refSymbols“+”)标题(“无CPE补偿的均衡符号星座”网格)包含(“同步”) ylabel (“交”

图中包含一个轴对象。标题为“无CPE补偿的均衡符号星座”的axis对象包含2个类型为line的对象。

显示RMS EVMevm = com . evm“ReferenceSignalSource”“从参考星座估计”“ReferenceConstellation”, refSymbols);流('无CPE补偿的均衡符号的RMS EVM(百分比):%f%% \n'维生素(eqSymbols))
没有CPE补偿的均衡符号的RMS EVM(百分比):7.431048%
显示误码率errorRate = nnz(rxbits-txbits)/numel(txbits);流('无CPE补偿的误码率:%f \n'errorRate)
无CPE补偿的误码率:0.005525

案例2:CPE补偿

如果启用CPE补偿,可以设置该字段CompensateCPEsimParameters结构到0。利用PT-RS估计槽内所有OFDM符号位置的CPE。校正PT-RS OFDM符号范围内OFDM符号位置中的CPE。

simParameters。CompensateCPE= 1; [eqSymbolsCPE,rxbitsCPE] = practicalReceiver(carrier,pdsch,simParameters,rxWaveform);显示星座图图绘制(eqSymbolsCPE,“。”)举行情节(refSymbols“+”)标题(“带CPE补偿的均衡符号星座”网格)包含(“同步”) ylabel (“交”

图中包含一个轴对象。带有CPE补偿的均衡化符号星座的axis对象包含2个类型为line的对象。

显示RMS EVM流('带CPE补偿的相等符号的RMS EVM(百分比):%f%% \n'维生素(eqSymbolsCPE))
具有CPE补偿的均衡符号的RMS EVM(百分比):4.557690%
显示误码率errorRateCPE = nnz(rxbitsCPE-txbits)/numel(txbits);流(带CPE补偿的误码率:%f \nerrorRateCPE)
带CPE补偿的误码率:0.000052

进一步的探索

  • 为了可视化相位噪声的影响,可以改变载波频率、子载波间距、资源块数、调制方案和帧数。

  • 要查看相位噪声对星座的影响,请更改相位噪声模型。

  • 为了分析不同配置的CPE补偿效果,改变PT-RS的时间和频率密度。

  • 通过包括热噪声和通道模型来可视化相位噪声的影响。

总结

这个例子演示了相位噪声的影响,并展示了如何用PT-RS估计和纠正CPE。算例还表明,CPE补偿减小了EVM,提高了误码率。所显示的星座图在毫米波频率中显示了巨大的ICI,表明除了CPE补偿外,还需要进行ICI补偿。

本地函数

函数[eqSymbols,rxbits] = practicalReceiver(carrier,pdsch,params, rx波形)执行计时后返回均衡调制符号%估计,OFDM解调,信道估计,MMSE均衡,% CPE估计和校正,以及PDSCH解码。获取当前槽号,槽数,符号数%,以及符号总数nSlot = carrier.NSlot;numSlots = carrier.SlotsPerFrame*params.NumFrames;nSlotSymb = carrier.SymbolsPerSlot;numTotalSymbols = numSlots*nSlotSymb;获取DM-RS符号的参考网格dmrsSymCell = cell(1,numSlots);dmrsIndCell = cell(1,numSlots);refGrid = 0 (carrier.NSizeGrid*12,numTotalSymbols, pdch . numlayers);NSlot = 0:numSlots-1载波。NSlot = NSlot;slotGrid = nrResourceGrid(载体,pdch . numlayers);dmrsSymCell{NSlot+1} = nrPDSCHDMRS(载体,pdsch);dmrsIndCell{NSlot+1} = nrPDSCHDMRSIndices(载体,pdsch);slotGrid(dmrsIndCell{NSlot+1}) = dmrsSymCell{NSlot+1};refGrid(:,NSlot*nSlotSymb+1:(NSlot+1)*(nSlotSymb),:) = slotGrid;结束执行时间估计和修正母舰。NSlot = NSlot;offset = nrTimingEstimate(载波,rx波形,refGrid);waveformSync = rx波形(1+偏移量:结束,:);对接收到的数据进行OFDM解调以重建数据%资源网格,包括填充事件,即实用%同步导致不完整的槽被解调rxGrid = nrOFDMDemodulate(载波,波形同步);[K,L,R] = size(rxGrid);如果(L < numTotalSymbols) rxGrid = cat(2,rxGrid,零(K,numTotalSymbols-L,R));结束声明存储变量eqSymbols = [];星座图的均衡符号Rxbits = [];NSlot = 0:numSlots-1为当前槽提取网格currentGrid = rxGrid(:,NSlot*nSlotSymb+(1:nSlotSymb),:);%获取PDSCH资源母舰。NSlot = NSlot;dmrsSymbols = dmrsSymCell{NSlot+1};dmrsIndices = dmrsIndCell{NSlot+1};ptrsSymbols = nrPDSCHPTRS(载体,pdsch);ptrsIndices = nrPDSCHPTRSIndices(载体,pdsch);[pdschIndices,pdschIndicesInfo] = nrPDSCHIndices(carrier,pdsch);%信道估计[estChannelGrid,noiseEst] = nrChannelEstimate(currentGrid,dmrsIndices,dmrsSymbols,“CDMLengths”, pdsch.DMRS.CDMLengths);从接收的网格中获取PDSCH资源元素[pdschRx,pdschHest] = nrExtractResources(pdschIndices,currentGrid,estChannelGrid);%均衡pdschEq = nrEqualizeMMSE(pdschRx, pdschest,noiseEst);共相误差(CPE)估计和校正如果参数个数。CompensateCPE初始化临时网格以存储均衡符号tempGrid = nrResourceGrid(载体,pdsch.NumLayers);从接收到的网格中提取PT-RS符号并进行估计%通道栅格[ptrsRx,ptrsHest,~,~,~,ptrsLayerIndices] = nrExtractResources(ptrsIndices,currentGrid,estChannelGrid,tempGrid);平衡PT-RS符号并将它们映射到tempGridptrsEq = nrEqualizeMMSE(ptrsRx,ptrsHest,noiseEst);tempGrid(ptrsLayerIndices) = ptrsEq;估计PT-RS位置的残留通道% tempGridcpe = nrChannelEstimate(tempGrid,ptrsIndices,ptrsSymbols);%子载波、接收天线和%层。然后,通过取角度得到CPE合成和%Cpe =角度(sum(Cpe,[1 3 4]));将均衡后的PDSCH符号映射到tempGridtempGrid(pdschIndices) = pdschEq;在参考范围内,每个OFDM符号中正确的CPE% PT-RS OFDM符号如果pdschIndicesInfo.PTRSSymbolSet) > 0 symLoc = pdschIndicesInfo.PTRSSymbolSet(1)+1:pdschIndicesInfo.PTRSSymbolSet(end)+1;tempGrid (:, symLoc:) = tempGrid (:, symLoc:)。* exp (1 * cpe (symLoc));结束提取PDSCH符号pdschEq = tempGrid(pdschIndices);结束存储均衡后的符号,并为所有槽位输出eqSymbols = [eqSymbols;pdschEq];% #好< AGROW >解码PDSCH符号并获得硬位eqbits = nrPDSCHDecode(载体,pdsch,pdschEq);I = 1: number (eqbits) rxbits = [rxbits;双(eqbits{我}< 0)];% #好< AGROW >结束结束结束函数sym = getConstellationPoints(pdsch)星座点数% SYM = getConstellationPoints(PDSCH)返回星座点数SYM基于PDSCH配置对象中提供的调制方案。Sym = [];调制=字符串(pdsch.调制);将调制方案转换为字符串类型ncw = pdsch.NumCodewords;%码字个数如果NCW == 2 && (number(调制)== 1)调制(end+1) =调制(1);结束获得星座点数cwIndex = 1:ncw qm = strcmpi(调制(cwIndex),{“正交相移编码”16 qam的64 qam256 qam})*[2 4 6 8]';Sym = [Sym;nrSymbolModulate (int2bit ((0:2 ^ qm-1)”,qm)调制(cwIndex));% #好< AGROW >结束结束

相关的话题