信号处理工程化MATLAB工具教程.docx

上传人:b****1 文档编号:14776960 上传时间:2023-06-27 格式:DOCX 页数:20 大小:371.71KB
下载 相关 举报
信号处理工程化MATLAB工具教程.docx_第1页
第1页 / 共20页
信号处理工程化MATLAB工具教程.docx_第2页
第2页 / 共20页
信号处理工程化MATLAB工具教程.docx_第3页
第3页 / 共20页
信号处理工程化MATLAB工具教程.docx_第4页
第4页 / 共20页
信号处理工程化MATLAB工具教程.docx_第5页
第5页 / 共20页
信号处理工程化MATLAB工具教程.docx_第6页
第6页 / 共20页
信号处理工程化MATLAB工具教程.docx_第7页
第7页 / 共20页
信号处理工程化MATLAB工具教程.docx_第8页
第8页 / 共20页
信号处理工程化MATLAB工具教程.docx_第9页
第9页 / 共20页
信号处理工程化MATLAB工具教程.docx_第10页
第10页 / 共20页
信号处理工程化MATLAB工具教程.docx_第11页
第11页 / 共20页
信号处理工程化MATLAB工具教程.docx_第12页
第12页 / 共20页
信号处理工程化MATLAB工具教程.docx_第13页
第13页 / 共20页
信号处理工程化MATLAB工具教程.docx_第14页
第14页 / 共20页
信号处理工程化MATLAB工具教程.docx_第15页
第15页 / 共20页
信号处理工程化MATLAB工具教程.docx_第16页
第16页 / 共20页
信号处理工程化MATLAB工具教程.docx_第17页
第17页 / 共20页
信号处理工程化MATLAB工具教程.docx_第18页
第18页 / 共20页
信号处理工程化MATLAB工具教程.docx_第19页
第19页 / 共20页
信号处理工程化MATLAB工具教程.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

信号处理工程化MATLAB工具教程.docx

《信号处理工程化MATLAB工具教程.docx》由会员分享,可在线阅读,更多相关《信号处理工程化MATLAB工具教程.docx(20页珍藏版)》请在冰点文库上搜索。

信号处理工程化MATLAB工具教程.docx

信号处理工程化MATLAB工具教程

第9章信号处理工程化的MATLAB工具

9.1信号处理工具(sptool)的介绍

MATLAB信号处理工具箱还为信号处理的研究工作提供了一个集成开发环境和工具。

这个信号处理工具的名称为sptool(sigalprocessingtool)。

大家知道,信号处理主要有两大任务:

一是对信号进行分析,就是在时域分析它的波形和在频域分析它的频谱;二是滤波器设计,也就是根据对输入输出信号的要求,设计实现这个要求的系统。

在这两个任务的进行工程中,经常要做第三个任务,那就是进行检验,要把信号加到所设计的滤波器中,看它的输出是否满足要求,sptool把这三个任务集成在一起,加上了适当的管理功能,配以良好的工作界面,利用它可以大大提高研究的工作效率。

在MATLAB命令窗口中,键入sptool,得到如图9.1.1所示界面,其中分为【Signals】、【Filters】和【Spectra】三个栏目,每个栏目中分别存入了系统中原来已保存的信号、滤波器和频谱的名称。

下面先来看如何把所需的信号和滤波器输入到这个环境中去。

图9.1.1信号处理工具sptool的启动界面

(1)信号的导入

先在MATLAB工作空间中放入所需的分析的信号和滤波器。

设滤波器就是例9.2.1中设计并导入了工作空间的滤波器,再来建立一组信号。

在命令窗中,键入:

n=0:

200;T=1;s1=sin(5*2*pi*n*T);s2=sin(10*2*pi*n*T);

s3=cos(15*2*pi*n*T);s=s1+s2+s3;

单击左上角的菜单项【File】及其下拉菜单中的【Import】出现的新视窗如图9.1.2所示。

它分为三个栏目,左边一栏为【Source】,其中有【Workspace】或【File】二选一圆圈,选定【Workspace】时,中间栏的【WorkspaceContents】将显示工作空间中的全部变量,如图9.12所示,如果选择【file】作为数据来源,则下方的框中应键入文件名及其路径。

右边的栏指定导入的目标,即要说明导入的数据是作为信号、滤波器还是频谱。

