卷积编码与解码的MATLAB实现及性能分析-课程设计任务书.docx

上传人:沧海****B 文档编号:91491263 上传时间:2023-05-27 格式:DOCX 页数:24 大小:937.06KB
返回 下载 相关 举报
卷积编码与解码的MATLAB实现及性能分析-课程设计任务书.docx_第1页
第1页 / 共24页
卷积编码与解码的MATLAB实现及性能分析-课程设计任务书.docx_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《卷积编码与解码的MATLAB实现及性能分析-课程设计任务书.docx》由会员分享,可在线阅读,更多相关《卷积编码与解码的MATLAB实现及性能分析-课程设计任务书.docx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、长沙理工大学通信原理课程设计报告 学 院 计算机与通信工程 专 业 通信工程 班 级 学 号 学生姓名 指导教师 曹敦 课程成绩 完成日期 2015年1月4日课程设计成绩评定学 院 计算机与通信工程学院 专 业 通信工程 班 级 学 号 学生姓名 指导教师 曹敦 课程成绩 完成日期 2015年1月4日 指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量指导教师对课程设计的评定意见综合成绩 指导教师签字 年 月 日课程设计任务书 计算机与通信工程 学院 通信工程 专业 课程

2、名称通信原理课程设计时间20142015学年第一学期1718周学生姓名指导老师曹敦题 目卷积编码与解码的MATLAB实现及性能分析主要内容: 本课程设计的目的主要是仿真纠错编码系统。对输入随机数字信号进行卷积纠错编码后,送入含噪信道,在接收端再进行解码和检纠错,改变信道误码率大小,测试接收信号与发送信号之间的误码率,分析该种纠错编码系统的抗噪声性能。要求:(1)本设计开发平台为MATLAB中的Simulink。(2)模型设计应该符合工程实际,模块参数设置必须与原理相符合。(3)处理结果和分析结论应该一致,而且应符合理论。(4)独立完成课程设计并按要求编写课程设计报告书。应当提交的文件:(1)课

3、程设计学年论文。(2)课程设计附件(主要是模型文件和源程序)。卷积编码与解码的MATLAB实现及性能分析学生姓名: 指导老师:曹敦摘 要 卷积码是一种性能优越的信道编码。它的编码器和译码器都比较容易实现,同时它具有较强的纠错能力。随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。在Simulink模块设计中,完成了对卷积码的编码和译码以及误比特统计整个过程的模块仿真。最后,通过在仿真过程中改变卷积码的重要参数约束度来加深理解约束度对卷积码的误码性能的影响。经过仿真和实测,并对测试结果作了分析,得出了结论:对于码率一定的卷积码,当约束度N发生变化时,系统的误码性能也会随之发生变化。关键

4、词 卷积码;约束度;MATLAB;误码性能1 引 言本课程设计通过基于MATLAB的Simulink下的模块对卷积编码,解码进行仿真。通过仿真可以更清楚的认识到卷积码的编码,解码的各个环节,并对仿真结果进行了分析,得出卷积码Viterbi译码的误比特性能和约束度的关系。1.1课程设计目的我的课程设计的题目是卷积编码与解码的MATLAB实现及性能分析。目的是通过课程设计使学生培养其动手能力,观察能力,分析和解决实际问题的能力,巩固、加深理论课知识,增加感性认识,进一步加深对通信原理应用的理解,提高对仿真能力和系统设计能力。提高对常见故障的分析和判断能;培养学生严肃认真、实事求是的科学态度,理论联

5、系实际的工作作风和辩证思维能力。这次课程设计不仅检测出我们的专业基础知识的巩固情况,同时也使我们学到相关的专业知识和锻炼我们动手能力以及独立思考问题能力,对于以后的工作提高自我学习能力奠定了坚实的基础。1.2课程设计的基本任务和要求本次课程设计的基本任务:主要是仿真纠错编码系统。对输入随机数字信号进行卷积纠错编码后,送入含噪信道,在接收端再进行解码和检纠错,改变信道误码率大小,测试接收信号与发送信号之间的误码率,分析该种纠错编码系统的抗噪声性能。课程设计中的要求:(1)本设计开发平台为MATLAB中的Simulink。Simulink是MATLAB最重要的组件之一,它提供一个动态系统建模、仿真

