首页资源分类应用软件matlab > FIR数字滤波器的MatLAB设计与DSP实现

FIR数字滤波器的MatLAB设计与DSP实现

已有 452958个资源

下载专区

上传者其他资源

文档信息举报收藏

标    签: FIR

分    享:

文档简介

FIR数字滤波器的MatLAB设计与DSP实现

文档预览

FIR 数字滤波器的 MATLAB 设计与 DSP 实现 摘要:针对有限长冲激响应(FIR)数字滤波器的原理,讨论了窗函数法设计线性相 位 FIR 数字滤波器的基本思路,介绍了用 MATLAB 工具来设计数字滤波器的方法及 在定点 DSP 上的实现。 通过 CCS5000 开发工具和在 DES3200 实验箱上运行,实现了达到目标要求的滤波 器。 关键词: matlab;fir;dsp;ccs 开发环境 1、引言 随着信息和数字技术的发展,数字信号处理已成为当今极其重要的学科和技 术领域之一通信语音、图像、自动控制、雷达、军事、航空航天、医疗和家用电 器等众多领域得到了广泛的应用。在数字信号处理的基本方法中,通常会涉及到 变换、滤波、频谱分析、调制解调和编码解码等处理。其中,滤波是应用非常广 泛的一个环节,数字滤波器的理论与相关设计也一直都是人们研究的重点之一。 数字滤波器根据其冲激响应函数的时域特性,可分为无限长冲激响应(IIR)滤波 器和有限长冲激响应(FIR)滤波器。其中 FIR 滤波器具有严格的相位特性,同时系 统函数的极点固定在原点上,因而该类型的滤波器是稳定的。滤波器的设计方法 主要有窗函数法、频率取样法和最优线性相位设计法。其中窗函数设计方法由于 其运算简便、物理意义直观,已成为工程实际中应用最广泛的方法,本文从 FIR 数字滤波器的原理与基本设计步骤出发,对 FIR 数字滤波器在 MATLAB 中的仿真与 设计的基本思路做了阐述,并在定点 DSP 上实现了满足要求的 FIR 滤波器。 1 目录 1、滤波器基本原理.................................................................................................................... 3 1.1 数字滤波器的基本概念.................................................................................................... 3 1.2 FIR 滤波器的基本结构..................................................................................................... 3 1.3 FIR 滤波器的主要特点..................................................................................................... 4 1.4 开发环境 CCS 简介............................................................................................................. 4 2、数字滤波器的设计................................................................................................................ 6 2.1 数字滤波器 MATLAB 设计的基本步骤............................................................................... 6 2.2 FIR 数字滤波器的 DSP 实现............................................................................................. 8 2.3 结论..................................................................................................................................... 9 3.心得体会.............................................................................................................................. 10 4.附录...................................................................................................................................... 10 参考文献.................................................................................................................................... 16 2 1、滤波器基本原理 1.1 数字滤波器的基本概念 数字滤波器的设计问题就是寻找一组系数 和,使得其性能在某种意义上逼 近所要求的特性。如果在 s 平面上去逼近,就得到模拟滤波器,如果在 z 平面上 去逼近,则得到数字滤波器。 数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的 输出序列。一个线性位移不变系统的输出序列 y(n)和输入序列 x(n)之间的关系, 应满足常系数线性差分方程: 其中 x(n)为输入序列,y(n)为输出序列, 和为滤波器系数,N 为滤波器的阶数。 1.2 FIR 滤波器的基本结构 在式(1)中,若所有的均为 0,则得 FIR 滤波器的差分方程: 对(2)式是 滤波器的差分方程,其一般形式为 对(3)式进行 变换,整理后可得 FIR 滤波器的传递函数 FIR 数字滤波器的设计方法主要有窗函数法和频率抽样设计法,其中窗函数 法是基本而有效的计方法。 由此可得到 FIR 滤波器的结构如图 1 所示。 FIR 滤波器的单位冲击响应 h(n)是一个有限长序列。若 h(n)为实数,且满足 偶对称或奇对称的条件,即 h(n)=h(N-1-n)或 h(n)=-h(N-1-n),则 FIR 滤波器具 有线性相位特性。 3 1.3、FIR 滤波器的主要特点 1)单位冲击响应只有有限项; 2)FIR 滤波器无反馈回路,是一种无条件稳定系统; 3)FIR 滤波器可以设计成具有线性相位特性。 1.4、开发环境 CCS 简介 CCS 是 TI 公 司 推 出 的 为 开 发 TMS320 系列 DSP 软件的集成开发环境 (IDE)。CCS 工作在 Windows 操作系统下类似于 vc++的集成开发环境采用图形接 口界面提供编辑工具和工程管理工具的软件。CCS 开发流程图如图所示 应用设计 编写代码 调试 分析与调整 图 2 开发流程 对于 CCS 的使用先应建立工程文件*.mak 根据需要添加 C 语言源程序*.c 汇 编源程序*.asm 链配置件文件*.cmd 等可能需要的文件完成整个工程的建立然后 对源文件编辑修改后进行汇编连接以生成目标文件*.out。对源文件每作一次修 改都必须全部重新建立生成新的目标文件*.out 接下来就可用 CCS 调试先让系统 复位再载入*.out。调试的方式是多种多样的有单步执行多步执行单步跳出单步 进入等还有断点 设置和探测点设置 在 CCS 环境下实现 FIR 滤波器的程序框图如图所示 产生输入数据 初始化 DSP 读入数据并存放到栈顶 滤波处理 保存滤波结果到输出单元 待滤波的样本点数4 (256 点)处理完成? 否 是 图 3 用循环寻址的方法 FIR 实现滤波器的程序框图 从图 3 可知 FIR 滤波器 DS 实现包括 4 个部分:模拟输入数据的生成 DSP 初 始化程序滤波系数以及输入数据的调入及滤波子程序其中模拟输入数据的生成 可利用 C 语言编程实现 用.COPY 汇编命令将生成的数据文件拷贝到汇编程序中 作为 FIR 滤波器的输入数据文中 C 语 言程序运行后所生成的数据文件名为初始 化程序包括了对堆栈指针(SP)软件等待状态寄存器(SWWSR)中断寄存器(IFR)中 断屏蔽寄存器(IMR)以及处理器工作状态寄存器(PMST)的初始 化另外还对各变 量赋值由于滤波器系数一开始是存在程序存储器中输入数据则是存在程序外的 文件中程序对这两组数据进行处理时需要把两者都调到数据存储器中这是滤波 系数以及输入数据的调入部分的任务滤波子程序重复执行的次数一般等同于输 入序列的长度实现对数据的读入处理输出等功能。 2、数字滤波器的设计 2.1 数字滤波器 matlab 设计的基本步骤 (1)确定指标 在设计一个滤波器之前,必须首先根据工程实际需要确定滤波器的技术指标。 在很多实际应用中,数字滤波器常常被用来实现选频操作。因此,指标的形式一般 在频域中给出幅度响应和相位响应。幅度指标主要以两种方式给出。第一是绝对 指标,它提供对幅度响应函数的要求,一般应用于 FIR 滤波器的设计。第二种指标 是相对指标。它以分贝值的形式给出要求,在工程实际中,比较受到欢迎。对于相 位响应指标形式,通常希望系统在通频带中仍然有线性相位。运用线性相位响应 的指标进行滤波器设计具有如下优点①只包含实数算法,不涉及复数运算②不存 在延迟失真,只有固定数量的延迟 ③长度为 N 的滤波器(阶数为 N-1),计算量为 5 N/2 数量级。 (2)逼近 确定了技术指标后,就可以建立一个目标的数字滤波器模型。通常采用理想 的数字滤波器模型。之后,利用数字滤波器的设计方法,设计出一个实际滤波器模 型来逼近给定的目标。 (3)性能分析和计算机仿真 上两步的结果是得到以差分或系统函数或冲激响应描述的滤波器。根据这个 描述就可以分析其频率特性和相位特性,以验证设计结果是否满足指标要求,或 者利用计算机仿真实现设计的滤波器,再分析滤波结果来判断。 (4)窗函数法设计 FIR 滤波器的 MATLAB 仿真 matlab 是一套用于科学计算的可视化高性能语言与软件环境。它集数值分析、 矩阵运算、信号处理和图形显示于一体,构成了一个界面友好的用户环境。它的 信号处理工具箱包含了各种经典的和现代的数字信号处理技术,是一个优秀的算 法研究与辅助设计的工具对于线性相位 FIR 滤波器通常采用窗函数法设计。窗函 数设计 滤波器的基本思想(1),就是从时域出发,把理想的无限长的 hd(n)用一 定形状的窗函数截取成有限长的 h(n),以此 h(n)来逼近 hd(n),从而使所得到的 频率响应与所要求的理想频率响应相接近。理想的数字滤波器 Hd()频率特性是 无法实现的, FIR 的设计就是要寻找一个可以得到的频率特性来逼近 Hd(,这相当于用一个 可实现的单位脉冲响应 h(n)去逼近一个理想单位脉冲响应 hd(n)。要想用一个有 限长的因果序列去逼近它,最简单的方法是截取 n 从 0~N-1 的一段来表示它,即 h(n)= hd(n)(0≤n≤N-1);当 n 为其他的数时,h(n)=0。同时,为了保证线性相位, 还要满足偶对称:h(n)=h(N-1-n),这就好像通过一个窗口观看到一段 hd(n),因 此 h(n)就表示成 hd(n) 和一个“窗口函数”的乘积。这样,对 h(n)的求解就变 为:, 这里的 W(n)就称为窗口函数。窗口函数相当于对 hd(n) 在时域上截取一 段,势必造成频域的矩形窗口的失真,结果就是截取出的信号也相应失真。为了补 偿这种失真,只有改变原来窗口的形状,修正经过时域截取后的窗口失真。改善窗 口函数的标准:(1)尽量减少窗口频谱的旁瓣,使能量集中在主瓣中,以减少波动 的幅度和次数,提高阻带衰减。这样,主瓣就不能太窄;(2)主瓣的宽度应尽量窄, 以得到尽量窄的过渡带。 工程中常用的窗函数有以下六种(2):矩形窗,三角形窗(Bartlett Window),汉宁(Hanning)窗,汉明窗,布莱克曼(Blackman)窗,凯泽(Kaiser) 窗。表 1 为六种窗函数的性能指标。图 1 和图 2 分别为 64 点的矩形窗函数的时 频特性曲线和 64 的三角窗函数的时频特性曲线。 ①计算出 64 点的矩形窗函数并利用 wvtool 函数绘制出其时频特性。程 序如下: N=64; y=rectwin(N); wvtool(y); 6 图 4 矩形窗函数时域和频域特性 ②计算出 点的三角窗函数并利用函数 wvtool 绘制出其时频特性程序如下: N=64; y=triang(N); Wvtool(y) ; 图 5 三角窗函数时域、频域特性 ③比如设计一个低通 数字滤波器,采样频率 Fs=8000HZ, 要求: 通带范围:0~1000HZ; 带内波动:5%; 阻带范围:1500HZ~4000HZ; 带内最小衰减:Rs=40dB; 7 采用 Kasier 窗进行设计,程序如下: Fs=8000; Fctus=[1000 1500]; Mags[1 0]; Devs=[0.05 0.01]; %给定频率点上幅度允许波动值 利用 Kaiser 窗设计 FIR 滤波器前,需要先用函数 kaiserord 记进行有关参数 计算 [n,Wn,deta,ftype]=Kaiserord(fcuts,mags,devs,Fs); H=fir1(n,Wn,ftype,Kaiser(n+1,deta)); Freqz(h); 2.2 FIR 数字滤波器的 DSP 实现 数字滤波器的实现方法一般有以下几种: ①用加法器、乘法器、延时器设计专用的滤波电路。 ②在通用计算机系统中加上专用的加速处理机设计实现。 ③用通用的可编程 DSP 芯片实现。 ④用专用的 DSP 芯片实现在一些特殊的场合要求的信号处理速度极高,用通 用 DSP 芯片很难实现。这种芯片将相应的滤波算法在芯片内部用硬件实现,无需 进行编程。 采用 FPGA/CPLD 设计实现。 在上述几种方法中,第②种方法的缺点是速度较慢,一般可用于 DSP 算法的模 拟。第①、④种方法专用性强,应用受到很大的限制。第③、⑤种方法都可以通 过编程来实现各种数字滤波,但是,第③种因有专用的指令来实现滤波运算编程 实现容易,而第⑤种方法编程实现较为困难,因此,本文选用了可编程 DSP 芯片来 实现。 DSP 是一种实时、快速、特别适合于实现各种数字信号处理运算的微处 理器。由于它由具有丰富的硬件资源、改进的哈佛结构、高速数据处理能力和强 大的指令系统,而在通信、航空、航天、雷达、工业控制、网络及家用电器等各个领域 得到广泛应用。在滤波器的实现方面,定点 DSP 芯片显示出强大的优势,比较合适于滤波器 的实现,本文选用含 TMS320C5402 的实验箱作为硬件平台。 下图为 FIR 滤波器 DSP 实现的电路方框图,其核心部分为 TI 公司生产的 DSP 芯片 TMS320C5402 ,EP2ROM 和 RAM 是其外围电路。DSP 送给 A/D 抽样时钟,对 输入的模拟信号抽样,即将模拟信号转换成数字信号,然后读取每一次的抽样值, 并对抽样值进行卷积运算(FIR 数字滤波),最后将运算结果(滤波后的数字信 号)送至 D/A ,转换成模拟信号进行输出。 DSP IN A/D C500 系列 D/ A OUT EP2ROM 图 6 电路框图 8 RAM FIR 滤波器程序设计的具体流程如下先对主程序进行初始化,包括数据段的 初始化和数据缓冲区的清零等,再将从 A/D 获得的采样点样值送到数据缓冲区中, 执行 FIR 滤波程序,最后将滤波结果输出。同时,在 CCS 的图形显示界面中显示出 输人波形与输出波形。滤波器算法在 TMS320C5416 开发板上可用汇编,也可用 C 语言实现。但汇编执行效率高。(实现 FIR 滤波器功能的程序见附录) 汇编程序调试可先在 CCS 中建立新的工程 fir.pjt, 再将汇编语言源文件( asm 或 c)文件及中断向文件(.asm)、位文件(.cmd)添加到工程中。若为 C 语言程序 则还需添加“stdio.h”、“math.h”, “rts.lib”编译后生成.out 文件,可下载 到基于 DES3200 的系统板上。编译并将整个 FIR 项目成功地下载到目标系统板后, 程序就可以在所设计的目标板上运行。 实际在 CCS 中通过加人时域内一个低频正弦波与一个高频正弦波的叠加输人 波形信号,对所设计的数字滤波器进行仿真,高频部分被滤除,其输人及结果见图 4 和图 5。 仿真结果表明,高频部分被滤除,达到设计要求。 图 7 低频正弦波与高频正弦波的叠加 图 8 通过低频滤波器后的波形 2.3 结论 用 MATLAB 语言可方便、快捷地设计具有严格线性相位的 FIR 系统,且参数 的修改也十分方便,用 DSP 芯片实现低通 FIR 数字滤波。除了具有准确度高、不 受环境影响等优点外,由于 DSP 芯片具有可编程特性。程序的可移植性好,具有 较好的灵活性.在实际应用串,其需按要求修改摅渡器参数,并对程序作较少的 改动,即可实现不同截止频率的低通 Fm 滤波器,实用性较强。 9 三、心得体会 从复习课本,再到复习实验,相互探讨编程思路,上网搜索资料,调试实 验等,我们都在努力的自学着。通过这次 FIR 滤波器的设计,我们都有不同程度 的收获。 首先,是学习上的巩固。一方面,通过复习课本和实验,对 DSP 的基础知 识又有了很大的巩固。其次,通过对用 Mathlab 实现 FIR 滤波器的设计,熟悉了 matlab 软件的一些相关的窗口函数以及相关功能的调用,如怎样实现窗函数的 调用,怎样实现滤波,等等。 第二,增进了与同学的交流。平常除了上课,大家也比较少接触。而每次 做课程设计的时候,大家总会互相探讨,发表自己的看法,帮忙解决遇到的问题, 分享自己的心得,于是交流也就不由自主的变得相对频繁些了,感觉也就更亲切 了。 第三,对 FIR 的滤波器性能和作用有了更深一层的了解。FIR 滤波器的应 用十分广泛,当今许多信号处理系统和图像处理系统等都要求信号具有线性相位 特性。在这方面,FIR 滤波器有十分独特的优点,运用 mathlab 语言,我们能够 很容易的设计出具有严格线性相位的 FIR 滤波系统,以及比较容易的实现。此外, 我们还知道了 FIR 滤波器是永远稳定的,因为 FIR 滤波器的冲激响应是有限长序 列,其系统函数为一个多项式,它所含的的极点多为原点。 四、附录 实验汇编程序 .title " test vc5402'bootloader..." .def _c_int00 .mmregs gpiocr .set 3ch gpiosr .set 3dh dxr10 .set 23h drr10 .set 21h spsa0 .set 38h spcr10 .set 39h dxr11 .set 43h spsa1 .set 48h spcr11 .set 49h swcr .set 2bh 10 timer_count .set 060h new_ad .set 064h out_wave_ptr .set 065h t_ar2 .set 066h temp .set 068h wave_buf .set 0900h out_wave_buf .set 01000h N .set 38 ; FIR taps fir_coef_buf .set 100h ; FIR coef buffer fir_data .set 200h ; FIR windows data buffer ! .text ;-------------------------------------------------------------------- ; interrupte vector table ! ;-------------------------------------------------------------------- rs b _c_int00 nop nmi b __ret nop sint17 b __ret nop int0 b __ret nop tint b timer nop brint0 b receive nop bxint0 bd transmit trint b __ret int3 b __ret hpint b __ret q26 .word 0ff80h ;-------------------------------------------------------------------- ------ ; end of interrupte vector table ! ;-------------------------------------------------------------------- ----- _c_int00: stm #2020h,pmst ; vector table start: 0x2000 ssbx intm ; close all int ! (ssbx intm) ssbx sxm ; extend sign ! ssbx frct ; faction multiply stm #10h,26h ; stop TIMER0 ! stm #0ffh,sp ; sp= 0x0ff ld #0,dp ; dp=0 11 stm #0ffffh,ifr ; clear all int ! ;/*------------------------------------------------------------------ ------ ; The following codes switch to 90MHz clock ! ;-------------------------------------------------------------------- -----*/ stm #0,58h wait_pll: ldm 58h,a and #1,a bc wait_pll,aneq stm #87ffh,58h ; switch pll*9 -> 90M clk rpt #1000 nop ;******************************************************************** *** ; initalize RAM, Variable.... ;******************************************************************** *** stm #wave_buf,ar6 stm #1,ar0 rpt #24 mvpd wave_data,*ar6+0 ; move wave data to wave_buf -> 0x6000h stm #wave_buf,wave_ptr ; save wave buffer'ptr stm #out_wave_buf,out_wave_ptr ; save out wave buffer'ptr, because use ; circular address, so when save out_wave ; date,must ++ ! stm #fir_coef_buf,ar6 rpt #N-1 mvpd fir_coef,*ar6+ ; move fir coef to fir_coef_buf(in data mem) stm #fir_coef_buf,t_ar2 ; stm #fir_data,t_ar3 ld *ar0,t ;****************************************************************** ; The following codes are used to initalize McBSP0 ! ;****************************************************************** stm #0,spsa0 ; choose SPCR10 stm #2000h,spcr10 ; receive sign_extend in DR stm #00h,dxr10 ldm 22h,a 12 stm #1,38h stm #0c1h,39h ; start McBSP0 send ! ld #603h,a rsbx intm ; enable all int ! ;-------------------------------------------------------------------- -- ; The following codes are initalized AC01, ALL AC01 setup same ! ;-------------------------------------------------------------------- -- idle 1 idle 1 ; reset two AC01 by software ! ld #600h,a idle 1 ; wait for int ..... ld #3,a idle 1 ; send #3 ld #00105h,a ; fs=10M/2/A/B= 25k ; flp=10M/2/40/A= 25k (all pass) ; fhp=fs/200= 125Hz (not use !) ; A=05,B=40(0x28) idle 1 ; send 1th regs -> 05h ld #3,a idle 1 ; send #3 ld #800h,a idle 1 ; send 8th regs -> 0 ld #0h,a stm #0,38h stm #2001h,39h ; start MCbsp0 receive ! stm #30h,imr ; bit5->BXINT0, bit4->BRINT0, enable BXINT0 ;****************************************************************** ; The following codes are used to initalize TIMER ! ;****************************************************************** stm #10h,tcr ; stop TIMER ! bitf is_new_data,#1 ; test is_new_data == 1 ? cc fir,tc ; ==1, then call fir ! new AD data in new_ad(0x64) b again ;******************************************************************** * ; The following codes are serived for McBSP0' transmit ! ;******************************************************************** * transmit: pshm st1 stm #25,bk ; each AC01 has 25 dots to D/A ! 13 stlm a,dxr10 ; send wave data ! Master AC01 make source wave, ; Slave AC01 make filter result wave ! bd wave_make_end mvmd ar7,#wave_ptr ; save wave buffer ptr ! init: stlm a,dxr10 bitf dxr10,#800h ; if setup last reg of AC01, set mcbsp_init=0 ! bc wave_make_end,ntc ; not equal ,jump ! stm #0,mcbsp_init ; when mcbsp==0 or 1, transmit for make wave ! wave_make_end: popm al __ret: rete ;******************************************************************** ; The following codes are serived for McBSP0' receive ! use AR5,BK! ;******************************************************************** * receive: pshm st1 pshm st0 ld #0,dp mvkd drr10,*ar5 ; save AD data pshd *ar5+% ; save AD data in AD_buffer(0x1800-0x1c00) popd new_ad stm #1,is_new_data ; has new AD data popm st0 popm st1 rete ;******************************************************************** ; The following codes are serived for vc5402' TIMER ! ;******************************************************************** * timer: pshm ah pshm al ldm timer_count,a sub #1,a bc not_show_led,aneq ; if a != 0 ,jump ! bitf st1,#2000h ; test XF? bc show_led,tc ssbx xf ; set xf=1 b show_con show_led: rsbx xf ; set xf=0 14 show_con: ld #5,a ; not_show_led: stlm a,timer_count popm al popm ah rete ;******************************************************************** **** ; The following codes is used to FIR, new AD DATA in new_ad(0x64) ; FIR buffer coff-> 0x100(ar2), FIR window buffer -> 0x200(ar3) ;******************************************************************** **** fir: pshm st1 mvdm #t_ar2,ar2 ; restore ar2 mvdm #t_ar3,ar3 ; restore ar3 ld new_ad,-2,a ; new AD data -> a, remove two LSBs stm #1,ar0 stm #N,bk ; set circular addressing size stl a,*ar3+% rptz a,#(N-1) ; 0 -> a, then repeat 34 times mac *ar2+0%,*ar3+0%,a ; done FIR filter, result in ah mvmd ar3,#t_ar3 ; save ar3 mvmd ar2,#t_ar2 ; save ar2 stm #1,ar0 ld #0,dp cmpm out_wave_ptr, 1000h bc con_fir,ntc ccs_show: nop ; if out_wave_ptr == 0xc00, may show out_wave in CCS !!! show 128 dots ! ; input buffer -> 0x1800; output buffer -> 0x1000 (show from 0x1020) con_fir: popm ar3 ret ;******************************************************************** **** ; The following data is used by make wave ! when using, must copy to 15 ; wave buffer -> 0x6000 ;******************************************************************** **** wave_data: ; freq about 1k Hz .word 03ffch ; +2 volt .word 0c000h ; -2 volt ;******************************************************************** ** fir_coef: .word 34 ;C037 .word 235 ;C036 .word 500 ;C035 .word 735 ;C034 .word 808 ;C033 .word 587 ;C032 .word 0 ;C031 .word -914 ;C030 .word -1972 ;C029 .word -2854 ;C028 .word -3163 ;C027 .word -2518 ;C026 .word -662 ;C025 .word 2432 ;C024 .word 6516 ;C023 .word 11078 ;C022 .word 15431 ;C021 .word 18849 ;C020 .word 20728 ;C019 .word 20728 ;C018 .word 18849 ;C017 .word 15431 ;C016 .word 11078 ;C015 .word 6516 ;C014 .word 2432 ;C013 .word -662 ;C012 .word -2518 ;C011 .word -3163 ;C010 .word -2854 ;C009 .word -1972 ;C008 .word -914 ;C007 .word 0 ;C006 .word 587 ;C005 .word 808 ;C004 .word 735 ;C003 16 .word 500 .word 235 .word 34 .end ;C002 ;C001 ;C000 参考文献 (1)丁玉美 高西全《数字信号处理》(西安电子科技大学出版社) (2)胡广书《数字信号处理—理论、算法与实现》〔北京清华大学出版杜〕 (3)陈金鹰《DSP 技术及应用》(机械工业出版社) 17

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。