在图示状态,顶部的下拉选择框中显示的是【Signal】,如果我们要把合成信号导入,就在直接的工作空间内容栏中选定s,单击→按钮,它就进入右边的数据框中,右栏的下部有【SamplingFrequency】和【Name】两个框需要用户填写。

其中【Name】栏已写上默认的变量名,它是在sig后面加上新的序号,当期它是sig7,用户也可以另名称改写。

图9.1.2sptool的数据导入界面

要输入滤波器参数时,首先在右栏的上方下拉菜单选择框内改选【Filer】,此时它的下方将出现【Form】框,它的下拉菜单中,有【TransferFunction】(传递函数)、【2ndOrdrSection】(二阶级联)等四种可选项。

选择【TransferFunction】时,下面就出现【Numerator】(分子)和【Denominator】(分母)两个框,可以用前面说过的方法分别把工作空间变量Num1和Den1填入框中,然后在右下方的两个框中分别键入采样频率和滤波器名称后,单击【OK】,就构成了滤波器的导入。

默认名是在filt后面加上新的序号,用户也可以另起名称填写。

选择【2ndOrdrSection】时,下面就出现【Sos】框,将工作空间变量sos2填入,照样办理即可,这样在例9.2.1中设计的FIR和IIR滤波器分别成为信号处理工具中的filt7和filt8。

(2)信号的时域和频域观测

在图9.1.1上,选定合成信号sig4,单击【View】,进入【SignalBrowser】(信号浏览器)视窗,如图9.1.3所示。

图9.1.3信号浏览器(signalBrowser)的界面

在这个界面上由许多帮助测量和输出信号特性的菜单和按钮。

主菜单上【File】下主要是打印命令,【Markers】用来在图上设置标志,下面【Vertical】(垂直标线)、【Horizontal】(水平标线)、【Track】(跟踪点)和【Slope】(斜率线),还有峰点和谷点显示,主菜单的下面一行图标按钮,从左到右的大体功能依次为:

打印和预览、把信号变为声音、x和y方向的放大和缩小、标志点和线的设定和去除等。

把鼠标移到按钮上,它会出现英文名词,界面最下方则给出标志的读数。

在它的上方,是一个高度很小的图形窗,它给出信号的全景,在主图x方向放大时,它仍表示全部信号,而且用方框指明主图形信号在全部信号中的位置。

要想求得信号的频谱,也选定sig4,然后在频谱下单击【creat】按钮,此时出现频谱观测器的界面,见图9.1.4。

先要在左栏上部选定求频谱的方法,目前我们学了一种,即选FFT。

在下面的框中填入点数,例如1024,然后单击【Apply】按钮,就出现了频谱的曲线。

它有三个峰值,恰好就对应了输入的三个正余弦信号分量。

此界面上的菜单与按钮和信号观测器相似。

(3)滤波器的观测和修改

选定滤波器的名称filt4,单击其下方的【View】按钮,就可以观测它的频率响应,如果单击其下方的【Edit】按钮,那就不仅能观测数据还能修改,它的功能不如滤波器设计工具箱那样全,但大体接近。

(4)让信号通过滤波器求输出信号

在如图9.1.1所示的界面,选定信号和滤波器名称,单击滤波器栏下的最下一个按钮【Apply】,这就意味着将所选信号加到所选滤波器中,此时将产生一个小视窗,提示用户输入信号为sig4,滤波器的名称为filt4,并提供输出信号默认名称sig5,,单击【ok】按钮,则输出信号将自动生成并列写在信号栏中。

对它进行观测就可以知道所设计的滤波器是否完成了各项指标。

在本例中sig5基本上一个较纯的10HZ正弦波,这是不难想象的。

经过仔细分析,入股不满意,可以修改滤波器后重新实验。

图9.1.4频谱观测器(SpectrumBrowser)的界面

用这个工具,不难在很短的时间内完成多个滤波器的设计,并分别观测它们的输出。

所有的结果都存储在案,可用于试验报告,所以这是一个提高效率的有效工具。

9.2MATLAB中的滤波器设计工具

由于滤波器设计在工程上常常用到,而它的设计相当复杂,于是提出了开发滤波器设计综合性工具的需求,在MATLAB环境下,利用它已有的大量滤波器设计函数,加上日益成熟而方便的界面技术,已经可以把所有的设计方法和过程集成在一起,构成一个滤波器综合设计的工具了。

