硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4483|回复: 0
收起左侧

[DSP] 【安富莱DSP教程】第1章 数字信号处理介绍

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-10 15:46:11 | 显示全部楼层 |阅读模式
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接


第1章 数字信号处理介绍

    本期教程开始带领大家学习DSP教程,学习前首相要搞明白一个概念,DSP有两层含义,一个是DSP芯片也就是Digital Signal Processor,另一个是Digital Signal Processing,也就是我们常说的数字信号处理技术。本教程主要讲的是后者。
    1.1 DSP入门前背景知识
    1.2 ARM官方提供的CMSIS-DSP库
    1.3 总结

1.1 DSP入门前背景知识
    特别说明:本节的背景知识写的时间距今有些早,但是讲解的非常好,建议初学DSP的一定要读一下,同时感谢奉献这个背景知识的作者。有兴趣的可以查阅相关资料了解一下当前数字信号处理的前沿研究。
    数字信号处理(DigitalSignal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用。
    数字信号处理是利用计算机或专用处理设备,以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。
    数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。数字信号处理在理论上的发展推动了数字信号处理应用的发展。反过来,数字信号处理的应用又促进了数字信号处理理论的提高。而数字信号处理的实现则是理论和应用之间的桥梁。
    数字信号处理是以众多学科为理论基础的,它所涉及的范围极其广泛。例如,在数学领域,微积分、概率统计、随机过程、数值分析等都是数字信号处理的基本工具,与网络理论、信号与系统、控制论、通信理论、故障诊断等也密切相关。近来新兴的一些学科,如人工智能、模式识别、神经网络等,都与数字信号处理密不可分。可以说,数字信号处理是把许多经典的理论体系作为自己的理论基础,同时又使自己成为一系列新兴学科的理论基础。

1.1.1 数字信号处理的实现方法一般有以下几种
1.  在通用的计算机(如PC机)上用软件(如Fortran、C语言)实现;
2. 在通用计算机系统中加上专用的加速处理机实现;
3. 用通用的单片机(如MCS-51、96系列等)实现,这种方法可用于一些不太复杂的数字信号处理,如数字控制等;
4. 用通用的可编程DSP芯片实现。与单片机相比,DSP芯片具有更加适合于数字信号处理的软件和硬件资源,可用于 复杂的数字信号处理算法;
5. 用专用的DSP芯片实现。在一些特殊的场合,要求的信号处理速度极高,用通用DSP芯片很难实现,例如专用于    FFT、数字滤波、卷积、相关等算法的DSP芯片,这种芯片将相应的信号处理算法在芯片内部用硬件实现,无需进行编程。
    在上述几种方法中,第1种方法的缺点是速度较慢,一般可用于DSP算法的模拟;第2种和第5种方法专用性强,应用受到很大的限制,第2种方法也不便于系统的独立运行;第3种方法只适用于实现简单的DSP算法;只有第4种方法才使数字信号处理的应用打开了新的局面。
    虽然数字信号处理的理论发展迅速,但在20世纪80年代以前,由于实现方法的限制,数字信号处理的理论还得不到广泛的应用。直到20世纪70年代末80年代初世界上第一片单片可编程DSP芯片的诞生,才将理论研究结果广泛应用到低成本的实际系统中,并且推动了新的理论和应用领域的发展。可以毫不夸张地说,DSP芯片的诞生及发展对近30年来通信、计算机、控制等领域的技术发展起到十分重要的作用。

1.1.2 输入信号的形式
    在DSP系统中,输入信号可以有各种各样的形式。例如,它可以是麦克风输出的语音信号或是电话线来的已调数据信号,可以是编码后在数字链路上传输或存储在计算机里的摄像机图像信号等。
    输入信号首先进行带限滤波和抽样,然后进行A/D(Analog toDigital)变换将信号变换成数字比特流。根据奈奎斯特抽样定理,为保证信息不丢失,抽样频率至少必须是输入带限信号最高频率的2倍。
    DSP芯片的输入是A/D变换后得到的以抽样形式表示的数字信号,DSP芯片对输入的数字信号进行某种形式的处理,如进行一系列的乘累加操作(MAC)。数字处理是DSP的关键,这与其他系统(如电话交换系统)有很大的不同,在交换系统中,处理器的作用是进行路由选择,它并不对输入数据进行修改。因此虽然两者都是实时系统,但两者的实时约束条件却有很大的不同。最后,经过处理后的数字样值再经D/A(Digital toAnalog)变换转换为模拟样值,之后再进行内插和平滑滤波就可得到连续的模拟波形
    必须指出的是,上面给出的DSP系统模型是一个典型模型,但并不是所有的DSP系统都必须具有模型中的所有部件。如语音识别系统在输出端并不是连续的波形,而是识别结果,如数字、文字等;有些输入信号本身就是数字信号(如CD:Compact Disk),因此就不必进行模数变换了。

1.1.3 数字信号处理系统
(1) 接口方便。DSP系统与其他以现代数字技术为基础的系统或设备都是相互兼容的,与这样的系统接口以实现某种功能要比模拟系统与这些系统接口要容易得多;
(2) 编程方便。DSP系统中的可编程DSP芯片可使设计人员在开发过程中灵活方便地对软件进行修改和升级;
(3) 稳定性好。DSP系统以数字处理为基础,受环境温度以及噪声的影响较小,可靠性高;
(4) 精度高。16位数字系统可以达到10^(-5)的精度;
(5) 可重复性好。模拟系统的性能受元器件参数性能变化比较大,而数字系统基本不受影响,因此数字系统便于测试、调试和大规模生产;
(6) 集成方便。DSP系统中的数字部件有高度的规范性,便于大规模集成。
    当然,数字信号处理也存在一定的缺点。例如,对于简单的信号处理任务,如与模拟交换线的电话接口,若采用DSP则使成本增加。DSP系统中的高速时钟可能带来高频干扰和电磁泄漏等问题,而且DSP系统消耗的功率也较大。此外,D SP技术更新的速度快,数学知识要求多,开发和调试工具还不尽完善。
    虽然DSP系统存在着一些缺点,但其突出的优点已经使之在通信、语音、图像、雷达、生物医学、工业控制、仪器仪表等许多领域得到越来越广泛的应用。

1.1.4 DSP系统的设计方法
    总的来说,DSP系统的设计还没有非常好的正规设计方法。
    在设计 DSP 系统之前,首先必须根据应用系统的目标确定系统的性能指标、信号处理的要求,通常可用数据流程图、数学_运算序列、正式的符号或自然语言来描述。
    第二步是根据系统的要求进行高级语言的模拟。一般来说,为了实现系统的最终目标,需要对输入的信号进行适当的处理,而处理方法的不同会导致不同的系统性能,要得到最佳的系统性能,就必须在这一步确定最佳的处理方法,即数字信号处理的算法(Algorithm),因此这一步也称算法模拟阶段。例如,语音压缩编码算法就是要在确定的压缩比条件下,获得最佳的合成语音。算法模拟所用的输入数据是实际信号经采集而获得的,通常以计算机文件的形式存储为数据文件。如语音压缩编码算法模拟时所用的语音信号就是实际采集而获得并存储为计算机文件形式的语音数据文件。有些算法模拟时所用的输入数据并不一定要是实际采集的信号数据,只要能够验证算法的可行性,输入假设的数据也是可以的。
     在完成第二步之后,接下来就可以设计实时DSP系统,实时DSP系统的设计包括硬件设计和软件设计两个方面。硬件设计首先要根据系统运算量的大小、对运算精度的要求、系统成本限制以及体积、功耗等要求选择合适的DSP芯片。然后设计DSP芯片的外围电路及其他电路。软件设计和编程主要根据系统要求和所选的DSP芯片编写相应的DSP汇编程序,若系统运算量不大且有高级语言编译器支持,也可用高级语言(如C语言)编程。由于现有的高级语言编译器的效率还比不上手工编写汇编语言的效率,因此在实际应用系统中常常采用高级语言和汇编语言的混合编程方法,即在算法运算量大的地方,用手工编写的方法编写汇编语言,而运算量不大的地方则采用高级语言。采用这种方法,既可缩短软件开发的周期,提高程序的可读性和可移植性,又能满足系统实时运算的要求。
    DSP硬件和软件设计完成后,就需要进行硬件和软件的调试。软件的调试一般借助于DSP开发工具,如软件模拟器、DSP开发系统或仿真器等。调试DSP算法时一般采用比较实时结果与模拟结果的方法,如果实时程序和模拟程序的输入相同,则两者的输出应该一致。应用系统的其他软件可以根据实际情况进行调试。硬件调试一般采用硬件仿真器进行调试,如果没有相应的硬件仿真器,且硬件系统不是十分复杂,也可以借助于一般的工具进行调试。
    系统的软件和硬件分别调试完成后,就可以将软件脱离开发系统而直接在应用系统上运行。当然,DSP系统的开发,特别是软件开发是一个需要反复进行的过程,虽然通过算法模拟基本上可以知道实时系统的性能,但实际上模拟环境不可能做到与实时系统环境完全一致,而且将模拟算法移植到实时系统时必须考虑算法是否能够实时运行的问题。如果算法运算量太大不能在硬件上实时运行,则必须重新修改或简化算法。

1.1.5 DSP芯片的特点
     DSP芯片,也称数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号处理算法。
    根据数字信号处理的要求,DSP芯片一般具有如下主要特点:
(1) 在一个指令周期内可完成一次乘法和一次加法;
(2) 程序和数据空间分开,可以同时访问指令和数据;
(3) 片内具有快速 RAM,通常可通过独立的数据总线在两块中同时访问;
(4) 具有低开销或无开销循环及跳转的硬件支持;
(5) 快速的中断处理和硬件I/O支持;
(6) 具有在单周期内操作的多个硬件地址产生器;
(7) 可以并行执行多个操作;
(8) 支持流水线操作,使取指、译码和执行等操作可以重叠执行。
    当然,与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。

1.1.6 DSP芯片的发展
    世界上第一个单片 DSP 芯片应当是1978年 AMI公司发布的 S2811,1979年美国Intel公司发布的商用可编程器件2920是DSP芯片的一个主要里程碑。这两种芯片内部都没有现代DSP芯片所必须有的单周期乘法器。1980年,日本 NEC 公司推出的μP D7720是第一个具有乘法器的商用 DSP 芯片。
    在这之后,最成功的DSP 芯片当数美国德州仪器公司(Texas Instruments,简称TI)的一系列产品。TI 公司在1982年成功推出其
        第一代 DSP 芯片 TMS32010及其系列产品TMS32011、TMS320C10/C14/C15/C16/C17等
        第二代DSP芯片TMS32020、TMS320C25/C26/C28
        第三代DSP芯片TMS320C30/C31/C32
        第四代DSP芯片TMS320C40/C44
        第五代 DSP 芯片TMS320C5X/C54X,第二代DSP芯片的改进型TMS320C2XX,集多片DSP芯片于一体的高性能DSP芯片TMS320C8X以及目前速度最快的
        第六代DSP芯片TMS320C62X/C67X等。TI将常用的DSP芯片归纳为三大系列,即:TMS320C2000系列(包括TMS320C2X/C2XX)、TMS320C5000系列(包括TMS320C5X/C54X/C55X)、TMS320C6000系列(TMS320C62X/C67X)。如今,TI公司的一系列DSP产品已经成为当今世界上最有影响的DSP芯片。TI公司也成为世界上最大的 DSP 芯片供应商,其DSP市场份额占全世界份额近 50%。
    第一个采用CMOS工艺生产浮点DSP芯片的是日本的 Hitachi 公司,它于1982年推出了浮点DSP芯片。1983 年 日本Fujitsu 公司推出的MB8764,其指令周期为 120ns,且具有双内部总线,从而使处理吞吐量发生了一个大的飞跃。而第一个高性能浮点DSP芯片应是 AT&T 公司于1984 年推出的DSP32。
    与其他公司相比,Motorola公司在推出 DSP 芯片方面相对较晚。1986年,该公司推出了定点处理器MC56001。1990年,推出了与IEEE 浮点格式兼容的浮点DSP芯片 MC96002。
    美国模拟器件公司(AnalogDevices,简称AD)在DSP芯片市场上也占有一定的份额,相继推出了一系列具有自己特点的DSP芯片,其定点DSP芯片有ADSP2101/2103/2105、ASDP2111/2115、ADSP2161/2162/2164以及ADSP2171/2181,浮点DSP芯片有ADSP21000/21020、ADSP21060/21062等。自1980年以来,DSP芯片得到了突飞猛进的发展,DSP芯片的应用越来越广泛。从运算速度来看,MAC(一次乘法和一次加法)时间已经从20世纪80年代初的400ns(如TMS32010)降低到10ns以下(如TMS320C54X、TMS320C62X/67X等),处理能力提高了几十倍。DSP芯片内部关键的乘法器部件从1980年的占模片区(diearea)的40%左右下降到5%以下,片内RAM数量增加一个数量级以上。从制造工艺来看,1980年采用4μm的 N沟道MOS(NMOS)工艺,而现在则普遍采用亚微米(Micron)CMOS工艺。DSP芯片的引脚数量从1980年的最多64个增加到现在的200个以上,引脚数量的增加,意味着结构灵活性的增加,如外部存储器的扩展和处理器间的通信等。此外,DSP芯片的发展使DSP系统的成本、体积、重量和功耗都有很大程度的下降。

1.1.7 DSP芯片的选择
      设计DSP应用系统,选择DSP芯片是非常重要的一个环节。只有选定了DSP芯片,才能进一步设计其外围电路及系统的其他电路。总的来说,DSP芯片的选择应根据实际的应用系统需要而确定。不同的DSP应用系统由于应用场合、应用目的等不尽相同,对DSP芯片的选择也是不同的。一般来说,选择DSP芯片时应考虑到如下诸多因素。
1. DSP芯片的运算速度。
    运算速度是DSP芯片的一个最重要的性能指标,也是选择DSP芯片时所需要考虑的一个主要因素。
    DSP芯片的运算速度可以用以下几种性能指标来衡量:
(1) 指令周期:即执行一条指令所需的时间,通常以ns(纳秒)为单位。如TMS320LC549-80在主频为80MHz时的指令周期为12.5ns;
(2) MAC时间:即一次乘法加上一次加法的时间。大部分DSP芯片可在一个指令周期内完成一次乘法和加法操作,如TMS320LC549-80的MAC时间就是12.5ns;
(3) FFT执行时间:即运行一个N点FFT程序所需的时间。由于FFT运算涉及的运算在数字信号处理中很有代表性,因此FFT运算时间常作为衡量DSP芯片运算能力的一个指标;
(4) MIPS:即每秒执行百万条指令。如TMS320LC549-80的处理能力为80 MIPS,即每秒可执行八千万条指令;
(5)MOPS:即每秒执行百万次操作。如TMS320C40的运算能力为275 MOPS;
(6) MFLOPS:即每秒执行百万次浮点操作。如TMS320C31在主频为40MHz时的处理能力为40MFLOPS
(7)BOPS:即每秒执行十亿次操作。如TMS320C80的处理能力为2 BOPS。
2.DSP芯片的价格。
    DSP芯片的价格也是选择DSP芯片所需考虑的一个重要因素。如果采用价格昂贵的DSP芯片,即使性能再高,其应用范围肯定会受到一定的限制,尤其是民用产品。因此根据实际系统的应用情况,需确定一个价格适中的DSP芯片。当然,由于DSP芯片发展迅速,DSP芯片的价格往往下降较快,因此在开发阶段选用某种价格稍贵的DSP芯片,等到系统开发完毕,其价格可能已经下降一半甚至更多。
3.DSP芯片的硬件资源。
    不同的DSP芯片所提供的硬件资源是不相同的,如片内RAM、ROM的数量,外部可扩展的程序和数据空间,总线接口,I/O接口等。即使是同一系列的DSP芯片(如TI的TMS320C54X系列),系列中不同DSP芯片也具有不同的内部硬件资源,可以适应不同的需要。
4.DSP芯片的运算精度。
    一般的定点DSP芯片的字长为16位,如TMS320系列。但有的公司的定点芯片为24位,如Motorola公司的MC56001等。浮点芯片的字长一般为32位,累加器为40位。
5.DSP芯片的开发工具。
    在DSP系统的开发过程中,开发工具是必不可少的。如果没有开发工具的支持,要想开发一个复杂的DSP系统几乎是不可能的。如果有功能强大的开发工具的支持,如C语言支持,则开发的时间就会大大缩短。所以,在选择DSP芯片的同时必须注意其开发工具的支持情况,包括软件和硬件的开发工具
6.DSP芯片的功耗。
    在某些DSP应用场合,功耗也是一个需要特别注意的问题。如便携式的DSP设备、手持设备、野外应用的DSP设备等都对功耗有特殊的要求。目前,3.3V供电的低功耗高速DSP芯片已大量使用。
7.其他。
    除了上述因素外,选择DSP芯片还应考虑到封装的形式、质量标准、供货情况、生命周期等。有的DSP芯片可能有DIP、PGA、PLCC、PQFP等多种封装形式。有些DSP系统可能最终要求的是工业级或军用级标准,在选择时就需要注意到所选的芯片是否有工业级或军用级的同类产品。如果所设计的DSP系统不仅仅是一个实验系统,而是需要批量生产并可能有几年甚至十几年的生命周期,那么需要考虑所选的DSP芯片供货情况如何,是否也有同样甚至更长的生命周期等。
    在上述诸多因素中,一般而言,定点DSP芯片的价格较便宜,功耗较低,但运算精度稍低。而浮点DSP芯片的优点是运算精度高,且C语言编程调试方便,但价格稍贵,功耗也较大。例如TI的TMS320C2XX/C54X系列属于定点DSP芯片,低功耗和低成本是其主要的特点。TMS320C3X/C4X/C67X属于浮点DSP芯片,运算精度高,用C语言编程方便,开发周期短,但同时其价格和功耗也相对较高。
    DSP应用系统的运算量是确定选用处理能力为多大的DSP芯片的基础。运算量小则可以选用处理能力不是很强的DSP芯片,从而可以降低系统成本。相反,运算量大的DSP系统则必须选用处理能力强的DSP芯片,如果DSP芯片的处理能力达不到系统要求,则必须用多个DSP芯片并行处理。
    那么如何确定DSP系统的运算量以选择DSP芯片呢?下面我们来考虑两种情况。
1. 按样点处理
    所谓按样点处理就是DSP算法对每一个输入样点循环一次。数字滤波就是这种情况。在数字滤波器中,通常需要对每一个输入样点计算一次。例如,一个采用LMS算法的256 抽头的自适应FIR滤波器,假定每个抽头的计算需要3个MAC周期,则256抽头计算需要256×3=768个MAC周期。如果采样频率为8kHz,即样点之间的间隔为125ms,DSP芯片的MAC周期为200ns,则768个MAC周期需要153.6ms的时间,显然无法实时处理,需要选用速度更高的DSP芯片。表1.3示出了两种信号带宽对三种 DSP 芯片的处理要求,三种DSP芯片的MAC周期分别为200ns、50ns和25ns。从表中可以看出,对话带的应用,后两种DSP芯片可以实时实现,对声频应用,只有第三种DSP芯片能够实时处理。当然,在这个例子中,没有考虑其他的运算量。
2.按帧处理  
    有些数字信号处理算法不是每个输入样点循环一次,而是每隔一定的时间间隔(通常称为帧)循环一次。例如,中低速语音编码算法通常以10ms或20ms为一帧,每隔10ms或20ms语音编码算法循环一次。所以,选择DSP芯片时应该比较一帧内DSP芯片的处理能力和DSP算法的运算量。假设DSP芯片的指令周期为 p(ns),一帧的时间为Dt(ns),则该DSP芯片在一帧内所能提供的最大运算量为 Dt/p条指令。例如TMS320LC549-80的指令周期为12.5ns,设帧长为20ms,则一帧内TMS320LC549-80所能提供的最大运算量为160万条指令。因此,只要语音编码算法的运算量不超过160万条指令,就可以在TMS320LC549-80上实时运行。

1.1.8 DSP的应用
    自从20世纪70年代末80年代初DSP芯片诞生以来,DSP芯片得到了飞速的发展。DSP芯片的高速发展,一方面得益于集成电路技术的发展,另一方面也得益于巨大的市场。在近20年时间里,DSP芯片已经在信号处理、通信、雷达等许多领域得到广泛的应用。目前,DSP芯片的价格越来越低,性能价格比日益提高,具有巨大的应用潜力。
     DSP芯片的应用主要有:
(1) 信号处理——如数字滤波、自适应滤波、快速傅立叶变换、相关运算、谱分析、卷积、模式匹配、加窗、波形产生等;
(2) 通信——如调制解调器、自适应均衡、数据加密、数据压缩、回波抵消、多路复用、传真、扩频通信、纠错编码、可视电话等;
(3) 语音——如语音编码、语音合成、语音识别、语音增强、说话人辨认、说话人确认、语音邮件、语音存储等;
(4) 图形/图像——如二维和三维图形处理、图像压缩与传输、图像增强、动画、机器人视觉等;
(5) 军事——如保密通信、雷达处理、声纳处理、导航、导弹制导等;
(6) 仪器仪表——如频谱分析、函数发生、锁相环、地震处理等;
(7) 自动控制——如引擎控制、声控、自动驾驶、机器人控制、磁盘控制等;
(8) 医疗——如助听、超声设备、诊断工具、病人监护等;
(9) 家用电器——如高保_真音响、音乐合成、音调控制、玩具与游戏、数字电话/电视等。

1.2 ARM官方提供的CMSIS-DSP库
    上小节大部分所说的DSP大部分都是指DSP芯片,这里我们要说的DSP是数字信号处理技术。ARM公司推出的Cortex-M4F内核是带有FPU,DSP和SIMD单元的,针对这些单元也增加了专用指令,指令如下:

    ARM官方对此也专门做了一个DSP方面的库,方便客户调用。我们出这个教程的目的就是把这个库中大部分的库函数使用方法讲清楚,详细的原理我们只做介绍(部分原理需要较强的数学功底才可以)
    关于什么是CMSIS,大家可以看我们《安富莱_STM32-V5开发板_用户手册(V2.0)》中的第五章5.4小节,下面重点介绍一下CMSIS-DSP
    这个是CMSIS为用户提供的DSP(数字信号处理)库,主要包含以下数字信号处理算法:
u BasicMathFunctions
    提供基本的数据运算,如加减乘除等基本运算,以_f32结尾的函数是浮点运算,以_q8, _q15, _q31,结尾的函数是定点运算。

u FastMathFunctions
    主要提供SIN,COS以及平方根SPRT的运算

u ComplexMathFunctions
    复杂数学运算,主要是向量,求模等运算

u FilteringFunctions
    主要是滤波函数,如IIR,FIR,LMS等(这里只贴了一部分)

u MatrixFunctions
    主要是矩阵运算

u TransformFunctions
    变换功能。 包括复数 FFT (CFFT) /复数 FFT 逆运算 (CIFFT) 、 实数 FFT (RFFT) /实数 FFT 逆运算

u ControllerFunctions
    控制功能,主要为 PID 控制函数。arm_sin_cos_f32/-q31.c 函数提供 360 点正余弦函数表和任意角度的正余弦函数值计算功能。

u StatisticsFunctions
    统计功能函数,如求平均值、计算 RMS等

u SupportFunctions
    支持功能函数,如数据拷贝,Q 格式和浮点格式相互转换

u CommonTables
    arm_common_tables.c 文件提供位翻转或相关参数表。

1.3 总结
    本期教程主要是做一些入门性的介绍,下期教程将开始实战。
1.1.png
1.2.png
1.3.png
1.4.png
1.5.png
1.6.png
1.7.png
1.8.png
1.9.png
1.10.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-1 06:50 , Processed in 0.215651 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表