6、和综合分析的集成环境。(2)模型设计应该符合工程实际,模块参数设置必须与原理相符合。(3)处理结果和分析结论应该一致,而且应符合理论。(4)独立完成课程设计并按要求编写课程设计报告书。1.3课程设计步骤信号流程可以表示为先由Bernoulli Binary Generator(贝努利二进制序列产生器)产生一个0,1等概序列,经过Convolutional Encoder(卷积编码器)对输入的二进制序列进行卷积编码,加入二进制噪声信道后送入Viterbi Decoder(Viterbi译码器)进行硬判决译码。最后经过Error Rate Calculation(误码统计)后由Display(显示

7、)输出和将结果输出到To workspace(工作区间)。 设计原理2.1卷积码的基本概念卷积码是一种性能优越的信道编码。(n ,k ,N) 表示把k个信息比特编成n个比特,N 为编码约束度,说明编码过程中互相约束的码段个数。卷积码将k比特输入码元编成n个输出码元,但k和n通常很小,特别适合以串行形式进行传输,时延小。与分组码不同,卷积码编码后的n 个码元不仅与当前组的k 个信息比特有关,而且与前N - 1 个输入组的信息比特有关1。编码过程中相互关联的码元有N*n 个。2.2卷积码的编码 卷积码的编码描述方法有5 种:冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述法和网格图描述

8、法1。卷积码的纠错能力随着N的增加而增大,而差错率随着N的增加而指数下降。在编码器复杂性相同的情况下,卷积码的性能优于分组码。分组码有严格的代数结构,但卷积码至今尚未找到如此严密的数学手段。分组码的译码算法可以由其代数特性得到。卷积码虽然可以采用适用于分组码的门限译码(即大数逻辑译码),但性能不如维特比译码和序列译码1。2.3卷积码的编码器卷积码的编码器一般都比较简单。图2-1是一般情况下的卷积码编码器框图。它包括NK级的输入移位器,一组n个模2和加法器和n级的输出移位寄存器 1。对应于每段k比特的输入序列,输出n个比特。由图可知,n个输出比特不但与当前的k个输入比特有关,而且与以前的(N-1

9、)k个输入信息比特有关。整个编码过程可以看成是输入信息序列与由移位寄存器和模2加法器的连接方式所决定的另一个序列的卷积,卷积码由此得名。本文采用的是冲击响应描述法编码思想。图2-1 卷积码编码器框图如图2-2是卷积码(2,1,3)卷积编码器的一个框图1。左边是信息的输入。下面分别是系统位输出和校验位输出。其中间是3个移位寄存器和一个模2加法器。简单的说就是信息位经过移位寄存器和一个模2加法器产生一个系统位和校验位加在一起输出。可以看出:每输入一个比特,移位寄存器中就向右移动一个位子。原来的第三个寄存器就被移出。可见卷积编码不只与现在的输入比特有关还与前面的3-1个比特有关。所以约束度是3。在这

10、里,其中k=1 ,n=2所以码率R=k/n=1/2。 图2-2 (2,1,3)卷积码编码器图2.4卷积码的码树图对于图2-2所示的(2,1,3 )卷积码编码电路,其码树图如下图2-3所示。这里,分别用a,b,c和d表示寄存器的4种状态:00, 01, 10,和11,作为树状图中每条支路的节点。以全零状态a为起点,当输入位信息位为0时,输出码元c1c2= 00,寄存器保持状态a不变,对应图中从起点出发的上支路;当输入位为1时,输出码元c1c2 =11,寄存器则转移到状态b,对应图中的下支路;然后再分别以这两条支路的终节点a和b作为处理下一位输入信息的起点,从而得到4条支路.以此类推,可以得到整个

