首页 > 范文大全 > 正文

移动通信系统中交织编码器的设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇移动通信系统中交织编码器的设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:以GSM移动通信系统为例,在分析GSM通信系统信道编码结构、交织方式的基础上,提出基于FPGA用块内交织方法实现该系统中的交织器,利用VHDL语言完成该系统中交织器的具体设计,并验证设计的正确性和可行性,为使用软件无线电实现GSM基站系统奠定了基础。

关键词:信道编码;交织器;仿真分析;软件无线电

中图分类号:TN91122文献标识码:B

文章编号:1004-373X(2008)08-075-03オ

Design of Interleave Encoder in Mobile Communication System

FAN Yan′gen1,2,LIU Songyan2,HUANG Danling1,ZHAO Lin1

(1.Heilongjiang Institute of Science and Technology,Harbin,150027,China;

2.Microelectronics Center,Harbin Institute of Technology,Harbin,150001,China)オ

Abstract:On the basis of analyzing the channel coding structure and interleave style of the system,taking an example of GSM,this passage introduces a new method based on FPGA to realize the interleave of system,introduces the detailed design of the interleave with VHDL in the system,testifies the exactness and feasibility of this method and establishes the basis to realize GSM base station system using software radio.

Keywords:channel coding;interleave;simulation analysis;software radio

软件无线电[1]是一种实现无线通信的新的体系结构,是无线通信产业从模拟到数字、从固定到移动这两次革命后的第三次革命,是从硬件无线通信到软件无线通信的革命。

在从事使用软件无线实现GSM基站研究中,在深入研究GSM通信系统信道编码结构、交织方式的基础上,利用VHDL硬件描述语言完成GSM基站信道编码中使用的交织器的具体设计,为进一步研究软件无线技术在GSM基站系统中应用打下基础。

1 GSM的话音编码与信道编码

在GSM通信系统中,全速率话音编码算法为规则脉冲激励及长期预测算法(RPELTP)。模拟话音首先通过一个ADC以8 kHz采样频率进行采样,每个采样点用均匀13 b编码。话音编码器对每20 ms一段的话音进行压缩编码,编码结果为每20 ms产生260 b的数据块。这260 b的数据根据他们的重要性分成为3类:Ia类、Ib类和Ⅱ类。Ia类共50 b,为非常重要的数据。如果这些数据被修改,恢复的话音将发生很大的错误,甚至无法恢复正常的话音,因此这些数据需要严格保护。Ib类数据共132 b,是比较重要的数据,需要进行较好的保护。Ⅱ类数据共78 b,为一般重要的数据,发生一些差错也不会对恢复的话音有太大的影响,通常不对其进行保护。根据数据重要性的不同,决定信道编码中采用不同的保护方法。

GSM通信系统的信道编码首先对Ia类数据进行差错检测编码,产生3个循环冗余校验(CRC)比特,这些比特的产生使用多项式为G(x)=X3X1。3个CRC比特附在Ia类的50 b后面,再与Ib类数据组合在一起进行K=5,r=1/2的卷积编码,卷积编码器使用的2个多项式为P1(x)=X4X31和P2(x)=X4X3X1,Ь砘编码产生的结果是两个189 b的序列,将他们与不需要保护的Ⅱ类数据复合在一起,产生一个完整的经过信道编码的话音帧,共456 b。

2 交织编码器工作原理

信道编码中采用交织技术[2],可打乱码字比特之间的相关性,将信道中传输过程中的成群突发错误转换为随机错误,从而提高整个通信系统的可靠性。交织编码根据交织方式的不同,可分为线织、卷积交织和伪随机交织。其中线织编码是一种比较常见的形式。所谓线织编码器,是指把纠错编码器输出信号均匀分成m个码组,每个码组由n段数据构成,这样就构成一个n×m的矩阵。这里把这个矩阵称为交织矩阵。如图1所示,数据以a11,a12,…,a1n,a21,a22,…,a2n,…,aij,… ,am1,am2,…,amn(i=1,2,…,m;j=1,2,…,n)的顺序进入交织矩阵,交织处理后以a11,a21,…,am1,a12,a22,…,am2,…,a1n,a2n,…,amn的顺序从交织矩阵中送出,这样就完成对数据的交织编码。还可以按照其他顺序从交织矩阵中读出数据,不管采用哪种方式,其最终目的都是把输入数据的次序打乱。 如果aij只包含1个数据比特,称为按比特交织[3];如果aijО含多个数据比特,则称为按字交织。接收端的交织译码同交织编码过程相类似。