在信号处理工具箱中,这个工具名称为fdatool(FilterDesignandAnalysisTool)。

在MATLAB命令窗口中,键入fdatool,就得到如图9.2.1所示的界面。

这个工具的界面包含了全部滤波器设计的函数,大体介绍如下:

界面最上面的一行是文字菜单,第二行是图标按钮菜单,下面是主画面菜单区,它大体分为上下两部分,为了方便,我们分别称之为上、下画面菜单区;最下面正中有一个【design】按钮,那是在菜单中设定完全部参数后,指挥计算机进行设计的确认钮。

图9.2.1滤波器设计和分析工具(fdatool)的启动界面

图标按钮菜单中,

【fullviewanalysis】,它可以把界面中的图形部分取出,单独组成一个视窗。

再向右的9个按钮则用来确定图形的内容,依次为【FilterSpecification】……

上半画面是来显示设计的结果,其中,右半部分是图形画的,它的大小和显示内容受上述按钮的控制。

左半部分显示当前滤波器的结构。

它还没有一个【ConvertStructure】按钮,用于使用户得到不同滤波器结构下的系数。

按下这个按钮,将出现一个小视窗,其中的复选框提供了8种结构可供选择,确认后,从【FilterCoefficients】按钮所得到的就是相应结构下的滤波器系数。

这些滤波器系数可以由【file】中的【Export】导出,输出变量的名称可以指定,它们的目标位置可以是MATLAB工作空间,或者是其他指定的文件。

另外,它的下部还有一个【Quantization】(量化)选择框,在开始设计时,该选择框的内容总是空白的。

一般是在滤波器初步设计已经完成,要考察系数量化对滤波器性能的影响时,再把它打开,这时,图形中将同时显示量化前后滤波器的特性,用户能够方便地看出系数量化对滤波器性能的影响。

但是在打开量化按钮前应该输入很多参数,如果事先没有设定参数,那么用的是程序中缺省值,不符合用户的实际,要设定这些参数,先要在下面的顶部单击【SetQuantizationParameters】页标签,这时整个下半画面都会发生改变。

下半画面当前处在【FilterDesign】页面上,这个页面是用来输入滤波器的设计参数的,它分为4栏,从左到右依次为【Filtertype】、【FilterOrder】、【FrequencySpecifications】、【MagnitudeSpecifications】。

在【Filtertype】栏中,上面5个圆圈是“五选一”的选择框,如果是简单选频类的滤波器,则在前四项中任取一项,如果是其他类,就要选定5项。

然后在它右方的复选框中下拉菜单来选定具体类型,这里面有数字微分器等。

IIR滤波器中4类,FIR中则有等波动法、最小二乘法和窗函数法三种。

在【FilterOrder】栏中,只有“两选一”的两个选择圆圈,一个由用户强制选择,另一个有计算机在设计后自动选择最小阶数。

在【FrequencySpecifications】栏中,第1个复选项是选择频率的单位,其中有4个下拉菜单项,分别为Hz、kHz、MHz和归一化频率单位。

其归一化单位是

,故奈奎斯特数字频率归一化为1。

以下各框则填入滤波器的边缘频率。

框的数目会根据选定的滤波器类别自动变化。

在【MagnitudeSpecifications】栏中,第1个复选项是选择幅度的单位,其中只有两个下拉菜单项,分别为分贝单位和线性单位。

以下各框则填入通带波纹和阻带波纹的值。

对于两频段以上的多频段滤波器,边缘频率指标和对应的幅度指标都应分段标明,因此它们应按MATLAB的数组格式输入。

实际设计过程:

先在下半面的各栏中,正确填写滤波器的要求和指标,然后按最下方正中的【design】按钮,结果就会在上半画面中显示出来,需要看何种图形,就可按相应的按钮,取【fullviewAnalysis】时,曲线被放在单独的视窗内,就可以以图形方式存储。

需要滤波器系数时,可以如前所述,用【Export】方式,把它导出到适当的地方。

例:

设滤波器要让10

2HZ的有用调制信号通过,通带的起伏不超过1分贝,要抑制频带小于6hz和大于15hz干扰,抑制要求达到40分贝以上,信号的采样频率为100hz,用fdatool工具设计此滤波器,滤波器的类型不限,可比较选择。