11、码树图。如下图2-3。图2-3 (2,1,3)码树图2.5卷积码的网格图如下图2-4是(2,1,3)卷积编码的网格图1。图2-4 (2,1,3)卷积编码的网格图2.6卷积码的状态图如下图2-5是(2,1,3)卷积编码的状态图1。图2-5 (2,1,3)卷积码状态图2.7卷积码的译码卷积码的译码方式有三种:(1)1963年由梅西(Massey)提出的门限译码,这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码;(2) 1963年由费诺(Fano)改进的序列译码,这是基于码的树状图结构上的一种准最佳的概率译码;(3) 1967年由维特比提出的Viterbi算法。这是基于码的网(trel

12、lis)图基础上的一种最大似然译码算法,是一种最佳的概率译码方法。其中,代数译码,利用编码本身的代数结构进行译码,不考虑信道本身的统计特性。该方法的硬件实现简单,但性能较差,其中具有典型意义的是门限译码。另一类是概率译码,这种译码通常建立在最大似然准则的基础上。由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。常用的概率译码方法有维特比译码和序列译码。维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。Viterbi译码过程并不复杂,译码器的运行是前向的、无反馈的。它接收一段

13、,计算一段,选择一段最可能的码段(分支),从而达到整个码序列是一个有最大似然函数的序列。传输序列很长时,判决需要的长延时和相当大的存储量是我们无法承受的。实际应用中采用截短Viterbi算法,即不需要接收到所有序列才进行判决,当译码器接收并处理完了固定的T (T L)个码段后,在接收第(T+1)个码段的时候,它将比较前T级的路径量度,然后从中选取最小者,由此得到与最小量度对应的幸存路径,将此路径对应的T个码段判决输出。T称为截短深度,T选的足够大时,则对译码器输出的译码错误概率影响很小。因此,本课程设计采用的是Viterbi算法1。3 仿真纠错编码系统的设计3.1卷积码仿真框图的设计 本课程设

14、计是通过MATLAB 2中的Simulink模块进行仿真。根据课程设计的基本任务:对输入随机数字信号进行卷积纠错编码后,送入含噪信道,在接收端再进行解码和检纠错,改变信道误码率大小,测试接收信号与发送信号之间的误码率。在Simulink模块中找出所需的模块,然后将模块与模块之间连接起来,由此卷积码的仿真框图如下图3-1。信号流程可以表示为先由Bernoulli Binary Generator(贝努利二进制序列产生器)产生一个0,1等概序列,经过Convolutional Encoder(卷积编码器)对输入的二进制序列进行卷积编码,加入二进制噪声信道后送入Viterbi Decoder(Vit

15、erbi译码器)进行硬判决译码。最后经过Error Rate Calculation(误码统计)后由Display(显示)输出和将结果输出到To workspace(工作区间)。在建立仿真模块后,接下来对各个模块分别一一进行设置后并运行仿真。图3-1 卷积编码与解码仿真图3.2 Simulink仿真模块的参数设置如下图3-2是贝努利二进制序列产生器模块的设置框图,其中参数有三项:第一项probability of a zero取值为0.5,表示0和1出现的概率相等。Initial seed 表示随机种子数,不同的随机种子数将产生不同的二进制序列,特定的随机种子数可以产生一个特定的二进制序列。S

16、ample time=0.01表示抽样时间。Samples per frame 表示每帧的抽样数用来确定每帧的抽样点的数目。Frame-based outputs 是用来确定帧的输出格式。图3-2 贝努利二进制序列产生器模块的设置框图 如下图3-3是卷积编码器模块的设置框图。其中Trellis structure( Trellis结构)中通过poly2trellis()函数把卷积码的约束度,生成多项式以及反馈多项式转换成Trellis结构的形式。如上面是(2,1,3)卷积码的参数设置。(3,5,7)说明约束度是3,生成多项式是(八进制)5和7,无反馈多项式。Reset是复位方式,这里设置为No

