物理层处理的起点是MAC层传下来的TB,终点是生成基带OFDM信号。然后上变频或下变频将基带OFDM信号变成射频信号,通过天线发射出去。与资源调度一样,物理层处理也分上行和下行,二者处理流程类似,接下来介绍的是下行链路加扰、调制、层映射、预编码、资源映射、OFDM符号生成六个步骤,其中层映射和预编码实现MIMO, OFDM符号生成实现另一关键技术OFDMA。
第一步:加扰。输入是一串称为码字的比特流,与一串已知的码序列,称为扰码,进行异或运算就得到输出比特流。
加扰的目的是为了避免干扰,下行方向避免小区间干扰,上行方向避免用户间干扰。避免干扰的方法以下行为例,如上图所示,A手机所属基站叫eNB X,旁边一个基站eNB Y发射的信号对于A手机来说就是干扰;基站X发送的数据采用扰码1数据加扰,这是有用数据;基站Y发送的数据采用扰码2加扰,这是干扰数据;两个扰码1和2是正交的。
A手机接收到两个基站的信号后,用扰码1和接收到的数据做运算,把基站X发送的数据还原出来;而基站Y的数据采用扰码2加扰,并且扰码1和扰码2正交,所以运算后干扰数据就被抵消掉了。这样A手机相当于没收到干扰基站Y的信号,从而避免小区间干扰。
第二步:调制。输入是加扰后的一串比特流;输出是I路和Q路两路数据。调制的目的很简单,使无线资源,即一个载波,承载更多的信息bit,提高频谱利用率,增加传输速率和小区容量。我们可以使一个载波承载更多的信息bit,信息bit就是0101的一串数据,载波上某些参数的变化就能反映出01的信息来,这些参数包括幅度、相位、频率等。比如,对于一个载波,幅度高代表1,幅度低代表0,相位0度代表1,相位90度代表0,这样幅度和相位两个参数就有四种组合,分别代表11,10,01,00四种信息bit。
一般无线通信网络中,数据传输采用的是QAM调制方式,就是用一个载波的幅度和相位来表示信息bit。输入数据,按照调制方式星座图,将若干个信息bit映射成一个调制符号,调制符号从数学表达上看是一个复数S=I+j*Q,其实部和虚部分别对应输出的I路和Q路信号值,利用欧拉公式可以计算出幅度和相位。具体映射方式在36.211 7.1中有详细介绍。
比如,输入的一串数据为01011000,采用16QAM调制方式,这8个比特将被映射为两个调制符号,查36.211 Table 7.1.3-1可以得到映射后的I,Q取值,如下图。也就是说01011000这串数据通过16QAM调制器后,输出两路信号,其中I路取值XX和XX,Q路取值XX和XX(取值如下图所示),对应两个调制符号。工程实现上当然无法输出一个复数,只需要把I路、Q路信号的取值保存成一张表,后续处理直接从表中取数就可以轻松完成。
第三步:层映射,第四步:预编码。 无线通信网络传输一项关键技术是多天线,这里第二步和第三步就是为了实现多天线技术。多天线在移动通信史有重要地位,移动通信发展史就是与无线资源做斗争的血泪史,而多天线就是一个重要武器,它发现了除频率、时间等无线资源外另一片新的资源,就是空间资源。2G、3G中已经开发利用了频域、时域、码域,后来就开发利用空域资源,就像在拓宽车道的基础上架立交桥。
利用空间资源,并且区分不同信号,就要依靠多天线,发送端多天线,接收端也是多天线,这样从发送端到接收端连线,就得到一条一条的路,天线越多,路越多,便可以更充分的利用空间资源。但是天线的增多也会带来很多问题:
天线越多,设计越复杂,成本越高,对比带8根天线的路由器和普通2根天线的路由器价格就显而易见;
天线越多,空域上信号间隔越小,就越不好区分,也会造成信号传输质量的下降。
所以目前4G网络的基站一般最多8天线,4G手机一般两天线。同时,现在超大规模天线阵的广泛使用,成为5G的关键技术和硬件基础。
第三、四步的流程图如下,
物理天线数,就是基站和手机上实际的天线,这是硬件基础设施,决定了多天线性能的理论上限。现在绝大部分手机有两根天线,基站最多有八根天线(如移动的TD-LTE基站)。
天线端口:不同天线信道环境要不相关。天线端口指不相关的物理天线数,而且,天线端口<=物理天线数,天线端口数决定了多天线实际最高性能。
层/流:其实是一个意思,一般叫流,英文layer,比如下行双流,上行双流,以及比较火热的下行四流就是dual layers,four layers。第三步层映射输出的数据就叫层,层映射输出几个layer,就称为几流。
下面介绍层映射和预编码。我们知道,在4G网络中 下行最多可以同时处理2个TB,对应两个CW;上行只能处理一个TB,对应一个CW。而我们上面提到的天线数、层数/流数等于4、等于8,显然比2大,所以存在这么个关系:TB数=CW数<=层数<=天线端口数<=物理天线数,而层映射和预编码就是把CW数、层/流数、天线端口数匹配起来。数学上看,层映射就是串并转换,预编码就是和一个矩阵做乘法。层映射串并转换规则参考TS36.211 6.3.3节,预编码乘的那个矩阵叫预编码矩阵,取值参考TS36.211 6.3.4节。
简单讲,通过层印射、预编码首先将CW变成多层并行数据,进而再与多天线匹配,获得多天线不同增益,包括复用、分集、波束赋形。具体CW映射到多少层,选择哪个预编码矩阵都是由物理层的上层MAC层资源调度器决定的,物理层仍然是个干活的。这其中也需要手机的参与,包括反馈信道状态信息(CSI)、预编码矩阵指数(PMI)、RI等。
举个例子,第一个码字调制后得到4个符号,记为矩阵S;要把它映射到两层,按照TS36.2116.3.3规则,串并转换后得到两层数据(也就是两流),数学上看就是个两行矩阵,第一层是[S0,S2],第二层是[S1,S3];假设天线端口数为2,则两层数据分别乘以一个2*2的预编码矩阵W,仍然得到一个2*2的矩阵Y,Y的两行[Y0,Y2]和[Y1,Y3]就是每个天线端口的数据。层数、预编码矩阵、天线端口数是由基站资源调度器根据手机反馈上来的一些关键信息(如RI、CSI、PMI)决定的。
最后,说明一点,层映射和预编码处理的数据都是复数信号,也就是同时处理I路和Q路。输出仍然是复信号,对应I和Q两路,并且每一个天线端口输出的数据都是如此。
第五步:资源映射, 第六步:OFDM信号生成。把第五步和第六步一起讲的目的是,在逻辑上,资源映射和OFDM信号生成是分开的,没什么关系;但在实现上,可以认为二者是同时进行的。这两个步骤功能很简单,就是把每一个天线端口对应的数据(I和Q路)映射到二维时频资源,然后生成OFDM波形,下图是OFDM信号生成器。
一个天线端口输出的I路和Q路调制数据经过OFDM波形发生器,输出两路OFDM信号,I-OFDM和Q-OFDM。
OFDM其实就是一系列正交正弦或余弦信号(子载波)的叠加,从数学表达式上看:OFDM=Σa(k)*cos(kft),也就是说,在某一个时刻(已知t),如果知道k阶子载波的取值cos(kft),把它和输入的信号a(k)乘起来,在对k求和,就得到OFDM在t时刻的值。输入信号a(k)肯定是已知的,只要能产生k阶子载波cos(kft)就可以了。过去产生载波信号使用本振,一个本振产生一个频率的载波信号,k阶载波就需要k个本振。4G网路中,20MHz带宽时大概有1300多个子载波。
其实OFDM技术原理早就出现了,但一直没能得到应用的原因之一。直到随着集成数字电路和数字信号处理器件的迅猛发展,采用专用的DSP来实现OFDM,子载波通过软件生成,其数量与硬件没有关系,OFDM才开始迈向高速移动通信领域。
某一时刻的OFDM信号实际上就是输入信号a(k)和k阶子载波乘积的叠加,本质就是输入一个序列a(k),输出另一个相同长度的序列。所以只要能满足这个要求的算法都可以生成OFDM信号。像离散余弦变换、反向离散哈特莱变换、实数IDFT变换等,复数IFFT变换。OFDM系统选择的是复数IFFT变换。
复数IFFT算法同时处理I路和Q路,处理流程完全相同,以I路处理为例。首先,基站和手机里要存一张表,这张表是1~k阶子载波(正弦或余弦)在0~N-1这N个采样点的幅值,即函数C(k, n)= cos(k*n*2π/N)取值,k是载波阶数,在4G中最大取2048;n是采样点序号,取值0~N-1。其次,取I路数据的k个值a(1)~a(k),分别与C(k,n),即1~k子载波幅值相乘,得到k个值,再把k个值相加,得到采样点n的OFDM信号幅值,即OFDM(n)=Σa(k)*C(k, n)=Σa(k)*cos(k*n*2π/N)。这样依次计算出一个采样周期OFDM信号的幅值:OFDM(0),OFDM(1)~OFDM(N-1),再通过D/A转换就得到OFDM信号波形。时域的OFDM信号波形如下。这是I路的数据,Q路同理。
两路信号最后通过上变频/下变频、功放、合路、滤波变成射频信号,通过天线发射出去。
王世义:重庆大学无线通信技术实验室硕士研究生,主研方向为智能信号处理。
系统仿真部分代码如下:
clear all
clear functions
disp('Simulating the LTE Mode 1:Single Tx and Rx antrenna');
%% Set simulation parametrs & initialize parameterstructures
commlteSISO_params;
[prmLTEPDSCH, prmLTEDLSCH, prmMdl] =commlteSISO_initialize( chanBW, contReg, modType, Eqmode,...
cRate,maxIter,fullDecode, chanMdl, corrLvl, chEstOn, maxNumErrs, maxNumBits);
clearchanBWcontRegnumTxnumRxmodTypeEqmodecRatemaxIterfullDecodechanMdlcorrLvlchEstOnmaxNumErrsmaxNumBits;
%%
zReport_data_rate(prmLTEDLSCH, prmLTEPDSCH);
hPBer = comm.ErrorRate;
% snrdB=prmMdl.snrdBs(end);
maxNumErrs=prmMdl.maxNumErrs;
maxNumBits=prmMdl.maxNumBits;
%% Simulation loop
nS = 0; % Slot number, one of[0:2:18]
Measures = zeros(3,1); %initializeBER output
channelG=[];
while (( Measures(2)< maxNumErrs)&& (Measures(3) < maxNumBits))
[dataIn,dataOut, txSig, rxSig, dataRx, yRec, csr,chanG] = ...
commlteSISO_step(nS, snrdB, prmLTEDLSCH, prmLTEPDSCH, prmMdl);
%Calculate bit errors
Measures =step(hPBer, dataIn, dataOut);
%Visualize constellations and spectrum
ifvisualsOn
zVisualize(prmLTEPDSCH, txSig, rxSig, yRec, dataRx, csr, nS);
end;
channelG=[channelG;chanG];
%Update subframe number
nS = nS + 2;
if nS> 19
x=0:10/length(channelG):10-10/length(channelG);
plot(x,abs(channelG));title('Channel Inpulse Response');
xlabel('time(ms)');
channelG=[];
axis([0 100 2]);
end;
nS =mod(nS, 20);
end
disp(Measures);
function [dataIn, dataOut, txSig,rxSig, dataRx, yRec, csr_ref,chanG]...
=commlteSISO_step(nS, snrdB, prmLTEDLSCH, prmLTEPDSCH, prmMdl)
%% TX
% Generate payload
dataIn = genPayload(nS,prmLTEDLSCH.TBLenVec);
% Transport block CRC generation
tbCrcOut1 =CRCgenerator(dataIn);
% Channel coding includes - CB segmentation, turbocoding, rate matching,
% bit selection, CB concatenation - per codeword
[data, Kplus1, C1] = lteTbChannelCoding(tbCrcOut1, nS,prmLTEDLSCH, prmLTEPDSCH);
%Scramble codeword
scramOut = lteScramble(data, nS, 0, prmLTEPDSCH.maxG);
% Modulate
modOut = Modulator(scramOut, prmLTEPDSCH.modType);
% Generate Cell-Specific Reference (CSR) signals
csr = CSRgenerator(nS, prmLTEPDSCH.numTx);
% Resource grid filling
E=8*prmLTEPDSCH.Nrb; %CSRµÄ¸öÊý
csr_ref=reshape(csr(1:E),2*prmLTEPDSCH.Nrb,4);
txGrid = REmapper_1Tx(modOut, csr_ref, nS, prmLTEPDSCH);
% OFDM transmitter
txSig = OFDMTx(txGrid, prmLTEPDSCH);
%% Channel
% SISO Fading channel
[rxFade, chPathG] = MIMOFadingChan(txSig, prmLTEPDSCH,prmMdl);
% idealhD = lteIdChEst(prmLTEPDSCH, prmMdl, chPathG, nS); %ÀíÏëÐŵÀ¹À¼Æ
% Add AWG noise
nVar = 10.^(0.1.*(-snrdB));
rxSig = AWGNChannel(rxFade, nVar);
chanG=chPathG(:,1);
%% RX
% OFDM Rx
rxGrid = OFDMRx(rxSig, prmLTEPDSCH);
% updated for numLayers -> numTx
[dataRx, csrRx, idx_data] = REdemapper_1Tx(rxGrid, nS,prmLTEPDSCH);
% MIMO channel estimation
if prmMdl.chEstOn
chEst =ChanEstimate_1Tx(prmLTEPDSCH, csrRx, csr_ref, 'interpolate');
hD=chEst(idx_data);
else
hD = idealhD;
end
% Frequency-domain equalizer
yRec = Equalizer(dataRx, hD, nVar, prmLTEPDSCH.Eqmode);
% Demodulate
demodOut = DemodulatorSoft(yRec, prmLTEPDSCH.modType,nVar);
% Descramble both received codewords
rxCW = lteDescramble(demodOut, nS, 0, prmLTEPDSCH.maxG);
% Channel decoding includes - CB segmentation, turbodecoding, rate dematching
[decTbData1, ~,~] = lteTbChannelDecoding(nS, rxCW,Kplus1, C1, prmLTEDLSCH, prmLTEPDSCH);
% Transport block CRC detection
[dataOut, ~] = CRCdetector(decTbData1);
end
function [prmLTEPDSCH, prmLTEDLSCH,prmMdl] = commlteSISO_initialize(chanBW, contReg, modType, Eqmode,...
cRate,maxIter,fullDecode, chanMdl, corrLvl, chEstOn, maxNumErrs, maxNumBits)
% Create the parameter structures
% PDSCH and DLSCH
prmLTEPDSCH = prmsPDSCH(chanBW, contReg, modType);
prmLTEPDSCH.Eqmode=Eqmode;
prmLTEPDSCH.modType=modType;
prmLTEDLSCH = prmsDLSCH(cRate,maxIter, fullDecode,prmLTEPDSCH);
% Channel parameters
prmMdl.chanMdl = chanMdl;
prmMdl.corrLevel = corrLvl;
prmMdl.chEstOn = chEstOn;
switch modType
case 1
snrdBs=[0:4:8, 9:12];
case 2
snrdBs=[0:4:12, 13:16];
otherwise
snrdBs=0:4:24;
end
prmMdl.snrdBs=snrdBs;
prmMdl.maxNumBits=maxNumBits;
prmMdl.maxNumErrs=maxNumErrs;
% PDSCH
numTx =1; %Number of transmit antennas
numRx =1; %Number of receive antennas
chanBW =4; %Index to chanel bandwidth used [1,....6]
contReg =1; % No.of OFDM symbols dedictaed to control information [1,...,3]
modType = 2; %Modulation type [1, 2, 3] for ['QPSK,'16QAM','64QAM']
% DLSCH
cRate =1/3; % Rate matching target coding rate
maxIter =6; %Maximum number of turbo decoding terations
fullDecode =0; %Whether "full" or "early stopping" turbo decoding isperformed
% Channel model
chanMdl = 'HST';
corrLvl ='Low';
% Simulation parametrs
Eqmode =2; % Typeof equalizer used [1,2] for ['ZF', 'MMSE']
chEstOn =1; %Whether channel estimation is done or ideal channel model used
maxNumErrs = 1e7; %Maximum number of errors found before simulation stops
maxNumBits = 1e7; %Maximum number of bits processed before simulation stops
visualsOn =1; %Whether to visualize channel response and constellations
snrdB =16; %Value of SNR used in this experiment