物理层MIMO-OFDM实现

物理层处理的起点是MAC层传下来的TB,终点是生成基带OFDM信号。然后上变频或下变频将基带OFDM信号变成射频信号,通过天线发射出去。与资源调度一样,物理层处理也分上行和下行,二者处理流程类似,接下来介绍的是下行链路加扰、调制、层映射、预编码、资源映射、OFDM符号生成六个步骤,其中层映射和预编码实现MIMO OFDM符号生成实现另一关键技术OFDMA

第一步:加扰。输入是一串称为码字的比特流,与一串已知的码序列,称为扰码,进行异或运算就得到输出比特流。

图片

加扰的目的是为了避免干扰,下行方向避免小区间干扰,上行方向避免用户间干扰。避免干扰的方法以下行为例,如上图所示,A手机所属基站叫eNB X,旁边一个基站eNB Y发射的信号对于A手机来说就是干扰;基站X发送的数据采用扰码1数据加扰,这是有用数据;基站Y发送的数据采用扰码2加扰,这是干扰数据;两个扰码12是正交的。

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可以得到映射后的IQ取值,如下图。也就是说01011000这串数据通过16QAM调制器后,输出两路信号,其中I路取值XXXXQ路取值XXXX(取值如下图所示),对应两个调制符号。工程实现上当然无法输出一个复数,只需要把I路、Q路信号的取值保存成一张表,后续处理直接从表中取数就可以轻松完成。

图片

第三步:层映射,第四步:预编码。 无线通信网络传输一项关键技术是多天线,这里第二步和第三步就是为了实现多天线技术。多天线在移动通信史有重要地位,移动通信发展史就是与无线资源做斗争的血泪史,而多天线就是一个重要武器,它发现了除频率、时间等无线资源外另一片新的资源,就是空间资源。2G3G中已经开发利用了频域、时域、码域,后来就开发利用空域资源,就像在拓宽车道的基础上架立交桥。

利用空间资源,并且区分不同信号,就要依靠多天线,发送端多天线,接收端也是多天线,这样从发送端到接收端连线,就得到一条一条的路,天线越多,路越多,便可以更充分的利用空间资源。但是天线的增多也会带来很多问题:

  • 天线越多,设计越复杂,成本越高,对比带8根天线的路由器和普通2根天线的路由器价格就显而易见;

  • 天线越多,空域上信号间隔越小,就越不好区分,也会造成信号传输质量的下降。

所以目前4G网络的基站一般最多8天线,4G手机一般两天线。同时,现在超大规模天线阵的广泛使用,成为5G的关键技术和硬件基础。

图片

第三、四步的流程图如下,

图片

  • 物理天线数,就是基站和手机上实际的天线,这是硬件基础设施,决定了多天线性能的理论上限。现在绝大部分手机有两根天线,基站最多有八根天线(如移动的TD-LTE基站)。

  • 天线端口:不同天线信道环境要不相关。天线端口指不相关的物理天线数,而且,天线端口<=物理天线数,天线端口数决定了多天线实际最高性能。

  • /流:其实是一个意思,一般叫流,英文layer,比如下行双流,上行双流,以及比较火热的下行四流就是dual layersfour layers。第三步层映射输出的数据就叫层,层映射输出几个layer,就称为几流。

下面介绍层映射和预编码。我们知道,在4G网络中 下行最多可以同时处理2TB,对应两个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规则,串并转换后得到两层数据(也就是两流),数学上看就是个两行矩阵,第一层是[S0S2],第二层是[S1S3];假设天线端口数为2,则两层数据分别乘以一个2*2的预编码矩阵W,仍然得到一个2*2的矩阵YY的两行[Y0Y2][Y1Y3]就是每个天线端口的数据。层数、预编码矩阵、天线端口数是由基站资源调度器根据手机反馈上来的一些关键信息(如RICSIPMI)决定的。

图片

最后,说明一点,层映射和预编码处理的数据都是复数信号,也就是同时处理I路和Q路。输出仍然是复信号,对应IQ两路,并且每一个天线端口输出的数据都是如此。

第五步:资源映射, 第六步:OFDM信号生成。把第五步和第六步一起讲的目的是,在逻辑上,资源映射和OFDM信号生成是分开的,没什么关系;但在实现上,可以认为二者是同时进行的。这两个步骤功能很简单,就是把每一个天线端口对应的数据(IQ路)映射到二维时频资源,然后生成OFDM波形,下图是OFDM信号生成器。

一个天线端口输出的I路和Q路调制数据经过OFDM波形发生器,输出两路OFDM信号,I-OFDMQ-OFDM

图片

OFDM其实就是一系列正交正弦或余弦信号(子载波)的叠加,从数学表达式上看:OFDM=Σa(k)*cos(kft),也就是说,在某一个时刻(已知t),如果知道k阶子载波的取值cos(kft),把它和输入的信号a(k)乘起来,在对k求和,就得到OFDMt时刻的值。输入信号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-1N个采样点的幅值,即函数C(k, n)= cos(k*n*2π/N)取值,k是载波阶数,在4G中最大取2048n是采样点序号,取值0~N-1。其次,取I路数据的k个值a(1)~a(k),分别与C(k,n),即1~k子载波幅值相乘,得到k个值,再把k个值相加,得到采样点nOFDM信号幅值,即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


猜你喜欢

转载自blog.51cto.com/15127585/2670086