解:

先选定带通滤波器,在其频率指标项中按Fs=100Hz,Fs1=6hz,Fp1=8Hz,Fp2=12hz,Fs2=15Hz填入,幅度栏中填入AP=1,As1=As2=40。

在下半界面左边两栏中,先选FIR等波动滤波器,指定自动取最小阶数,单击【design】按钮,得到的滤波器是6阶,同时给出了它的副特性,可以用放大图形的方法检验它是满足给定的指标要求。

做法是先单击【ZoomIn】按钮,再在画面上关心的位置附近单击一下,系统就会把该点附近的画面放大,如果选IIR巴特沃斯滤波器,得到的滤波器阶数是8阶。

在设计完成后,可以把屏幕左下方几个方框中的量化开关激活,屏幕上将出现如图9.2.2所示的界面,图形框中会出现两根曲线,其中绿色的就是滤波器量化后的幅频特性,可以发现,在FIR设计中,量化前后的幅特性几乎重叠,说明系数按系统的缺省设置进行量化对设计结果几乎没有影响,但对IIR设计,两根曲线就“差之千里”了,本应该是通带的区域,量化后滤波器的幅特性却降到了-40分贝,而本该是阻带的35hz附近,幅特性却超过了0分贝,这样的滤波器是根本不能用的。

问题的关键在于滤波器的机构设定,按下【ConvertStructure】按钮,可以发现,在缺省状态下的滤波器取的是直接II型结构,对于六阶的切贝雪夫滤波器,分母上是一个6次多项式,从高等代数知道,高次多项式系数的微小变化会带来根的很大误差;它又处在传递函数的分母上,就是进行递归运算的部位,所以对系统传递函数影响很大。

如果把结构改成二阶环节级联形式,重新计算,系数量化前后的幅特性就很相近了,这也说明了系数量化对二阶环节的影响较小,所以滤波器实现时,特别是它的分母系数,应该采用二阶级联形式。

当需要把量化方式设置为实际系统的状况时,应该单击【SetQuantizationParameters】页面标签,并使【quantization】框处于选定状态。

此时的可变因素有量化内容、量化方法和量化位数三类。

量化内容有系数量化、输入量化、输出量化、乘法量化、乘积量化、总和量化等,量化方法有四舍五入,向下取整、向上取整和溢出设定等,量化位数则可设定16位、8位或其他二进制位数。

在设计完成后,可以单击【file】中的【Export】,此时会弹出一个小的视窗,其中给出存储变量的缺省名称,用户可以把它修改为自己想取的任何名称,假定我们取量化前的设计结果,第一个是43阶FIR滤波器的分子,分母系数向量,设其变量名为Num1和Den1;第二个是6阶切贝雪夫II型IIR滤波器,用三个二阶环节级联方式导出,其变量名为SOS2和G2,这些变量可以都导出到MATLAB工作空间中,然后在命令窗口中键入whos,MATLAB会显示下面几个被导入的变量名称。

9.4系统仿真(simulink)工具简介

Simulink的优点是它不给出任何新的函数。

对用户来说,MATLAB原有的函数仍然有效,因此,读者如果有MATLAB的基础,除了要学习图形界面的使用方法之外,不需要再学新的语法,马上就会应用,这显示了其对图形的友好性。

Simulink功能:

(1)用方框图的绘制代替程序的编写,构成任何一个系统框图有三个步骤,即选定典型模块,相互联系和给定模块参数,这三步可以在同一个图形界面上用鼠标和键盘来完成。

(2)仿真的建立和运行是智能化的,首先,画好了框图并存起来,它就自动建立起了仿真的方程,其次,在运行时用户可以只给出仿真精度,软件会自动选择计算的程序,使得系统仿真具有最快的速度。

(3)输入输出信号来源形式的多样化,其输入信号可以是各种信号发生器;也可以是来自一个设定的记录文件,还可以是来自MATLAB的工作空间(workspace)。

输出信号则送往多种多样的观测记录设备。

9.4.2模块库及模型的建立

1.模块库