17、ne,它表示卷积码编码器在每帧数据开始之前不对寄存器复位。图3-3 卷积编码器模块的设置框图如下图3-4是二进制噪声信道模块的设置框图,其中Error probability设置为0。图3-4 二进制噪声信道模块的设置框图如下图3-5是卷积码译码器模块的设置框图。Trellis structure: Trellis结构(前面已说明)。Decision type是指判决类型,有3种:(1)Unquantized(非量化)(2)Hard Decision(硬判决),(3)Soft Decision(软判决),这里设置为Hard Decision。Traceback depth表示反馈深度,它的值会

18、影响译码精度和解码延迟。Operation mode是指操作模式,设置为Continuous。图3-5 卷积码译码器模块的设置框图如下图3-6是误比特统计模块的设置框图。其中Receive delay表示接收延迟,意思是在通信接收端口需要对接收到的信号进行解调,解码或解交织而带来一定的延迟,使得到达误码统计模块接收端的信号滞后于发送端的信号,由示波器Scope的结果分析之后再进行设置。Computation delay表示计算延迟,在仿真过程中,有时间需要忽略最初的若干个输入数据就通过计算延迟来实现。这里设置为0。Computation mode表示计算模式,帧的计算模式(Entire fra

19、me),误码统计模块对发送端和接收端的所有输入数据进行统计。output data是输出数据,这里设置为Port的意思是表示把统计数据从端口中输出。workspace表示把统计数据输出到工作区。图3-6 误比特统计模块的设置框图如下图3-7是To workspace(工作区间)结果输出模块的设置框图,其中Save format的参数要设为Array,这样才能使m文件出来的图易于观察和进行性能分析。图3-7 To workspace(工作区间)结果输出模块的设置框图如下图3-8是Display(显示)输出模块的设置框图。Display(显示)输出不做任何改变,采取默认设置。图3-8 Displa

20、y(显示)输出模块的设置框图4 对输出波形和结果的分析4.1无噪声时的波形以及结果 保存好上面的仿真图,文件名称为ssary.mdl,然后运行,发现无错误就可以得出以下的波形图和结果图。图4-1无噪声的波形输出图图4-2无噪声的结果输出图 波形以及结果的分析:由上图4-1无噪声的波形输出图可知,第一行为贝努利二进制序列产生器输出的二进制序列波形,第二行为二进制序列进入卷积编码器后输出的编码序列波形,第三行为编码序列进入二进制噪声信道后输出的二进制序列,第四行为二进制序列进入卷积码译码器后的输出的二进制序列。由第一行和第四行的波形对比可知原二进制序列的波形与经过译码出来的译码波形完全相同,但是接

21、收端的信号滞后于发送端的信号一个单位,由此可知道这两者之间有时间延迟。由第二行和第三行的波形对比可知,当二进制噪声信道的误码率为0时,也就是无噪声,编码后的二进制序列和在噪声信道出来的二级制序列完全相同,没有出现误码。由上图4-2无噪声的结果输出图可知,当误比特统计模块中的Receive delay设置为1,并且与卷积码译码器中的Traceback depth设置为1要一致,才能使Display(显示)输出误码率为0,与二进制噪声信道的误码率为0相等,否则Display(显示)输出误码率始终不为0。图4-3原序列与编码之后的序列图由上图4-3的截取一部分波形来分析可知原序列为100101110

22、0,编码之后的输出序列为101011111110 0010011011。又由卷积码(2,1,3)的编码规则可判断出该编码正确,符合我们所需要的编码系列。4.2有噪声时的波形以及结果 将二进制噪声信道模块中的Error probability(误码率)设置为0.03,表示此时有噪声,并运行,可得出以下的波形图和结果图。图4-4二进制噪声信道模块中的Error probability设置为0.03图波形分析:由下图4-5有噪声的波形输出图可知,添加了噪声信道之后,通过第一行与第四行的波形的对比,接收端的信号出现了一定的误码,但是整体上非常少,通过第二行与第三行的对比可找出出现误码的位置。图4-5

