线性分组码63码的编译码仿真设计.docx

上传人:b****2 文档编号:2589224 上传时间:2023-05-04 格式:DOCX 页数:19 大小:120.69KB
下载 相关 举报
线性分组码63码的编译码仿真设计.docx_第1页
第1页 / 共19页
线性分组码63码的编译码仿真设计.docx_第2页
第2页 / 共19页
线性分组码63码的编译码仿真设计.docx_第3页
第3页 / 共19页
线性分组码63码的编译码仿真设计.docx_第4页
第4页 / 共19页
线性分组码63码的编译码仿真设计.docx_第5页
第5页 / 共19页
线性分组码63码的编译码仿真设计.docx_第6页
第6页 / 共19页
线性分组码63码的编译码仿真设计.docx_第7页
第7页 / 共19页
线性分组码63码的编译码仿真设计.docx_第8页
第8页 / 共19页
线性分组码63码的编译码仿真设计.docx_第9页
第9页 / 共19页
线性分组码63码的编译码仿真设计.docx_第10页
第10页 / 共19页
线性分组码63码的编译码仿真设计.docx_第11页
第11页 / 共19页
线性分组码63码的编译码仿真设计.docx_第12页
第12页 / 共19页
线性分组码63码的编译码仿真设计.docx_第13页
第13页 / 共19页
线性分组码63码的编译码仿真设计.docx_第14页
第14页 / 共19页
线性分组码63码的编译码仿真设计.docx_第15页
第15页 / 共19页
线性分组码63码的编译码仿真设计.docx_第16页
第16页 / 共19页
线性分组码63码的编译码仿真设计.docx_第17页
第17页 / 共19页
线性分组码63码的编译码仿真设计.docx_第18页
第18页 / 共19页
线性分组码63码的编译码仿真设计.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

线性分组码63码的编译码仿真设计.docx

《线性分组码63码的编译码仿真设计.docx》由会员分享,可在线阅读,更多相关《线性分组码63码的编译码仿真设计.docx(19页珍藏版)》请在冰点文库上搜索。

线性分组码63码的编译码仿真设计.docx

线性分组码63码的编译码仿真设计

*******************

实践教学

*******************

 

兰州理工大学

 

计算机与通信学院

2013年秋季学期

计算机通信课程设计

 

题目:

线性分组码(6,3)码的编译码仿真设计

专业班级:

通信三班

姓名:

学号:

指导教师:

彭铎

成绩:

摘要

线性分组码是差错控制编码的重要一种,在本次课程设计中,我们采用MATLAB对线性分组码(6,3)码进行编码与译码的仿真设计。

它可以对输入的三位的信息码进行线性分组码编码,对于接收到的六位码字可以进行译码,从而译出三位信息码。

当接收到的六位码字中有一位发生错误时,可以纠正一位错码;当接收到的码字有两位发生错误时,只判断是否正确,但不纠正错误。

关键字:

线性分组码编码译码

目录

前言1

1线性分组码2

1.1线性分组码编码2

1.2校验矩阵4

1.3伴随式与译码4

1.3.1码的距离及纠检错能力4

1.3.2伴随式与译码5

2MATLAB的简介7

2.1MATLAB的概况7

2.2MATLAB的语言特点7

3仿真结果及分析10

3.1程序分析10

3.2仿真结果10

设计总结12

致谢13

参考文献14

附录15

前言

近年来,随着计算机、卫星通信及高速数据网的飞速发展年来随着计算机、卫星通信及高速数据网的飞速发展,数据的交换、处理和存储技术得到了广泛的应用,人们对数据传输和存储系统的可靠性提出了越来越高的要求。

因此,如何控制差错、提高数据传输和存储的可靠性,成为现代数字通信系统设计的重要课题。

在实际信道上传输数字信号时,由于信道传输不理想和加性噪声的影响,接收端所收到的信号不可避免的会发生错误,必须采用信道编码(即差错控制编码)将错误比特率进一步的降低,以满足系统指标的要求。