在命令窗口中,键入simulink,就可以进入仿真模块库,以simulink7.1为例,其界面如图所示,其中列出的大类有simulink、控制工具箱(controlsystemtoolbox)、信号处理模块库(SignalprocessingBlockset)、实时工作站(RealTimeWorkshop)等。

在simulink大类中,又分列了信号源(Sources)、信宿(sinks)、线性(Linear)、非线性(Nonlinear)、离散(Discrete)、逻辑和位运算(Logicandbitoperation)、数学运算(Math)、信号属性(SingalAttribute)等各类子菜单图标。

打开这些图标,右方将显示其中包的各种模块,例如打开Sinks,将看到数字显示器,示波器、X-Y记录仪、文件等各种记录和显示设备。

打开信号处理模库的大类,其中也有下一级的菜单,给出了信号处理常用的模块,比如在其“DSPSinks”中,有频谱分析仪、向量示波器等,在“变换”中有FFT、DCT等。

另外,用户还以按自己的设计定义模块,比如按9.2节的方法用fdatool设计好了示波器,单击该设计界面左下方第4个按钮(RealizeModel),系统会自动生成该示波器的信号流图,也就是仿真的框图。

在本例中生成的模型是3个双二阶模块的串接,每个模块都如图9.4.2所示,用户可以把它存储成自定义模块,需要时就可以调出来仿真。

2.模型的建立

要开始建立模型,可单击左上方的File菜单项中的子菜单New,屏幕上会出现一个供绘制框图用的空白页面,用鼠标完成连接,然后双击模块填写参数,从而完成整个仿真模型的创建。

9.4.3仿真的运行

现在用MATLAB中的一个演示程序来说明,在命令窗口中输入fxpdemo_direct_form2,屏幕上将出现如图9.4.3所示的仿真波形。

不难算出,这些模块组成了形式为

数字滤波器。

它的输入是经过浮点到定点转换的定点信号Xq,输出的定点信号yq再经过转换模块而恢复为浮点信号y,然后与信号源所产生的原始的浮点信号x一起送到示波器中观测比较。

上述两个变换模块是定点计算模块库(FixPointBlockset)中的,其参数设定为双精度到定点数(1、16、10)(即带1个符号位和10位小数的16位定点数)之间的转换。

先设定信号源参数和所有的模块的参数,双击选定的模块,屏幕上将弹出此模块的阐述设定视窗,由于各模块均取演示程序中原设计的值,就不必一一设定了,信号是周期为200ns的方波。

然后在仿真框图菜单项“simulation”的下拉菜单中先选择“configurationParameters”项设定仿真参数,再选“start”,系统就开始仿真,双击示波器,在其屏幕上看到输入和输出两根曲线。

如果这里的定点仿真不只是对信号,也包括对参数,则系数设定中也必须同时考虑取有限字长。

Simulink可以解决MATLAB程序不好解决的非线性、变系数系统的问题。

因此,许多领域都针对本身的特点,开发了各种仿真模块或模块库加入到simulink中去,除了上面用到的数字信号处理模块库、定点处理模块库外,还有通信(comm)、控制系统(Control)、非线性系统(NCDBlockset),电力系统(PowersysBlockset)、状态流(StateFlow)、系统辨识(SystemIDBlockset)、其他(SimulinkExtras)等,有了这些库,就很容易用simulink来解决它们的问题,而且只画框图,无须编程。

9.5MATLAB与嵌入式代码的衔接

通过包含定点工具的仿真,设计出的系统必概念设计要靠近实际一步,因为它把计算机有限字长考虑在内了,但离开以芯片为核心的嵌入式系统硬软件相距还有相当距离,各种芯片的开发商通常把C语言或HDL语言的问题,但普通的MATLAB语言并不能直接与C兼容。

比如MATLAB的数的格式就没有C多,芯片上的数据格式更少,必须通过定点工具箱限定定点格式,以解决各种语言的衔接问题,但还有其他的问题,例如MATLAB的内存空间是可以在程序运行过程中动态分配的,C语言也如此,但芯片上的变量比定放在固定的存储器中,因此要把定点MATLAB再进一步改造成为嵌入式MATLAB语言(EML)并转换为嵌入式的C代码。

把MATLAB和simulink转换为C代码的MATLAB工具是Real-TimeWorkshop和Real-TimeWorkshopEmbeddedCoder。

后者产生的是经过优化的能与嵌入式系统要求匹配的C代码。