23、有噪声的波形输出图 通过截取一部分图形可观察得到以下的分析:由图4-6左边的半张图第二行与第三行的对比可找出出现误码的位置,再由第一行与第四行的误码的位置对比可知发送端的为1,接收端的为0,因此误码的位置没有得到纠错。同理由图4-6右边的半张图可知发送端的为1,接收端的为1,误码的位置得到了纠错。所以该仿真纠错编码系统具有一定的纠错能力。图4-6纠错对比图输出结果分析:由图4-7中的输出结果为0.01,噪声信道模块中的Error probability(误码率)为0.03,由此可知该仿真纠错编码系统能够减少噪声信道的误码率,通过计算可得纠错能力为(0.03-0.01)/0.03=66.67%的

24、,由此可知该仿真纠错编码系统具有良好的纠错能力。图4-7有噪声的结果输出图5 约束度对卷积码的误码性能影响5.1 参数设置对于卷积码(2,1,3)在二进制噪声信道模块中的Error probability(误码率)参数设置为errorch,其中errorch是m文件中的一个变量,如下图5-1。图5-1二进制噪声信道模块参数设置图在误比特统计模块中的output data参数设置为workspace,workspace表示把统计数据输出到工作区,其中Variable中的Errorvec是m文件中的一个变量,如下图5-2。同时保存文件名称为ssarry0.mdl。图5-2误比特统计模块的参数设置图

25、与此同理可得对于卷积码(2,1,5)在二进制噪声信道模块中的Error probability(误码率)参数设置为errorsh,误比特统计模块中的output data参数设置为workspace,Variable改成Errorvec1,文件保存为ssarry1.mdl。对于卷积码(2,1,7)在二进制噪声信道模块中的Error probability(误码率)参数设置为errorth,误比特统计模块中的output data参数设置为workspace,Variable改成Errorvec2,文件保存为ssarry2.mdl。5.2卷积码的性能分析在本次课程设计中,如下图5-3,对于码率一

26、定的卷积码,当约束度N 发生变化时,系统的误码性能也会随之发生变化, 以码率R = 1/ 2的(2 ,1 ,3)、(2,1,5)和(2,1,7) 卷积码为例展开分析。上面的曲线是(2,1,3)卷积码的误码性能曲线,中间的曲线是(2,1,5)卷积码的误码性能曲线,下面的曲线是(2,1,7)卷积码的误码性能曲线。从图5-3中的误比特率曲线可以清楚地看到,随着约束度的逐渐增加,系统的误比特率明显降低,所以说当码率一定时,增加约束度可以降低系统的误比特率,但是随着约束度的增加,译码设备的复杂性也会随之增加,成本也会增加,这对于实际情况也有一定的影响。所以对于码率为1/ 2 的卷积码,在选取约束度时一般

27、为39 。通过上面约束度重要参数的变化后对译码性能的分析,得到在卷积码的编码,译码过程中有很多条件影响误码率的,是不可能同时满足的。所以要根据具体情况来选择合适的参数,使我们的系统设计更加合理。图5-3不同编码约束度对卷积码的误码率的曲线图6 出现的问题以及解决办法 本次课程设计在仿真过程中遇到了许多的问题,总结所遇到的问题以及解决的方法如下:(1)在查找有关模块,我使用的是按照名称搜索来查找,但是这样查找出来的模块是不符合自己所需的。所以只能通过自己一个个去查找以及在老师的帮助下都能够成功找到了设计所需的全部模块。(2)对于课题的任务书理解得不够透彻,肤浅以以为单单改变二进制噪声信道中误码率

28、就能检测出该仿真纠错系统的抗噪声能力。后来在老师的讲述和自我的思考下,建立了一个以二进制噪声信道的误码率为变量的m文件,通过m文件的输出的图形能够清晰地观察出规律来,以便来进行分析这一过程。(3)在仿真的过程中,当二进制噪声信道的为0时,但是Display(显示)输出误码率始终不为0。最后经过不断调整参数和其他设置,终于发现了问题的所在:只有当误比特统计模块中的Receive delay与卷积码译码器中的Traceback depth设置要一致,才能使Display(显示)输出误码率为0,与二进制噪声信道的误码率为0对应相等。 (4)在对于(2,1,5)二进制噪声参数设置的时候Error pr