所谓信道编码就是在要传输的信息序列中增加一些被称为监督码元的码组使之在接收端能够发现传输过程中是否有错并予以纠正。

目前,绝大多数的数字计算机和数字通信系统中广泛采用二进制形式的码。

而线性分组码具有编译码简单,封闭性好等特点,采用差错控制编码技术是提高数字通信可靠性的有效方法,是目前较为流行的差错控制编码技术。

对线性分组码即使线性码又是分组码,分组码是一组固定长度的码组,可表示为

,其中n表示码字的长度,k表示信息位的长度,而n-k个监督位的作用就是实现检错与纠错。

1线性分组码

即是线性码又是分组码的码称线性分组码,监督码元与本组信息码元有关的码称为分组码,监督码元与信息码元的关系可以用线性方程表示的码,因此,一个码字中的监督码元只与本码字的信息码元有关,而且这种关系可以用线性方程来表示的就是线性分组码通常用(n,k)表示。

线性分组码(n,k)中许用码字(组)为2k个。

定义线性分组码的加法为模二加法,乘法为二进制乘法。

即1+1=0、1+0=1、0+1=1、0+0=0;1×1=1、1×0=0、0×0=0、0×1=0。

线性分组码具有如下性质(n,k)的性质:

1、封闭性。

任意两个码组的和还是许用的码组。

2、码的最小距离等于非零码的最小码重。

对于码组长度为n、信息码元为k位、监督码元为r=n-k位的分组码,常记作(n,k)码,如果满足2r-1≥n,则有可能构造出纠正一位或一位以上错误的线性码。

1.1线性分组码编码

下面以(6,3)分组码为例,讨论线性分组码的编码原理。

设分组码(n,k)中,k=3,为能纠正一位误码,要求r≥3。

现取r=3,则n=k+r=6。

该例子中,信息组为

码字为

.当已知信息组时,按以下规则得到三个校验元,即

c2=c5+c4

c1=c3+c4(1-1)

c0=c5+c3

这组方程称为校验方程。

(6,3)线性分组码有23(8)个许用码字或合法码字,另有26-23个禁用码字。

发送方发送的是许用码字,若接收方收到的是禁用码字,则说明传输中发生了错误。

为了深化对线性分组码的理论分析,可将其与线性空间联系起来。

由于每个码字都是一个二进制的n重,及二进制n维线性空间

中的一个矢量,因此码字又称为码矢。

线性分组码的一个重要参数是码率r=k/n,它说明在一个码字中信息位所占的比重,r越大,说明信息位所占比重越大,码的传输信息的有效性越高。

由于(n,k)线性分组,线性分组码的2k个码字组成了n维线性空间

的一个K维子空间。

因此这2k个码字完全可由k个线性无关的矢量所组成。

设此k个矢量为

有生成矩阵形式为

G=

(1-2)

(n,k)码字中的任一码字

均可由这组基底的线性组合生成,即

=

·G=

·G

式中,

 =[mn-1mn-2…mn-k]是k个信息元组成的信息组。

表1.1(6,3)线性分组码

信息组

码字

000

000000

001

001011

010

010110

011

011101

100

100101

101

101110

110

110011

111

111000

对于表1给出的(6,3)线性分组码,可将写成矩阵形式

=

.

故(6,3)码的生成矩阵为

G=

可以看到,从(6,3)码的8个码字中,挑选出k=3个线性无关的码字(100101)(010110),(001011)作为码的一组基底,用c=m·G计算得码字。

一个系统码的生成矩阵G,其左边k行k列应是一个k阶单位方阵

,因此生成矩阵G表示为

G=

(1-3)

式中,Q是一个k×(n-k)阶矩阵。

1.2校验矩阵

在表1所示的(6,3)线性分组码的四个校验元由式(1-1)所示的线性方程组决定的。

把(1-1)移相,有

c5+c4+c2=0

c3+c1+c4=0(1-4)

c5+c3+c0=0

上式的矩阵形式为

.

=

这里的四行七列矩阵称为(6,3)码的一致校验矩阵,用H表示,即