此外实际系统中往往有许多离散事件,包括开关和状态的条件切换等,simulink有专门的stateflow工具对离散事件建模仿真,它通过StateflowCoder产生C代码。

MATLAB和simulink有关信号处理从概念设计到代码实现的各主要工具的相互关系如图9.5所示,在底部的是从事概念设计的工具,愈往上愈接近于实际的系统,顶部的工具则是用来产生目标芯片代码生成器。

由C代码向芯片代码转换的工具一般由芯片生产商开发,它用的c代码也是有一定限制的嵌入式代码。

由于设计过程中不只是MATLAB语言向芯片代码的单方向变换,还要在仿真中看到芯片中的数据和进行反复修改,所以需要双向的数据通信、观测和底层参数修改等操作。

这些软件都要复杂得多,必须由既精通MATLAB和C,又熟悉目标芯片特点的技术人员共同开发。

以TI公司的数字信号处理芯片为例,Mathworks公司为它开发与之相联软件,叫做EmbeddedIDELinkTMCC(forTI’sCodeComposerStudio)。

此外为每一类芯片分别开发出代码生成工具TargetSupportPackageTC2和TargetSupportPackageTC6。

9.6基于模型的开发流程

嵌入式系统的开发一般包括四个阶段:

需求与规范、设计、实现、测试与验证,如图9.6.1所示,传统的开发过程中,这4个阶段的界限相对比较清楚,而且多数由不同的部门或者不同的人员完成,由于不同的开发阶段采用不同的工具,相互之间的交流缺乏统一的平台,实现阶段是比较繁琐的而且工作量巨大。

基于模块的设计避免了繁琐的过程,首先在需求与规范阶段,规范是可以执行的Simulink模型,有明确的输出结果,不会存在理解的歧义;在设计阶段,根据实际的需求来做细化,例如考虑定点要求,采用更加符合实际要求的算法来设计,每一步的改动都要作仿真和验证,确保保持最初的需求;在实现阶段,采用商业工具的自动代码生成功能,可以避免手工复杂的编写代码的工作,快速从设计到实现,同时也避免了编写代码可能引入的错误,大大提高了实现的效率;由于测试和验证贯穿了整个开发流程,而不是在最后阶段才开始进行验证,能够及早发现并解决问题,以最小的代价得到最大的结果,这种流程,无论在时间上还是在金钱上,都会大大节约,是一种非常有效的设计流程。

TheMathWorks公司提供了完整的基于模型的设计流程,从算法的研究、开发设计,到C代码和HDL代码的自动产生,以及代码的验证、联合仿真、及硬件验证,都能相应的工具来支持,如图9.6.3所示,其他公司,包括芯片厂商也提供了相应的工具,作为Simulink的一个模块库,加快设计、开发的流程。

下面把其中具体的工具作一个简单介绍。

自动C代码和HDL代码生成工具:

从Simulink模型、EmbeddedMATLAB(MATLAB语言子集,包括若干面向嵌入式实现的操作符及函数)及Stateflow产生标准的C代码、嵌入式C代码或者HDL代码(VHDL和Verilog代码),包括:

Real-TimeWorkshop产生标准的C代码

Real-TimeWorkshopEmbeddedCode产生嵌入式优化的C代码

StateflowCode从Simulink模型及EmbeddedMATLAB产生HDL代码

FilterDesignHDLCoder产生所设计滤波器的HDL代码,包括VHDL和Verilog代码。

目标支持包,支持特定的处理器及相应的板卡:

TargetSupportPackageIC1(forInfineonC166)

TargetSupportPackageFM5(forFreescaleMPC5xx)

TargetSupportPackageTC2(forTI’sC2000DSP)

TargetSupportPackageTC6(forTI’sC6000DSP)

这些软件工具可以产生针对特定处理器的优化的汇编代码,对于支持的板卡,可以产生包括算法及板卡外设驱动的整个工程文件。

与嵌入式集成开发环境的连接工具:

是MATLAB和Simulink与嵌入式集成开发环境联合仿真接口,可以在MATLAB和Simulink环境下对嵌入式集成开发环境进行操作,包括设置中断,编译、调试等。

EmbeddedIDELinkCC

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

当前位置:首页 > 经管营销 > 经济市场

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

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