И

a11a12…a1n

a21a22…a2n

螃螃螃螵

am1am2…amn交织处理后[TXX*2] a11a21…am1

a12a22…am2

螃螃螃螵

a1na2n…amn

И

图1 n×m交织矩阵线织编码

一般来说,如果有n个(m,k)码,排成n×m矩阵,按列交织后存储或传送,读出或接收时恢复原来的排列,若(m,k)码能纠t个错误,那么交织后就可纠nt个错误。对纠正信道传输过程中出现的突发错误效果明显。И

GSM中使用这种比特交织器。其交织方式为将信道编码后的每20 ms的数据块m=456 b拆分到8组中,每组57 b,然后这每组57 b分配到不同的Burst中。

3 交织编码器的软件设计

GSM通信系统必须满足实时性的要求,因此,交织编码引入的延时应尽可能小。为了同时满足块内交织进行(57,8)矩阵转置变换和延时尽可能小的要求,该交织器利用2片双口RAM实现,记作RAM[CD#*2] 和RAM[CD#*2] B。交织处理时,按地址从0~455 将456 b输入数据全部写入RAM[CD#*2]A,待456 b数据全部送入RAM[CD#*2]A后,控制信号使RAM[CD#*2]A由写状态转换到读状态,同时,将输入的待交织数据写入RAM[CD#*2]B,RAM[CD#*2]B为写状态,交织器由RAM[CD#*2]A输出数据。经过456个时钟周期后,从RAM[CD#*2]A读出456 b数据的同时,RAM[CD#*2]B写入一个时隙的456 b数据。此时,改变RAM[CD#*2]A和RAM[CD#*2]B的读写状态,RAM[CD#*2]A开始写,从RAM[CD#*2]B中读取数据。如此反复完成数据的实时连续交织处理。

完成交织处理的核心问题是处理好读/写地址之间的关系,该交织器读/写地址的变换采用如下算法完成:

readaddress(j×8+i)=writeaddress(i×57+j)

(i=0,1,2,…,7;j=0,1,2,…,57)

为减少FPGA运算量,可利用Matlab,C语言等实现读/写地址矩阵转置运算。这里采用Matlab完成读/写地址矩阵转置运算,具体程序为:x=0:1:455;reshape(x,57,8)。读/写地址的变换结果存储在address[CD#*2]ROM.mif文件中[4]。利用VHDL语言描述该交织编码器完整代码如下:

[HT4][HT5”]

LIBRARY IEEE;

USE IEEE.STD[CD#*2]LOGIC[CD#*2]1164.ALL;

USE IEEE.STD[CD#*2]LOGIC[CD#*2]SIGNED.ALL;

USE IEEE.STD[CD#*2]LOGIC[CD#*2]UNSIGNED.ALL;

USE IEEE.STD[CD#*2]LOGIC[CD#*2]ARITH.ALL;

LIBRARY lpm;

USE lpm.lpm[CD#*2]components.ALL;

LIBRARY altera[CD#*2]mf;

USE altera[CD#*2]mf.altera[CD#*2]mf[CD#*2]components.all;

ENTITYGSM[CD#*2]VHDL IS

GENERIC (intlv[CD#*2]length: positive := 456);

PORT(clk:INSTD[CD#*2]LOGIC;

data[CD#*2]in: INSTD[CD#*2]LOGIC;

wr[CD#*2]addr[CD#*2]A,rd[CD#*2]addr[CD#*2]A: BUFFER STD[CD#*2]LOGIC[CD#*2]VECTOR(8 DOWNTO 0);

intlv[CD#*2]data[CD#*2]A,intlv[CD#*2]data[CD#*2]B:BUFFER STD[CD#*2]LOGIC;

RAM[CD#*2]select[CD#*2]cnt:BUFFER STD[CD#*2]LOGIC[CD#*2]VECTOR(9 DOWNTO 0);

RAM[CD#*2]select,RAM[CD#*2]read[CD#*2]ena:BUFFER STD[CD#*2]LOGIC;

intlv[CD#*2]out:BUFFER STD[CD#*2]LOGIC );

END ENTITY GSM[CD#*2]VHDL;

ARCHITECTURE address[CD#*2]control[CD#*2]fan OF GSM[CD#*2]VHDL is

SIGNAL RAM[CD#*2]read[CD#*2]delay1 :STD[CD#*2]LOGIC;

SIGNAL RAM[CD#*2]out[CD#*2]A,RAM[CD#*2]out[CD#*2]B :STD[CD#*2]LOGIC;

BEGIN

RAM[CD#*2]select[CD#*2]cnt[CD#*2]mine : COMPONENT lpm[CD#*2]counter

GENERIC MAP (LPM[CD#*2]WIDTH=>10,LPM[CD#*2]MODULUS=>912)

PORT MAP (clock=>clk,updown=>′1′,q=>RAM[CD#*2]select[CD#*2]cnt);

RAM[CD#*2]select[CD#*2]mine :COMPONENT lpm[CD#*2]compare

GENERIC MAP(LPM[CD#*2]WIDTH=>10,LPM[CD#*2]REPRESENTATION=> "UNSIGNED")

PORT MAP(dataa=>RAM[CD#*2]select[CD#*2]cnt,datab=>"0111001000",ageb=>RAM[CD#*2]select);

data[CD#*2]input[CD#*2]select: PROCESS(RAM[CD#*2]select,data[CD#*2]in)

BEGIN

IF RAM[CD#*2]select =′0′ THEN

intlv[CD#*2]data[CD#*2]A

intlv[CD#*2]data[CD#*2]B

ELSE

intlv[CD#*2]data[CD#*2]A

intlv[CD#*2]data[CD#*2]B

END IF;

END PROCESS data[CD#*2]input[CD#*2]select;

wr[CD#*2]addr[CD#*2]A[CD#*2]mine : COMPONENT lpm[CD#*2]counter

GENERIC MAP (LPM[CD#*2]WIDTH=>9,LPM[CD#*2]MODULUS=>intlv[CD#*2]length)

PORT MAP (clock=>clk,updown=>′1′,q=>

wr[CD#*2]addr[CD#*2]A);

rd[CD#*2]addr[CD#*2]mine[CD#*2]A:COMPONENT altsyncram

GENERIC MAP (OPERATION[CD#*2]MODE=>"ROM",WIDTH[CD#*2]A =>9,WIDTHAD[CD#*2]A =>9,OUTDATA[CD#*2]REG[CD#*2]A=>"clock0",INIT[CD#*2]FILE => "address[CD#*2]ROM.mif")

PORT MAP (clock0=>clk,address[CD#*2]a=>

wr[CD#*2]addr[CD#*2]A,q[CD#*2]a=>rd[CD#*2]addr[CD#*2]A);

RAM[CD#*2]read[CD#*2]delay[CD#*2]one: COMPONENT lpm[CD#*2]ff

GENERIC MAP (LPM[CD#*2]WIDTH=>1)

PORT MAP(data(0)=>RAM[CD#*2]select,clock=>clk,q(0)=>RAM[CD#*2]read[CD#*2]delay1);

RAM[CD#*2]read[CD#*2]delay[CD#*2]two: COMPONENT lpm[CD#*2]ff

GENERIC MAP (LPM[CD#*2]WIDTH=>1)