H=

(1-5)

由H矩阵得到(n,k)线性分组码的每一码字

(i=1,2,…,2k),都必须满足由H矩阵各行所确定的线性方程组,即

·HT=0。

(6,3)码的生成矩阵G中每一行及其线性组合都是(n,k)码的码字,所以有G·HT=0。

由G和H构成的行生成的空间互为零空间,即G和H彼此正交。

H=[PTIr]其右边r行r列组成一个单位方阵。

1.3伴随式与译码

1.3.1码的距离及纠检错能力

1.码的距离

两个码字之间,对应位取之不同的个数,称为汉明距离,用d表示。

一个吗的最小距离

定义为

=

两个码字之间的距离表示了它们之间差别的大小。

距离越大,两个码字的差别越大,则传送时从一个码字错成另一码字的可能性越小。

码的最小距离愈大,其抗干扰能力愈强。

2.线性码的纠检错能力

对于任一个(n,k)线性分组码,若要在码字内

(1)检测出e个错误,则要求码的最小距离d≥e+1;

(2)纠正t个错误,则要求码的最小距离d≥2t+1;

(3)纠正t个错误同时检测e(≥t)个错误,则要求d≥t+e+1;

1.3.2伴随式与译码

假设接收端收到的码字为R,那么它和原来发送端发送的码字A之间就有可能存在着误差。

即在码组A=

中的任意一位就有可能出错。

这样我们在接收端接收到一个码组是就有可能判断错发送端原来应该要表达的意思。

为了描述数据在传输信道中出现错误的情况,引入了错误图样E,在错误图样中,0代表对应位没有传错,1代表传输错误。

实际上错误图样E就是收序列与发送序列的差。

所以在译码中用接收到的码字B模尔加错误图样E就可以得到发送端的正确码字A。

因此译码的过程就是要找到错误图样E。

定义:

伴随式S

S=R*

=(A+E)*

=A*

+E*

=E*

因为A是编得的正确码字。

根据前面所叙述,它和监督矩阵的转置相乘为0。

显然,S仅与错误图样有关,它们之间是一一对应的关系。

找到了伴随式S,也就可以找到E。

而与发送的码字无关。

若E=0,则S=0;因此根据S是否为0可进行码字的检错。

如果接收码字R中只有一位码元发生错误,又设错误在第i位。

即Ei-1=1,其他的Ei均为0。

在后面的译码程序中,建立了一个伴随式S与错误图样E对应的表。

也就是收到一个R序列,就可以通过计算得到一个校正子,而每一个校正子都对应着一个错误图样E,再通过R模尔加上E,就可以得到正确的码字A。

因为在不同的错误序列R中,同一位码元错误时对应的E是一样的,所以可以利用000000这个正确的码字让它每位依次错误,来求得它的八个校正子。

而这时的矩阵R就是错误图样E。

以上面的(6,3)码为例,译码过程中的S与E的计算关系。

对于译码过程来说,同样由上知道监督矩阵:

H=

H矩阵与(n,k)码的任何一个许用码字进行相乘的结果必等于0,即若C=m·G是任一(n,k)码字,则必有C·HT=0。

若不属于许用码字,或有传输差错,且差错位数在(n,k)码纠错能力内,则运算结果将为非0值,此时,可以纠错或检错重发当编码矩阵与生成矩阵的转置矩阵相乘时,若当其中的一位编码或两位出现差错时会有八种情况,则这些情况列出错码矩阵如下:

表1.2(6,3)线性分组码的译码表

校正子S

错误图样E

000

000000

101

000001

110

000010

011

000100

100

001000

010

010000

001

100000

而这些情况正好是和校验子有某种对应关系的,根据这些对应关系可以进行相关编程。

若编程检测到了那一位错误可以根据

A=R+E(1-6)

其中A为纠错输出码序列,E为差错图样,R为接受到的码字。

对接收到的信息进行改正求出正确的编码,从而再提去更正后的接收序列的前三位来提取信息位,以至获得信息矩阵I。