29、obability选项中,我忘记设置的是一个数值而不是一个变量,使得m文件运行时,误码率一直是一个常数,后来把Error probability选项中变成一个变量,m文件运行出来的图形才是正确的。7 结束语本次课程设计通过MATLAB中的Simulink模块对卷积编码与解码以及信道传输都进行了仿真并通过约束度对其性能分析。从这些过程中我们看到了通信系统的基本工作原理。通过整个卷积码系统的设计与仿真,加深了我们对卷积码的理解,掌握Viterbi译码的基本思路,并进一步将其拓展到Simulink模块仿真方面,知道了如何进行误码率的分析从而选择合适的信道传输信号,学会了使用MATLAB作为学习工具来

30、对我们的通信系统进行设计与仿真等操作,加深了我对MATLAB的了解,扩展了我对MATLAB的认识,同时也使我充分地了解卷积码的特点和性能。通过为期两周的课程设计,我的收获甚多,不仅仅是课本知识上的收获,还有实践收获。这次设计把我们三年所学理论知识综合起来运用到实践中。刚接触Simulink时,我都是一无所知,但是在老师的指导下,以及通过对视频教学和PPT的学习,掌握了Simulink的基本知识。俗话说:“实践是检验真理的唯一标准”。所以我们必须把书本的应用到实践当中, 从实践中学到更多课堂当中学不到的知识。在做仿真时刚开始在设计的步骤和方法上比较混乱,经过借助各种资料和请教老师,有了明确的方向

31、和设计步骤,使我更好地完成了自己的设计。在仿真时,由于贝努利二进制序列产生器一个参数设置忘记选中,导致整个仿真运行错误,经过一步步的排查,终于找到了问题的所在。虽然问题解决了,但是导致我花了好多时间,降低了工作效率。通过这件事我意识到做设计仿真时我们要严谨仔细,一个小错误就能使得整个设计失败。这次课程设计不仅检测出我们的专业基础知识的巩固情况,同时也使我们学到相关的专业知识和锻炼我们动手能力以及独立思考问题能力,对于以后的工作提高自我学习能力奠定了坚实的基础。虽然当中也会遇到很多问题和困难,但是通过老师的指导下以及自己查资料的情况能够自主地分析问题,想出解决办法,能够最终解决问题。参考文献1

32、樊昌信,曹丽娜.通信原理.国防工业出版,20122 张威.MATLAB基础与编程入门.西安电子科技大学出版社,20073 仇佩亮.信息论与编码.高等教育出版社,20064 邓华.MATLAB通信仿真及应用实例详解.人民邮电出版,20035 黄文梅,熊桂林,杨勇.信号分析与处理. 国防科技大学出版社,2000附录1:m文件源程序清单/ 程序名称:zzzzzzzz.m/ 程序功能:采用m文件,实现不同约束度对卷积码误码性能的影响。 / 程序作者:冯健槟/ 最后修改日期:2015-1-4%=程序代码: Clear; / 用于清除历史的数据 x=0:0.001:0.05; / 定义x的取值范围 for

33、 i=1:length(x) /重复运行ssary0.mdl,检查不同条件下硬判决译码的性能 errorch=x(i); / 将x(i)赋值给噪声误码率变量errorch sim(ssary0.mdl) / 运行仿真程序得到的误码率宝保存到工作区变量中 errorsig(i)=ErrorVec(1) errorsh=x(i); sim(ssary1.mdl) errorsig1(i)=ErrorVec1(1) / 调用ssary1.mdl程序 errorth=x(i); sim(ssary2.mdl) / 调用ssary2.mdl程序 errorsig2(i)=ErrorVec2(1)endplot(x,errorsig,-gs,x,errorsig1,-ro,x,errorsig2,-v); / errorsig、errorsig1、errorsig2的曲线title(不同编码约束度对卷积码的误码率的曲线); / 图形的标题xlabel(二进制噪声信道的误码率); / x轴的表述ylabel(接收信号与发送信号之间的误码率); /y轴的表述legend(2,1,3),(2,1,5),(2,1,7); /各条曲线的表述grid on;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