LTE易忘点

Contents
[隐藏]

1、FDD frame structure

2. Uplink resource grid

3. Uplink Resource Blocks(RB)

A physical resource block in the uplink consists of N^{UL}_{symb}*N^{RB}_{sc} resource elements, correspoding to one slot in the time domain and 180 kHz in the frequency domain.

Uplink Resource block parameters

4. 概念速查

  • RE: Resource Element, 资源元素。是时频资源的最小单位,用来存放调制之后的一个符号。
  • RB: Resource Blcok, 资源块。是一组RE时频资源单元的组合。一个RB频率方向含有12个子载波,时间方向含有7个符号(对应一个slot,即半个子帧),即共有12*7=84个RE。
  • TTI: 1ms数据,两个slot。
  • TB: Transmit Block,传输块。TB与TTI相对应,即1ms要传输的数据大小。目前使用的值是4392。
  • CB: Code Block, 码块。根据TS 36.212 ,Section 5.1.2,最大的码块长度是6144。
  • CRC24A:TS 36.212中提到了多种CRC24,我们使用的是CRC24A。
  • AIF: 天线接口(Atenna InterFace),TI自定的基于CPRI的高速串行数据传输方式。
  • EDMA: Enhanced Direct Memory Access (增强型DMA)。

5. OFDM所有子载波上的符号率是15000sy/s,而要完成最大2048个子载波的IFFT的运算,必须对所有的调制符号叠加采样,每符号2048次,即总采样率为2048*15000=30.72MHz。另一方面,根据采样定理,实信号的采样频率必须大于等于信号最大频率的2倍,但对于OFDM复信号,在频谱上是单边的,只需满足1倍采样率就不至于造成混叠,同时真正信号最大频率是小于20MHz的,所以30.72MHz的采样频率是完全满足要求的。

可以简单算下:1个子帧是1ms,一个时隙0.5m有7个ofdm符号(normal),第一个符号的cp是160,之后6个是144,所以一个子帧的采样点个数就是 【(166+2048)+(144+2048)*6】*2=30720,所以一个无线帧(10ms)的采样点个数是30720*10=307200,那么1s传输的数据个数是30720000,对应的采样速率为30.72MHz。

6. 协议中一个OFDM符号持续时间是66.67us。子载波间隔是15kHz。为了保证子载波之间的正交性,那么一个符号的持续时间是1/15kHz=66.67us,与协议中的规定正好相同。从另外一个方面着手,0.5ms中包含7个完整的OFDM符号,还有7个CP,在20M带宽的配置下,这7个CP的总长度为160+160*6=1024=0.5个OFDM符号长度,因此,0.5ms中包含7.5个OFDM符号,那么每个OFDM符号(20M带宽下是2048个数据点)的持续时间是0.5ms/7.5=66.67us,与之前计算的结果相同。

7. 数据速查

带宽配置:基带10M,空口20M。

一个RB包含12个子载波,10M有50个RB,20M有100个RB。

10M带宽:50个RB->600个子载波

20M带宽:100个RB->1200个子载波

10M: short CP = 72, extend CP = 80

20M: short CP = 144, extend CP = 160

TBSize/payloadSize: 4392 bit。4392 bit 需要549 (549 * 8 = 4392)个char存储,在MATLAB分包里没有添加CRC,添加CRC是在CCS中添加的。

Block Size:

① QPSK调制:TBSize + 24 bit CRC = 4392 bit + 24 bit CRC = 4416 bit,单位为bit。

② 16QAM调制:8784 bit

Max code block size: 6144,在分包(code block segmentation)中使用,即分包之后,最大包的长度是6144.

AIF 中gucDlMonoDescRegion的大小是8848*7*2*4个UINT8,其中8848=(2048+160+4)*4, 2048是FFT长度,160是最长CP,4是头信息,乘以4是将单位由Int转换为字节;7*2是1ms有14个符号,4是有4个ms。

 

8. 暂未搞明白的数据

发送端:

Tx_Core2/_Scomplex.h

REC_AMOUNT 10M: 15399 20M 30797

MAX_E_LLR 2484

EFF_TBSIZE (PAYLOADSIZE-4)

9. DSP特殊变量

DNUM (C6400+ only) DSP core number register Ref: TMS320C6000 Optimizing Compiler v 7.4 User’s Guide.pdf, pp. 150, Table 6-3. Valid Control Registers. (TMS320C6670 is Integrated with four C66x CorePac DSPs.)