2MATLAB的简介

2.1MATLAB的概况

MATLAB是“矩阵实验室”的缩写,它是由美国Mathworks公司于1984年正式推出的,是一种面向科学和工程计算的语言,它集数值分析、矩阵运算、信号处理和图形显示于一体,具有编程效率高、调试手段丰富、扩充能力强等特点。

MATLAB的信号处理工具箱具有强大的函数功能,它不仅可以用来设计数字滤波器,还可以使设计达到最忧化,是数字滤波器设计的强有力工具。

Matlab是一种集成度很高的语言,由于其功能强,使用便捷和使用范围广等特点而被广大科技工作者所接受,已经在教学、科研和工程实际中广泛应用,被一些学者称为是第四代计算机语言。

他用更直观的、符合人们思维习惯的代码,代替了C语言和Fortran语言的冗长代码,给用户呈现的是最直观、最简洁的程序开发环境。

他提供的各种功能很强的工具箱更是为我们的学习和研究节省了大量的时间和精力。

在Matlab6.1中开发组对通信系统工具箱进行了扩充,这将使人们在进行通信系统方面的实验和研究更加快捷。

2.2MATLAB的语言特点

一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有着不同于其他语言的特点,正如同FORTRAN和C等高级语言使人们摆脱了需要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的MATLAB,Matalab具有用法简单、灵活、程式结构性强、延展性好等优点,已经逐渐成为科技计算、视图交互系统和程序中的首选语言工具。

特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术仁员进行科学研究和生产实践的有利武器。

1Matlab的技术特点

(1)、语言简洁紧凑,语法限制不严,程序设计自由度大,可移植性好。

Matlab是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入输出和面向对象编程特点。

Matlab以矩阵为基础,不需要预先定义变量和矩阵(包括数组)的维数,可以方便地进行矩阵的算术运算、关系运算和逻辑运算等。

而且Matlab有特殊矩阵专门的库函数,可以高效地求解诸如信号处理、图像处理、控制等问题。

(2)、运算符、库函数丰富

Matlab的一个重要特色就是具有一套程序扩展系统和一组称之为工具箱的特殊应用子程序,每一个工具箱都是为某一类学科专业和应用而定制的。

Matlab包含两个部分:

核心部分和各种可选的工具箱。

核心部分中有数百个核心内部函数。

其工具箱又分为两类:

功能性工具箱和学科性工具箱。

功能性工具箱主要用来扩充其符号计算功能,图示建模仿真功能,文字处理功能以及与硬件实时交互功能;而学科性工具箱是专业性比较强的,如control,toolbox,signlproceessingtoolbox,commumnicationtoolbox等。

这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序就可直接进行高、精、尖的研究。

(3)、强大的数值(矩阵)运算功能

Matlab是一个包含大量计算算法的集合。

其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。

函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。

在通常情况下,可以用它来代替底层编程语言,如C和C++。

在计算要求相同的情况下,使用Matlab的编程工作量会大大减少。

Matlab的这些函数集包括从最简单最基本的函数到诸如矩阵、特征向量、快速傅立叶变换的复杂函数。

函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。

(4)、界面友好、编程效率高

Matlab程序书写形式自由,被称为“草稿式”语言,这是因为其函数名和表达更接近我们书写计算公式的思维表达方式,编写Matlab程序犹如在草稿纸上排列公式与求解问题,因此可以快速地验证工程技术人员的算法。

此外Matlab还是一种解释性语言,不需要专门的编译器。

具体地说,Matlab运行时,可直接在命令行输入Matlab语句,系统立即进行处理,完成编译、链接和运行的全过程。

利用丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程工作

(5)、图形功能强大

Matlab具有非常强大的以图形化显示矩阵和数组的能力,同时它能给这些图形增加注释并且可以对图形进行标注和打印。

Matlab的图形技术包括二维和三维的可视化、图象处理、动画等高层次的专业图形的高级绘图函数(例如图形的光照处理、色度处理以及四维数据的表现等),又包括一些可以让用户灵活控制图形特点的低级绘图命令,可以利用Matlab的句柄图形技术创建图形用户界面。

