急急!!如何将这两个matlab程序合成一体!非常感谢!

急急!!如何将这两个matlab程序合成一体!非常感谢!,第1张

我是楼下,请参见我

clear,clc

syms s a1 x1 lamda1 a2 x2 lamda2

a1=input('a1=');

x1=input('x1=');

lamda1=input('lamda1=');

a2=input('a2=');

x2=input('x2=');

lamda2=input('lamda2=');

a=sym([1 -1/183;0 1]);

b=sym([cos(sqrt(s/a1)x1) (-sin(sqrt(s/a1)x1)/(lamda1sqrt(s/a1)));(lamda1sqrt(s/a1))sin(sqrt(s/a1)x1) cos(sqrt(s/a1)x1)]);

c=sym([cos(sqrt(s/a2)x2) (-sin(sqrt(s/a2)x2)/(lamda2sqrt(s/a2)));(lamda2sqrt(s/a2))sin(sqrt(s/a2)x2) cos(sqrt(s/a2)x2)]);

f=sym([1 -1/87;0 1]);

g=ab;

h=gc;

k=hf;

B=k(1,2);

BB=vectorize(B);

eval(['f=@(s)' char(BB) ';']);

t=(eps:01:1000)';

l=length(t);

ind=f(t(1:l-1))f(t(2:l))<=0;

ind1=ind;

ind1(end)=[];

t0=[t(ind),t([false;ind1])];

n=length(t0);

s=ones(n,1);

for i=1:n

s(i)=fzero(f,t0(i,:));

end

disp(s)

在编写和调试C6000程序时,为了使C6000代码获得最好的性能,我们需要按照软件编程的3个阶段进行,每个阶段完成的任务如下[4]:

第一阶段:开始可以不考虑C6000的有关知识,完全根据任务编写C语言程序。在CCS环境下用C6000的代码产生工具,编译产生在C6000内运行的代码,证明其功能正确。然后再用CCS的调试工具,如debug和profiler等,分析确定代码可能存在的、影响性能的低效率段。为进一步改进代码性能,需要进入第二阶段。

第二阶段:利用内联函数、CCS编译选项和其他具体优化方法改进C语言程序。重复第一阶段,检查所产生的C6000代码性能。如果产生的代码仍不能达到所期望的性能,则进入第三阶段。

第三阶段:从C语言程序中抽出对性能影响很大的程序段,用线性汇编重新编写,再用汇编优化器优化,链接,直到达到所期望的性能要求。

具体到G729A标准编解码器的实时要求,第三阶段是工作的重点,而且线性汇编的重新编写要求对程序代码和DSP的特性有充分的了解。

3 G729A代码的剖析

CCS集成开发环境为软件开发人员提供了高效的开发、调试工具。特别是它提供了评价器( profiler)的优化工具,通过收集在指定代码区间程序执行的统计性能,分析确定程序中各个段、各个子函数所花费的处理器时间,从而把程序的优化集中在对程序性能影响最大的代码段上去[5]。其两种不同的测试方法是:

(1) 在需要测定复杂度的程序段的开头和结尾处设定两个断点,打开时钟窗口,运行程序。在第一个断点处执行停止,这时双击时钟窗口使之清0,接着继续执行程序,在第二个断点处停止,这时,时钟窗口显示的值便是该段代码的复杂度。这在测试程序中一个函数的复杂度是非常有用的。