1.流程


一、发送端

分核之后,核2负责编码、调制、预编码、成帧,核0只负责IFFT和AIF(向空口写数据)。

MATLAB数据预处理 -> 装载数据(/Tx_Core2/WarpTbEncoder.c)-> pdsch_tx_TB_encoder(/Tx_Core2/pdsch_tx_TB_encoder/tf_TB_encoder.c)

1、MATLAB数据处理流程

每个TB的大小都是4392 bit (可用549个unit8来存储),每个TB的前32个bit是TTI的序号,只有第一个TB的第二个32bit表示整个信息序列的长度,其他TB的第二个32bit都是信息数据。

第一步添上32bit数据长度之后,就要将这32bit视为数据。

2. 为每个TB添加CRC24A(我称这里的CRC24A为传输块校验码)

添加CRC24A的算法请参考:CRC字节算法

3. 分码块并添加CRC24B(我称这里的CRC24B为包校验码)

有关这部分的内容请参考TS 36.212 5.1.2 Code block segmentation and code block CRC attachment章节。

备注:第2步和第3步都有添加CRC24,但它们是不一样的。第2步为每个TB添加CRC24A是必须要进行的,而第3步却不一定进行,这取决于TB的大小。因为协议中规定Maxium Code Block Size是6144,当TB的大小超过6144时才需要分块,只有分块就得给每个块再添加一个CRC24B校验码,如果TB的大小不超过6144,那么既不需要分块,也不需要添加CRC24B校验码。

4. Turbo编码和速率匹配

上图是Turbo编码框图。需要注意的是图中的z_k是三个数据经过两次模2计算得到的,而先计算那个模2对最终的结果是没有影响的。在汇编中,先计算第二个模2运算,再计算第一个模2运算。在看程序的时候不要迷惑。

编码的最后一步是添加12个尾比特(截止比特),在汇编中12个尾比特放在了a_cOutput和b_cOutput1中,最后经过比特以为,放到了b_cTail2中,

在本模块,所有的输入和输出信号都是以字节左对齐的。

二、接收端

分核之后,

核0负责fftc和译码(包括解速率匹配);

核1负责信道估计;

核2负责MIMO均衡、数据解调。

fftc->(核间数据共享)->信道估计->MIMO均衡->数据解调->(核间数据共享)->译码


2.交接:编程文件中需要注意的问题


3.发送端:

3.1.Turbo编码模块

当发生分块的情况时,/Tx_Core2/pdsch_tx_TB_encoder/src/chanencode_turbo_intlvtable_init.c中的Init_TurboIntlvTable函数需要添加对应包长的内部交织器表。

4.接收端:

4.1.均衡

tempcrsEstChan: 只保存了4个符号的数据,分别为第1/5/8/12个符号,之所以不保存14个符号的数据,是因为第1/2/3/4个符号、第5/6/7个符号、第8/9/10/11个符号、第12/13/14个符号,每组内的数据相同。将14个符号的数据压缩成4个数据的过程是在信道估计中进行的。

_complex_mul.sa: 该汇编文件的功能是

在汇编程序中,将第一个复数数组x取了共轭之后再与第二个复数数组相乘。

FFT

从AIF buffer读取的数据是实部在低位,虚部在高位(这里说的是在内存中的地址,也可以说,实部在前,虚部在后,高地址在低地址后面)


5.没看懂的程序


5.1.发送端AIF:

AIF写数流程:

在main函数中创建信号量

值为1,立即执行函数tf_Aif2Write()->Clock1ms_FUN()->Aif2IntFun()进行拷贝数据到gucDlMonoDescRegion指向的内存空间(共享内存)中。

AIF的初始化流程:

疑问:

1.  /pdsch_transmitter/main.c/line 353

 

2. /pdsch_transmitter/pdsch_tx_ifft/Aif2/Source/Frmwk_BspAif2Init.c/line 709 & 721

3. /pdsch_transmitter/SysCfg.h/line 32-35

函数ChkAifBufBlockNum的作用是什么?

4. AIF发数据的流程是怎样的?是1ms触发一次中断调用Clock1ms_FUN()吗?必须把Core2的处理时间控制在1ms之内?

 

5.2.接收端AIF:

AIF读数流程:接收端首先进入tf_fftc()中,在正式进行fftc之前,需要从AIF buffer里读取数据:

GetOnesubFramDatFromAifBuf(CurrentSubFramNum); //里面有对数据偏移,该偏移是因为接收信号不同步导致的

周期调用中断函数AifIntHook(),在Aif2IntHook里面post信号量g_Semaphore_Fftc和gSemaphore_CommDecoder,使整个工作流程得以继续。

AIF的初始化流程:

AIF产生1 symbol周期中断,中断时调用中断函数Bsp_Aif2MeshHwInt(),在Bsp_Aif2MeshHwInt()中gu32AifSymbolNum++,并调用AifIntHook(),在Aif2IntHook里面post信号量g_Semaphore_Fftc和gSemaphore_CommDecoder。

疑问:

1.  接收端是如何启动的?先执行哪个任务或函数?是直接等AIF的中断,然后调用中断函数Aif2IntHook,再在Aif2IntHook里面post信号量g_Semaphore_Fftc和gSemaphore_CommDecoder吗?

首先进入Start。

2. /pdsch_receiver/pdsch_rx_fftc/Aif2/Source/Frmwk_BspAif2Init.c/line 921

AIF产生1 symbol周期中断,中断时调用中断函数Bsp_Aif2MeshHwInt(),请问1 symbol周期中断是多长时间?是1ms吗?(这个问题和fft计算的长度有关,因为在fft计算的函数中,一次计算1ms [14个符号]的数据。)

中断函数Bsp_Aif2MeshHwInt()的作用是什么?以及line 494为什么要每个Symbol都提前两个Symbol发送?

3. /pdsch_receiver/pdsch_rx_fftc/tf_fftc.c/line 209 void GetOnesubFramDatFromAifBuf(unsigned int CurrentSubFramNum)

因为数据向左偏,因此在取数的时候有一个AifBufDatOffSet,但是在程序中取的是当前1ms数据中最后396个数据,而最后396个数据属于下一个1ms,这样做的话不会对当前的数据产生干扰吗?

4. Bsp_Aif2MeshHwInt()和Aif2IntHook()的关系是怎样的?它们的时序?

5. AIF数据是如何存的?天线时刻不停的在接收数据,而程序总是在同一个地址取数据,如何保证数据的完整性?如果DSP读取不及时,AIF里的数据是否被覆盖?

6. AIF存储的数据,是不是低地址为实部,高地址为虚部?

7. 熟悉AIF,只需要知道如何使用AIF的接口就可以了吧,比如如何使用初始化函数Bsp_Aif2Init(&Aif2Init_Param),调用哪个中断函数以及中断函数(Aif2IntHook)的作用,除此之外,还有什么需要注意的问题?

8. /pdsch_receiver/pdsch_rx_fftc/maig.c/line 253

在核之间交换数据的时候丢失数据怎么办?FftMissCpyDatCnt++,不做任何处理吗?

备注:发送端中Aif2Init_Param.funcAif2IntHook = NULL,接收端中Aif2Init_Param.funcAif2IntHook = Aif2IntHook。

NEW QUESTIONS:

1.  如果改成两天线,AIF在发送端如何控制读取数据(尤其是读取第二根天线的数据,注意ping-pong效应),在接收端如何控制写入数据(尤其是写入第二根天线的数据)?

2. 接收端在写入数据的时候是不是不用考虑ping-pong效应了?因为开辟的AIF buffer是10ms,时间足够大。

3. 仿真共享问题。


6.注释位置


AIF驱动:official\LTE\ccs\transmitter_ccs\pdsch_transmitter 和 official\LTE\ccs\transmitter_ccs\pdsch_receiver


7.其他


分核:

有关内存分配(共享内存)请参考TMS320C6670 Multicore Fixed and Floating-Point System-on-Chip.pdf中Section 2.2 Memory Map Summary Table2-2 Memory Map Summar P26。

分核的代码处于

发送端

pdsch_transmitter/main.c

Tx_Core2/main.c

其中共享内存选择为Core2的CorePac2

接收端

pdsch_receiver/pdsch_rx_fftc/maig.c _T_Core0ToCore1Data

Rx_Core1/main.c T_Core1ToCore2Data

Rx_Core2/main.c _T_Core2ToCore0Data

分享到:

发表评论