同时对一些特殊的可视化要求,例如图形对话等,Matlab也有相应的功能函数,保证了用户不同层次的要求。

另外新版本的Matlab还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。

2Matlab的功能特点

它将一个优秀软件的易用性与可靠性、通用性与专业性、一般目的的应用与高深的科学技术应用有机的相结合

扩展性强Matlab不仅有着丰富的库函数,在进行复杂的数学运算时可以直接调用。

而且用户还可以根据需要方便地编写和扩充新的函数库。

通过混合编程用户可以方便地在Matlab环境中调用其他用Fortran或者C语言编写的代码,也可以在C语言或者Fortran语言程序中调用Matlab计算引擎来执行Matlab代码。

可靠的容错功能、应用灵活的兼容与接口功能MathWorks公司开发的MatlabNotebook成功地将MicrosoftWord和Matlab结合在一起,为文字处理、科学计算和工程设计营造了一个完美的工作环境。

Matlab的Notebook实现Word和Matlab无缝连接使Word不仅兼具原有编辑能力而且又增加了Matlab强大的计算和绘图能力,在科学研究、工程设计和教学方面都有很好的实用价值,已经远远的把MathCAD抛在后面。

MatlabNotebook可以在word中随时修改计算命令,随时计算并生成图像返回,使用户能在Word环境中“随心所欲地享用”Matlab的浩瀚科技资源。

信息量丰富的联机检索功能新版本的Matlab可以利用Matlab编译器和C/C++数学库和图形库,将自己的MATLAB程序自动转换为独立于Matlab运行的C和C++代码。

允许用户编写可以和Matlab进行交互的C或C++语言程序。

另外,Matlab网页服务程序还容许在Web应用中使用自己的Matlab数学和图形程序。

综上所述,Matlab是一种基于矩阵运算、具有强大的数值运算和数据处理功能的高级编程语言,广泛应用于信号分析、语音分析、优化设计等领域,在复杂算法方面表现出其他语言难以比拟的优势,目前已成为国际上最为流行的软件之一。

开放性也许是Matlab最受人们欢迎的特点。

除内部函数以外,所有Matlab的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。

3仿真结果及分析

3.1程序分析

G生成矩阵H监督矩阵C许用码组I输入信息序列R接受码字A纠错输出码序列E错误图样S伴随式