(2) 先打开统计窗口,在需要测试的程序段头尾设置统计点((Probe Point)。程序运行结束后,统计窗口内该程序段后面的统计值便是该代码段的复杂度。这种方法较简单,统计点自动收集统计信息,无需手工干涉,这在测定程序多段代码的复杂度是非常有用。

4 线性汇编的优化

线性汇编是TI提供的一种汇编语言,其指令系统和汇编语言的指令系统完全相同,但在编写时不需要指定寄存器和 *** 作单元,也不需要考虑延时的问题,因此编写线性汇编相对要容易一些 [6]。

经过第一阶段和第二阶段的优化后,音频编码程序在DM642上的运行状况有了很大改善,但是经测试仍然没有到达实时效果,而高级语言的效率几乎发挥到了极致,测试的速度达到了365帧/s,是未优化之前的10倍。这时,我们采用线性汇编语言重新编写C代码的低效率段程序,进一步提高程序的执行效率和充分利用DM642的硬件资源,最终按设计要求在DM642实时实现G729A编码。在前面的DSP开发流程已经提过,DSP开发的最后一个手段是用汇编重写C代码,它是唯一可以既提高程序执行速度又可以减少程序体积的方法。由于针对并行处理器编写汇编的难度很大,一般采取的是混合编程的方法,即程序的主要部分用C代码,部分耗时较大的函数可以用线性汇编改写。

在编写线性汇编优化代码的过程中,为了提高代码执行效率,我们需要遵循以下原则[7]:

(1)写并行代码:通过使用汇编指令并行执行的方法减少循环内的执行周期数,优化线性汇编代码。这里的关键问题是弄清指令相关性,只有不相关的指令才能并行执行。辨别指令是否相关,可以使用相关图。

(2)处理跳转指令和转移指令:汇编程序的一大特点就是频繁地跳转,当满足不同的条件时,要求程序进行不同的 *** 作,或跳到相应的位置。对于“大于”、“大于等于”、“小于”、“小于等于”等较为接近的逻辑判断和处理,应慎重对待,否则将产生逻辑性错误,并且很难调试。当发生溢出需进行相应处理时,这种现象尤为突出。

(3)尽量减少循环体内的指令数:G729A的算法实现,有许多是在循环内部完成的,有些地方如固定码本搜索过程中,为了确定四个非0脉冲的位置和幅度,还用到了多重循环。在循环内部,特别是在嵌套较深的循环内部,减少一条指令可以大大降低程序的 *** 作次数。例如,对于一个每重循环8次的四重嵌套循环,在最内层循环每减少一条指令,整个程序可以少执行84=4096语句。因此在设计程序时,能够放在循环体外执行的语句,尽量放在循环体外执行。

(4)展开程序体:在一定条件下,尽量展开程序,以减少子程序的调用和返回次数,牺牲空间换取时间。

G729A算法中的LPC模块、LSP量化及激励码本搜索耗时最多,为进一步提高代码效率,对相关计算、FIR滤波等部分函数用线性汇编语言进行了改写,并用画相关图等方法有针对性的进行优化。经汇编优化器优化后,代码效率比C语言直接编译有明显提高。

5 优化工作的创新点

在对G729A的优化中,本文在前人研究成果的基础上,针对TMS320DM642 DSP系列芯片提出了一些有价值的新方法。这些创新点在不同程度上提高了代码的优化速度和执行效率,在语音编解码的DSP实时实现中起到了关键性作用。下面,以举例的方式阐明一些经典的方法。

51 绘制分析图,掌握函数结构

对于一个语句较多、结构复杂的函数,为了充分了解其逻辑结构和语句的相关性,我们通常采用画分析图的方法。分析图的形式比较灵活,可以根据具体的情况选用不同的制图工具。在编写线性汇编的时候,需要考虑存取数组中的元素,数据打包 *** 作和数据相关性等问题,分析图有助于正确处理这些问题。

在对函数Cor_h_X( )优化过程中,我们遇到了一定的困难,原因在于其中有一个双层的循环体,内层的次数与外层有关,外层的循环次数为40,并且循环内部的语句有先后的相关性。这样的结构如果用循环展开的方法将会用到大量的寄存器,数目超出了64个,需要开辟额外的内存空间去存放临时变量,而读写内存会消耗较多的时间,因此这样执行效率不会有充分的提高。对此,我们利用分析图描述了函数中关键代码的数组X[ ],h[ ]的使用情况,如图1所示:

图1 cor_h_X( )函数分析图(部分)

图1直观地反映了数组16位h[ ]和16位X[ ]之间的乘加关系,从函数cor_h_X( )中可知,两个数组的乘积之和要对应的保存在临时数组32位Y[ ]中。通过研究此分析图,我们发现h[ ]与X[ ]中的一些元素进行乘积和处理之后就不再被使用,那么存储这些元素的寄存器可以存放中间结果(Y[]的元素),这样就可节省寄存器的使用个数,免去了开辟内存空间和中间变量的存取指令。

对于函数cor_h_X( ),利用上述思想编写线性汇编,只需要定义57个寄存器就可以完成所用的 *** 作,存取指令从1760条优化到30条,仅为原来的1/60。同时执行速度从390072个时钟减少到35871个,降为原来的1/10。

绘制的分析图可以包含相关图,相关表等,使资源安排更加合理。该方法在其他函数的改写中也多次使用到。

52 功能相似的函数或代码段合并为一个函数

线性汇编在提高代码效率的同时也成倍的增加了代码尺寸,以上述cor_h_X( )为例,它在该写后代码尺寸从660条增大到7776条(该数据由CCS剖析工具分析所得)。在工程应用中,对于有限的内存程序区,我们会适当减少程序占用的空间。合并功能相似的函数可以达到这一要求。

在LSP量化处理中,源代码中给出了2个LSP选择函数:Lsp_select_1( )和Lsp_select_2( ),而我们发现它们具有相同的功能和相似的结构,因此,在对两者的线性汇编改写中,我们只需编写一个函数(命名为Lsp_select)即可实现LSP量化处理中这两个模块的功能。

另外,在对于一些数组拷贝,数组初始化的代码,我们同样可以用此方法,编写一个函数实现,这样可以在提高执行效率的同时,减少程序占用的内存空间。

53 多个循环合并为一个循环

C代码改写线性汇编的时候,我们常常会发现,只要作一些调整,两个或多个循环完成的 *** 作完全可以由一个循环来完成。以LPC子模块240点加窗语音的自相关计算Autocorr()函数为例,经过优化改写的C代码(部分)如下:

for(i=0; i<L_WINDOW; i++) //第一个循环体

y[i] = (_smpy(x[i], hamwindow[i])+0x00008000L)>>16;

sum = 1; //避免为0的情况

for(i=0; i<L_WINDOW; i++) //第二个循环体

sum = _sadd(sum,_smpy(y[i], y[i]));

这段代码包含了两个for循环,在CCS中直接编译运行并行度很差,利用线性汇编重写代码。我们发现两个循环体的循环次数均为60(L_WINDOW=60),所处理的数组不同,并且两个循环没有相关性,可以把第一和第二个循环合并成一个循环。前者的功能是对语音信号进行加窗;后者是实现乘累加(Mac)。两者合并后采用线性汇编编写,其代码如下:

mvk 60,i //设置循环次数

loop1: lddw ham++,hamih:hamil //hamwindow[]指针

lddw x++,xih:xil //x[]指针

smpy2 hamil,xil,yi1:yi0 //两对16位 *** 作数相承,并行执行

smpy2 hamih,xih,yi3:yi2

sadd yi0,con0x8000,yi0

sadd yi1,con0x8000,yi1

sadd yi2,con0x8000,yi2

sadd yi3,con0x8000,yi3

packh2 yi1,yi0,yl //数据打包技术

packh2 yi3,yi2,yh

stdw yh:yl,y++ //双字存取,提高执行效率

smpy2 yl,yl,yi1:yi0

sadd sum0,yi1,sum0

sadd sum0,yi0,sum0

smpy2 yh,yh,yi3:yi2

sadd sum0,yi3,sum0

sadd sum0,yi2,sum0

add i,-1,i

[i] b loop1 //把第一和第二个循环合成一个大循环,减少转移次数

产生的汇编代码并行流水性能大大增加,耗费的时钟周期数从1310000减少到15000,少于改编前的1/8。

6 结束语

关于编解码器执行的时钟周期,在线性汇编改写前后,文件版本通过CCS的profiler剖析工具得知:每10帧(100MS)从159700000降至68500000,仅为原来的42%。硬件版本进行测试得:编解码的帧数提高到了88帧/s以上,鉴于编码、解码的时间比例为5:1,所以,本系统编码已经达到100帧/s,完全符合实时通信的要求。

面向对象基本特征是:

⑴对象唯一性。

每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。

⑵抽象性。

抽象性是指将具有一致的数据结构(属性)和行为( *** 作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

⑶继承性。

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

⑷多态性(多形性)

多态性是指相同的 *** 作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

扩展资料:

面向对象的要素:

1、抽象:抽象是指强调实体的本质、内在的属性。在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。

2、封装性(信息隐藏):封装性是保证软件部件具有优良的模块性的基础。对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。

3、共享性:面向对象技术在不同级别上促进了共享。同一类中的共享。同一类中的对象有着相同数据结构。这些对象之间是结构、行为特征的共享关系。

参考资料:

百度百科-面向对象

以上就是关于急急!!如何将这两个matlab程序合成一体!非常感谢!全部的内容,包括:急急!!如何将这两个matlab程序合成一体!非常感谢!、高分求助在线等:将2个汇编程序合成一个、面向对象 基本特征等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9671717.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存