通过生成矩阵G,使用MATLAB语言H=gen2par(G);求出其校验矩阵H,通过C=rem(I*G,2);disp('所得许用码组结果为:

C=');计算并显示许用码组C。

根据接受到的码字译码,输入接收到的码字R,通过校验矩阵H,判断码字的正误,若没有错误则输出正确码字,若有一位错误则显示第几位错误并纠正错误码字,输出正确的信息为码字码字。

3.2仿真结果

若输入接受码字为[001011],则显示没有错误,显示纠正后的码字为原码字并显示译出信息序列为001

图3.1输入正确码字

若输入接受到的码字为[110000],则显示第四位出现一个错误并纠正其错误,显示纠正后的正确码字[111000],并译出正确的信息序列111

图3.2输入一个错误码字

设计总结

通过本次课程设计使我们了解了线性分组码的设计原理,并运用MATLAB语言实现了线性分组码的设计仿真。

使我进一步的学习了关于MATLAB语言的基本知识,并将其与实践相结合。

我了解到MATLAB的知识以及它的应用不仅仅局限在我所学的课本理论知识,而更多的是在实际生活和工作中的应运。

根据课设要求我们使用程序通过生成矩阵求出其校验矩阵、生成码字、并对接受码字译码,并判断输出码字的正误,若为一位错误纠正错误并输出正确信息位。

在这次为期两周课程设计的过程中,我深深的感触到了团队合作的重要性,尤其是在当今的社会工作中,一个人的力量在一个巨大的任务前是那么的渺小,必须靠多人合作才能共同完成。

在设计规划过程,我们小组几个人亲密无间的合作,使得本次课程设计能够非常顺利地完成,在课程设计的过程中,每个人都能按要求很好的完成分配给自己的任务,最后大家一起通过讨论把所有任务串连起来完成总的设计任务。

通过本次课程设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计的能力。

既让我们懂得了怎样将理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。

在设计过程中,总是会遇到这样或那样的问题。

有时一个问题可能会需要大家集体去查阅资料,做大量的工作,花大量的时间才能解决。

通过不断地发现问题,解决问题,自然而然,我的发现问题和解决问题的能力便在其中建立起来了。

这都为以后的工作积累了经验,同时也增强了我们解决问题的能力。

更为难得的是,在这次训练过程中,屡屡碰见一些问题,在解决这些问题的过程中,不断加强了我对通信系统的理解。

对于一些自己不清楚,不明白但平时又很难发现的知识点有了一次全面的巩固与复习。

在大学阶段,理论的学习和实践是密不可分的。

离开了实践的理论是没有任何意义可言的。

与此同时,理论是需要伴随着实践才能完善。

同时,在与同学共同在解决一些问题的过程中,提高了我们的团队协作精神。

致谢

通过本次课程设计综合训练,我们都学到了许多东西,体会到了从书本学习与实际应用中的不同,这种感同身受必将对我们今后的学习与生活带来很大的帮助。

在本次课程设计中,我们的指导老师时时在我们的身旁引导我们,帮助我们,倾注他们所有的才华,用心血让我们学会从理论走向实际这一目标十分艰辛,对我们来说是飞跃的过程。

不会忘记他们为了我们紧缩的眉头,焦急的眼神,疲倦的笑容,忙碌的身影!

谢谢指导老师对我们的帮助!

同时也谢谢我的队友,是他们让我懂得团队合作的重要性,在他们身上我也学到了知识,是他们让我明白了一个人的力量是薄弱的,合作的力量是不可估量的,我相信在今后学习和工作中,像他们多多学习。

参考文献

[1]孙丽华著.信息论与纠错编码.电子工业出版社.2005,3

[2]郭文彬桑林著.通信原理-基于MATLAB的计算机仿真.北京邮电大学出版社.2006.2

[3]苏金明阮沈勇著.MATLAB实用教程(第二版).电子工业出版社.2008.2

[4]徐东艳孟晓刚著.MATLAB函数库查询词典.中国铁道出版社.2006.4

[5]潘新民著.计算机通信技术[M].电子工业出版社.2003.7

[6]吴玲达李国辉杨冰等著.计算机通信原理与技术.国防科技大学出版社.2003.3

附录

线性分组码(6,3)码编译码源程序:

clearall

closeall

G=[100101;

010110;

001011];%给出生成矩阵

H=gen2par(G);%求监督矩阵

disp('监督矩阵为:

H=');

disp(H);

I=[000;001;010;011;100;101;110;111];

C=rem(I*G,2);%求出的许用码组为C

disp('所得许用码组结果为:

C=');%显示输出码字C

disp(C);

%译码并判别

clearall;

closeall;

G=[100101;

010110;

001011];

R=input('请输入接收到的码组R:

');

[a,b]=size(R);%返回数组R的维数

E=[000000;100000;010000;001000;

000100;000010;000001];

H=gen2par(G);

S=rem(R*H',2);%求校验子S

disp('所得伴随式为:

S=');%显示输出码字的伴随式

disp(S);

i=1;

fori=1:

1:

a

M(i,1)=S(i,1).*4+S(i,2).*2+S(i,3);%求校验子所表示的十进制整数

end

fori=1:

1:

a

switch(M(i,1))

case0

A(i,:

)=R(i,:

)+E(1,:

);

case5

A(i,:

)=R(i,:

)+E(2,:

);

case6

A(i,:

)=R(i,:

)+E(3,:

);

case3

A(i,:

)=R(i,:

)+E(4,:

);

case4

A(i,:

)=R(i,:

)+E(5,:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2