(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf_第1页
(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf_第2页
(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf_第3页
(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf_第4页
(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf_第5页
已阅读5页,还剩80页未读 继续免费阅读

(物理电子学专业论文)g729语音编解码算法在tms320vc5410上实时实现的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 g 7 2 9 协议是国际电信联盟于1 9 9 6 年3 月1 9 日通过的采用共轭结构代数码 激励线性预测( c s - a c e l p ) 技术的8 k b i t ,s 速率语音编解码算法建议,广泛应用于 v o p 、多媒体技术以及移动通信等领域。 本文研究了将该算法基于p c 平台的c 语言源代码移植到t m s 3 2 0 v c 5 4 1 0 芯片上并使其实时运行的方法,主要涉及以下几个方面的内容:介绍了g 7 2 9 协议的算法原理及1 m s 3 2 0 v c 5 4 1 0 的硬件结构特点:分析了p c 平台与d s p 平 台上c 语言编程的异同,讨论了将p c 平台上的c 代码移植到d s p 平台的方法; 在对c 代码的运行效率进行分析之后,提出了相应的优化策略,并对手工汇编 优化技术进行了深入研究;找出了源代码编码压缩率异常的原因,并对该问题 进行了修正;给出了代码优化效果的验证方案。 优化后的编码函数运行效率提高了大约1 7 1 8 倍,可以满足语音信号实时处 理的要求。 关键词:g 7 2 9d s p 实时运行c 代码移植优化策略 a b j 湘硼 a b s t r a c t n eg 7 2 9s p e c c hc o d e ca l g 硼也mi sa 阍:c i m m e n d a l i o nf o rm e c o d i n gs p e c c hs i 鲫a l s a t8 k b i 如卿el l s i n g c s - a c e l p ( c 嘶u g a t c - s 廿咐t u r e 础g e b r a i c - c o d e e x c i t e d l i n e a r - p r e d i c a t i o n ) ,h 恼c hw 弱a p p r o v e db yi t u ( i n 咖1 a 畦。砌1 纠e c o 咖u l l i c a l i o n u n i o n ) o nt l 圯1 9 伪o f m a r c h1 9 9 6 g 7 2 9h 勰b e e n 、v i d c l y 璐e di i lt h ef i e l do f v o 职 m m t i m e d i a t c c l l i l o l o g y 锄dm o b i l ec o m m i l i l i 训。几 1 k 吐l e s i s 咖d i e dn 地乜锄s p l 锄t a t i o n 觚d 坞a 1 吐m ei m p l e m e mo fcc o d co nd s p t h em a i l l 唧e c t sd e a nw i t h 也i st b e s i sa r e 蛐r u c t i l r e d 勰f o l l o w s :i m r o d u c t i o no nt h e a l g 嘶t 1 1 mp 血c i p l eo fg 7 2 9 髓d t 1 1 ec h a m c t 甜s t i c so ft m s 3 2 0 v c 5 4 1 0 s 戤l l i t e c t t ;咖p a r i n gm ed i 髓r c n c cb 嘶v e 胁p ca i l dd s pw h j l ep r o 弘l l n l l l i n gc c o d ef o rt h e 地j no r d e ft dm a k en 砖g 7 2 9cc o d en m0 廿d s p ;a 盘c r 衄a i y 西n g 船 e m c i e n c yo fcc o d e ,p r e s c n t i n gm ea c c o r d i n go p t i l n i z a t i o ns t 瞳t e g y 觚dd e e p l y s t 【l d y 缸g 也et c c l l i l o l o g yu s e dt 0o p 由n i 船s e n l b l ec o d ec o m p i l e d 研mcc o d c ; f - m d i n go u tt h er e 嬲o no fc o m p r e s s i o nr a 土i o 锄ra n dh o wt oc o r r e c t “;g i v i n gm e m e t h o dt 0t e s tr e s u n 哪) t i m i z a d o i l a f 妇o p t i i i l i z a t i o i l ,1 ee m c i e n c yo f 跚c o d e 铀鲥o ni a i s e db y1 7 1 8 廿m 1 1 1 e o p t i l l l i z e dc o d ee 璐u r et 王l e 此a l - 痂【i l ei i l l p l e m 筋t a 畦o no f t l 】【ea l g o r i m m k e yw o r d s :g 7 2 9 ,d s p ,r e a l - t i m ei m p l e m e 咄呻l 雅t a t i o no fcc o d e ,o p t i m iz a _ 6 0 n s t r a t e g y i i 第一章引言 第一章引言 语言是人类交流、沟通、传递感情最重要的方式,而语音又是语言最自然、 最基本的物理载体。在这个号称“信息社会”的时代,语音信号的处理和压缩 技术引起了人们高度的重视。随着多媒体和通讯技术的飞速进步,特别是无线 通讯、网络电视、网络音视频会议、网络口电话、公共交换电话网、话音存储 转发等相关领域的不断发展,数字语音压缩技术的应用范围越来越广泛。 语音数字处理是就是将模拟的语音信号采样量化之后转化为脉冲编码调制 ( p c m ) 信号,再利用数字信号处理的相关理论进行滤波、压缩、语音识别等 操作的过程。语音压缩编码是语音数字处理最重要的一种应用。语音压缩的目 的是用尽可能低的比特率获得尽可能高的语音合成质量,这样就可以利用有限 的带宽传输多路语音信号,提高带宽利用率。根据语音压缩编码的采样率,可 分为窄带语音编码( 电话带宽3 0 0 3 4 0 0 h z ) 、宽带语音编码( 7 k h z ) 和音乐带 宽编码( 2 0 m z ) 。 第一节数字语音压缩技术现状【1 1 对于数字语音信号的压缩研究有两大分支:波形编码和参数编码。波形编 码试图无失真的重构语音波形,编码时以逼进原始语音信号的波形为目标。用 这种编码方式重构的语音质量很高,但是编码压缩率较低。当编码速率下降到 1 6 k b s 以下时,语音质量将大幅降低。参数编码不强求波形上的近似,而是以 语音的“可懂度”为追求的目标,通过为发声器官建立数学模型,根据给定的 语音信号计算模型参数,对参数量化编码来实现语音压缩。参数编码相对波形 编码来说压缩率很高,但是在重构的波形上与原始语音差距较大,仅足以维持 一定的可懂度。目前还经常采用波形与参数混合编码的方式。混合编码结合了 波形与参数编码各自的优点,一般将其划分到参数编码的阵营里。 对于语音编码,通常要综合考虑音质、压缩率和算法计算的复杂度,在三 者之间进行折衷。经过数十年的努力,人们在语音信号的压缩方面已经取得了 第一章引言 很大的成绩,研究出了很多压缩语音的方法,并形成了若干压缩编码标准。 表l l 部分i t u 语音编码标准 标准颁发时间速率时延( m s )话音质量编码器类 ( k b i t s ) 帧长前视型 g 7 1 11 9 7 2 6 4 o 1 2 5 长途压扩p c m g 7 2 1 1 9 8 4 1 6 ,2 4 ,3 2 ,4 0 o 1 2 5长途a d p c m g 7 2 21 9 8 8 6 4 ,5 6 ,4 8 1 5长途a d p c m g 7 2 31 9 8 6l6 ,2 4 ,3 2 ,4 0o 1 2 5长途a d p c m g 7 2 3 1 1 9 9 55 3 6 3 3 07 5长途 多脉冲 c e l p g 7 2 61 9 8 8 1 6 ,2 4 ,3 2 ,4 0 0 1 2 5长途a d p c m g 7 2 7 1 9 9 0 1 6 ,2 4 ,3 2 ,4 0 o 1 2 5长途a d p c m g 7 2 81 9 9 41 6o 6 2 5o长途 c e l p g 7 2 91 9 9 68l o5长途c e l p g s m 半速率 1 9 9 45 62 05长途 c e l p 工s 9 6 1 9 9 38 5 4 ,2 0 8 2 05i 锣p e d e f 豳瞅w 戳1 6 ; 。秀 铆e d e f 白鹰w j 蚶3 2 ; , ; ;伽e d e f 触f l a 戳 i r 钝【i f 如f m 。d m 国# 妇d ( 、嗽$i 。铆e d e 盎o r tw r 饿d l 绞 ; 铆e d e f 】锄g 删复 r # 锄e d e f i l 缱 f k l g ; , 聋e 王s e: i 翔盯o rc o m p 一e rn 凹豫s t e d 愀hn e c d s 协b eu p d 眦蠡s e er 。礤m e 羝糖d i f! 可以看到该文件定义了三个数据类型,分别是1 6 位长度的二进制补码数 f i a g 和w 砌1 6 ,3 2 位长度的二进制补码数w 研d 3 2 。在t m s 3 2 0 c 5 叙的c 语言 中,所有数据类型只有1 6 位和3 2 位两种长度。l o n g 类型的长度为3 2 位,i m 类型的长度为1 6 位,将这两种类型定义为新的数据类型即可。修改后的聊e d c h 第四章1 m s 3 2 0 v c 5 4 l oc 语言运行环境及c 代码移植 4 3 2 改写主函数 源代码中包含了两个主函数,分别将两个主函数改写为相应的编、解码子 函数,构成相对独立的通用编码、解码模块,供不同主函数调用,以实现不同 的功能。 新建一个名为9 7 2 9 c o d e c 的文件,将原先的编解码主函数改写为编解码子 。锄诚心”麟q 嗡醚一:甏 7 螨戳l l ( 醅| l d g k h ” t 蠢 。w 嘲协s y n _ i h 如瓤秘l a m e 蝴国,础n n k 产渤嘣b _ 瞵番 剖 囊 飞辅b 砸1 6 1 棚器q 菱m - s i z e 】; 产a l l a l y 8 i sp a r 罐田l c t e 峨, w 口以1 6s y n 器,f r 怂位嚣 。 b r d l 6p 煳僻蠹锺s i z e + l 】耋产s 蛐s i sp a a m e 耄髓s 掣 。 。w o 越1 6 蛐啦舻1 诛羽,辜艘舾 严d e d e d 地铀辨蜘蠢h 隧 串, i ,猢硼1 6 鼬触p i 锄地通嫩8 妇吖i ”硒殖d 6 i c i n 戮,雉v 。i 迸n g 盛o m 粥、i 主o n 窭盘a m e 掣 i 一锹越托哎即轭; 。 ; :v o i d 毗n c o d e 0 7。 ” f , “豢 警毯谳 “端。4 铂牮”哪“j “描h 。一孵妒“*懈恤端惦地销噼州批;蝴 乏磷l j 呐c e 豁 一一 lh d t o d e a d 8 l c o ; 4 、? i 墅壁曼型;丝婴蝗型啦:垡。一 2 4 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境及c 代码移植 l v o 撼触目醚。 砸d l 貉橐鞠s p e 幽,黻斌1 香彻谢l s e r i a ls 戮】 窿 p 糟p 胤s 蚀潮s p 髓( 瓠u 蝴巨) ;户嘞蹦鳓输入帧吖 e o 姆磷k 避刚蕊 爹嬲心靳s j 嬲k ( p 曲晦s 戚哟; 蚝商a | 编码数据流 霎 “ ” i :懈透d e 硎野硼1 6 苫e r 烈图e r l 魁,s 1 2 嗣,m 分硝咖匹一r a 摊溺 、气 。 , c 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境及c 代码移植 可以看到9 7 2 9 c o d e c 文件中保存的是从原主函数中提取的编解码功能模块, 原先两个主函数中数据输入输出的部分没有保留,而编解码部分的内容被分配 到四个功能划分明确的子函数之中,其中i l l i l c o d c 0 、i n i t - e c o d e o 、e n c o d c 0 、 d e c o d e 0 分别是编码预处理函数、解码预处理函数、编码函数、解码函数。这样 就将数据交互的任务交给了重新编写的主函数,再由主函数就根据需要调用相 应子函数,以实现不同的功能。 为实现对源代码进行优化、调试的目的,需要搭建一个优化调试平台。在 对源代码进行优化调试阶段,本课题利用c c s 通过仿真器将p c 上的文件写入 和读出d s p ,使用c c s 自带的p r o f i l e r 工具测试代码运行速度。虽然搭建这一平 台不是本课题的最终目的,但这是软件优化调试过程中必须的。新的主函数也 是为搭建该平台而编写的。 c c s 支持c 语言中如a d 和竹r i t e 这样的文件读写函数旧,主函数用船a d 语句从p c 上读取p c m 文件,送e n c o d e 函数编码,再将编码结果送d e c o d e 函 数解码,用晰t c 语句写入p c 上的另一个p c m 文件。 触a d 和铆r i t e 的原型在s 础i o _ h 中。能a d 的调用格式是i n t 缸a d ( v o i d 奉b 旺i n t s i z e ,i n tc o 咖t ,f 眦s 吮锄) 。该语句从s 吮锄中读取u m 个长度为s i z e 个字节 的字段,读入的数据存放在b l l f 指向的数组中,返回值为已读取的字段个数。f i ) i ,r b 的调用格式为i n t 舳r i t e ( v o i d b u i n ts i z c ,i n tc o m f 儿e + g 眦锄) ,用于将数据写 入g 眦锄中,各项参数的含义与缸a d 类似。【1 6 】 丘e a d 和向一t e 读写p c 机数据的最小操作单位是一个字节即8 位,但 i m s 3 2 0 v c 5 4 1 0 是1 6 位d s p ,最小操作单位是一个1 6 位的存储单元。直接从 p c 机读取1 6 位p c m 文件,每次读入的是一个8 b i t 字节,然后被存放在d s p 存储单元的低8 位,而高8 位为零,这样就产生了错误,必须编写附加程序对 这些情况进行处理。文件读取子函数定义如下: 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境及c 代码移植 姻t 蜘圃缸 蠡蛹钮寥g o ;i 嘞 印陋g n o ; 如哟硼;:i 8 0 澎 “ 篮( 盘e a d ( & 两汛t l 毒静,:一田 挽既k 釜 e a d 锄p ,l ,l ,蜘一眵 b 如。 d p t 秘扣姐i l n 十t 豫胁越( n 羟 墨熊曼三鱼垫塞墨塑!一,一一 锢嘲盘e 磁e ( i m 弗d p ,f 也e 镧骖 i 测试向量采用的是单声道1 6 位8 k s 速率的p c m 采样文件,可以使用c 0 0 1 e d i t 2 0 0 0 软件由其他音频格式转换而来。转换得到的是后缀为们自q 音频波形 2 7 耩鸳蒜谬。鞯噬疆毒絮嚣嚣鼍。嘏嗨m或鬈n崎;蕊#辫簿”。哪。!。憎, n 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境及c 代码移植 文件,文件开头是长度为4 4 个字节的头文件,其后为p c m 数据。要想读取头文 件后面的p c i i 数据,必须对唧文件的数据存储格式有所了解。啪v 文件格式 如表4 3 与表4 4 所示。 表4 3 w a v 文件头文件格式 偏移地址字节数数据类型 内容 0 0 h4 c h a r“姗”标志 0 4 h 4 l o n g i n t 文件长度 0 8 h4c h a r “w 觚,e ”标志 o c h 4 c h a r “丘n t ”标志 1 0 h4 过渡字节 1 4 h2i n t 格式类别 1 6 h2i n t 通道数 1 8 h2i n t 采样率 1 c h4 l o n g i n t波形音频数据传送速率 2 0 h 2i n c 数据块的调整数 2 2 h2每样本数据的位数 2 4 h4 c h a r数据标记符 2 8 h4 l o n g i m语音数据的长度 表4 4 w a v 文件p c m 数据格式 类型样本1样本2 8 位单声道o 声道0 声道 8 位立体声o 声道( 左)l 声道( 右)o 声道( 左)1 声道( 右) 1 6 位单声道o 声道低字节o 声道高字节o 声道低字节0 声道高字节 1 6 位立体声o 声道低字节0 声道高字节l 声道低字节l 声道高字节 由此可见在读取和写入p c 机上的数据时,必须略过w w 文件的头文件。新 的主函数使用上面定义的文件读写子函数进行数据读写,并对w a v 文件的头文 件进行了相应处理。主函数定义如下: j 黝蚴镪白纽胁 ?。 歹 ”自呸n e l l 撼e 穗n l i b h 。 ”雌“” 一 。v 叶 ”。 叫 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境及c 代码移植 j 聱菌d d 。& ( 鞲枷1 辱厕a 珏8 e r l a i ,s 吼嘲1 辱p s t j d 啦 lf r a 量汪e 瑟一 i 碱a 饿函n 列垡难幻弦e c b ; * m e 誓s j m ; 茹毒嫩嘲w o 娥绔4 勰黟驴溅 霎删蚕重吼p 叫u 融笺m e 羹 p o 缸煅船蜊s p e e 硪训, 严p o s 值l t e f 棚印啦 第四章1 m s 3 2 0 v ( 4 1 0c 语言运行环境及c 代码移植 :竺c 删蒯麓,l 爹脚n 墩嗽i s s i 鲫c 蚴p l e 彬麓,霪 4 3 3 编写链接命令文件 在没有c m d 文件的情况下,对改写完的源文件进行b u n d ,c c s 会报告一个 w 衄i n g ,显示没有链接命令文件,并生成一个蛐m 文件。打开这个文件,可以 看到汇编后各段大小如表4 5 所示。 表4 5c 代码b 词d 后生成的段 段 页起始地址 段长 咖o0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 p m o0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 t e 斌o0 0 0 0 0 0 8 00 0 0 0 6 c 8 1 c 础 0o 0 0 0 6 d o l 0 0 0 0 0 c f c b s s1 o o o o 0 0 8 0 o o 0 0 1 7 c c s 嗽l o o 0 0 18 4 co o o 0 0 5 7 8 c o n s cl0 0 0 0 1 d c 4 0 0 0 0 0 1 e 8 s v s m e mlo o o o l 0 0 0 0 0 7 d o c l o1o o 0 0 2 7 8 00 0 0 0 0 1 2 0 根据上表编写链接命令如下: 彪e m o r y ;i t i “p a 龇筑 t ;p r d g 弘o r 薏= 幅o 狂1 = 7 f 8 眺 一 ; 氅p 蚕啪老。名宅0 0 0 h l e 咀。l o o o h 。 。 v e c :嘴= o 懿o h 妇一8 嘶, l 擎一w 鼍稻基t 嚣n 一;一。e 。一i 。,、j 。j 。纛 ;d 越渔m :o 耀。8 溉 2 1 f 8 0 h 鍪s a 玉乙 讹。珞= 2 0 0 0 h l i 。n ;5 0 0 0 hj m 雩r 。 i j “ s b g r o j n 耐 “ 7 。“ 3 0 第四章1 m s 3 2 0 v c 5 4 1 0c 语言运行环境j 及c 代码移植 为将s a r a m 2 配置到程序空间的1 8 0 0 0 h 至1 f f f f h 作为程序存储器,需 要将g e l 文件中的语句煳e f i 鹏p m s t _ 地o ) 【虢o u 改为0 x 卸u 。要想使程 序能够正常运行,还必须在p r o j e c t - b l l i l do 埘o n - l “澍b 鼬i c 选项卡下对h e a p s i z e 和s t a c ks i 髓进行适当设置,如果长度过小,运行时会发生不可预见的错误。 这里将h e a p s i 臻设为2 0 0 0 ,s t a l c k s i z e 设为1 4 0 0 a 4 3 4 程序运行结果检验 现在已经初步完成了c 代码的移植及优化调试平台的搭建,为下一步的程 序优化打好了基础。为了检验程序运行的效果,可以将测试向量拷贝到d e b l l g 文件夹下,然后装载运行程序,将最后的输出结果用c o o le d i t 2 0 0 0 打开,观察 波形并收听实际的播放效果,也可以用i j l 仃a e d i t 以二进制文本方式打开,与标 准输出向量( v c 编译生成的可执行文件的运行结果) 进行比对,以确定移植是 否正确。 3 l 第五章c 代码运行效率分析及优化策略 第五章c 代码运行效率分析及优化策略 将c 代码从p c 平台移植到d s p 平台,并没有实现本课题的最终目标,还 要对代码的运行效率问题进行考察。如果运行效率不能满足实时性的要求,就 必须对代码进行优化。1 m s 3 2 0 v c 5 4 1 0 的运行频率为l o o 姗z ,g 7 2 9 算法以 l o n 塔为一帧,那么每帧的运算量必须在1 0 0 z 1 0 m s ,1 s _ 1 m 以下才能满足实 时实现的要求。 第一节移植后c 代码运行效率分析 为考察移植后c 代码的运行效率,我们利用c c s 自带的p r o f i l 盯工具对 e n c o d e o 和d e c o d e o 函数的运行周期数进行统计。载入c o f f 文件,点击 p r o 丘i s t a r tn e ws e s s i o n 打开p r o f i l 盱工具,将上述函数拖入窗口中,然后开 始运行程序。在完成对测试向量中所有数据的编解码后,将得到朗c o d e 0 和 d e c o d c o 精确的运行周期数。得到的结果如表5 1 所示。 表5 1 未优化代码运行情况统计 统计项 e n c o d e od e c o d e o c o d es i z e 2 81 2 4 c o m t2 0 52 0 5 h :屺1 t b t a l 1 ,6 3 8 ,8 7 3 ,2 5 2 3 3 2 ,2 3 0 ,6 9 6 i n c l m a 姬m 衄 8 ,5 6 9 ,9 0 9l ,7 1 2 ,9 3 8 i n c l m i l l i m 岫 7 ,0 9 2 ,2 4 71 ,0 0 1 ,4 8 4 i n c l a v e r a g e 7 ,9 9 4 ,5 0 31 ,6 2 0 ,6 3 7 e x d t o t a l3 0 7 51 4 1 1 4 4 e x c l m a x i i n 啪1 56 8 9 e x d m i l l i m 啪 1 5 6 8 7 e x c l a 响e 1 5 6 8 8 c o d es i z e 是被测函数长度,其中不包括被调用的子函数长度;c o u n t 是执 第五章c 代码运行效率分析及优化策略 行次数;t 0 t a l 是总机器周期数;m a x h n 啪是执行一次所需最多机器周期数; 缸n i l n 嘲是执行一次所需最少机器周期数;加唧是各次执行的平均机器周期 数;h l c l 表示该统计数据包含被调子函数,e x c l 表示该项不包含被调子函数。【川 每帧执行所需周期数的不同,是由每次运行时,循环语句的循环次数不同 以及程序经由分支语句不同的分支路径造成的。为保证程序的实时性,必须使 测试得到的执行一次所需的最多机器周期数满足本章开头所提出的实时性标 准。对未优化代码的测试结果显示,编码函数每帧的运算量达到了约8 5 7 m ,解 码函数的运算量约为i 7 l m ,合计达到约1 0 m 之巨,显然远远不能满足实时性 的要求。因此必须对代码进行优化。 源代码是用c 语言编写的,而且并非专门针对d s p 平台,没有针对d s p 编 译器的特点做有针对性的优化,因而编译生成的汇编代码含有大量冗余,且d s p 器件的一些特点无法发挥出来。一般来讲,完成同样的功能,用c 语言编写的 程序与有经验的程序员用汇编语言编写的程序相比,效率可以相差几倍乃至几 十倍不等。通过适当的优化,可以消除代码中的冗余成分,极大提高程序运行 效率。 第二节基本运算函数代换 第四章第一节给出的表4 1 列出了g 7 2 9 源代码中各文件及函数的功能,其 中b 嬲i c o p c 文件定义了用于四则运算、移位、饱和等基本运算的子函数,这些 函数被称为e t s i ( e u f o p e a n1 e l e c 0 删n i i i l i c a t i o ns t a i 池r dh l s t j n 】t e ) 基本运算函数。 这些函数虽然通常较为短小,但被调用次数极多,消耗了大量的运算能力。c 语 言调用子函数时,要把参数压入堆栈以进行参数传递,被调函数再从堆栈中取 出参数,这就增加了一定的代码长度和运算量i 嘲。由于基本运算函数大多较为 短小,这些堆栈操作在函数中所占比例就显得很高。另外这些函数是为定点数 运算编写的,而i m s 3 2 0 v c 5 4 1 0 本身就是一款定点d s p 器件,具有很多为定点 数运算而设计的特性。由于源代码并非针对d s p 平台开发,因而这些特性并没 有被基本运算函数所使用,这也造成了部分运算资源的浪费。例如b 鹪i 蚺p c 中的减法运算函数s u b o : ,耀傩d 墙s 珏b 瓣簖d 协v 醒l ,珥o r d l 嚣张r 幼 乏 3 3 子函数将1 6 位减法扩展为3 2 位减法,然后对结果进行饱和操作。饱和操 作函数的代码如下: 女 ”溪 主f 疋v 群1 国0 7 髓乱 。 o v e r f l ( 肿= l : v a 也。吐;姒1 6 : 一 嚣l 黪键诅- v 甜r ( 轷o r ;d 3 2 锨f 雠潮 f 0 v e r 萎l 错= l : l v 戳,l 托= 疆l n l e 圭s e l 。 。踟e r f l 瓣= 锨 。 :删分= e 蹴m e k l ( l v l ,;, 一 , l * 一 “ : 蓄e t e 芏髓v a r 嘲i t b 。 一 ; ; 、 。 一 。 j 其实只需将o v m 标志位置位,利用t m s 3 2 0 v c 5 4 l o 的自动溢出处理功能 就可以完成饱和操作 。 。,。, 对这些基本运算函数的处理并不需要逐条语句进行改写。c c s 的编译器可 以识别若干个i n t r i l l s i c 运算符,只要用这些运算符对b 部i c - o p c 中的函数进行代 换即可。这些运算符可以像c 函数一样调用,能够直接使用c 定义的变量【1 9 1 。 在、t n c 5 4 0 0 c g t o o l s i n c l u d e 文件夹下有个名为i n 仃砌e f s h 的头文件,该文件 3 4 第五章c 代码运行效率分析及优化策略 。释d e 觚。礁j 碜 ;溉触翡置文笱 :禳l 硪n e 囊d d 坊一 孝如f h 蟛3 u b b 鬻d 硪黼鼎嬲嵫h 黼e 磊n e 耘拓a 睦一l 围 i 趟硪聪撤m d ( 磅 蛐丘n e 如a c 确,b ,谚 撑d e 磊n e 、l 玎翻l 南堍c ) 撑d e 蠡n c 黝啦够 群d e f m e 强n l a ,协 ”群d c 伍n e 封嘲:j g 喀 i 铡e 妇n 0 啦一s # ! 翱e f i m en e g 雒e ( a 国螂盐r ) ) ( 血瓯( a ) o a d d 弘黝 c - 鹦曲( ( 曩) 鹚 矮哑8 i 弦粼a ) :1 6 弦 n t ) 醇 ( - 删 ( 锄粒( a ) ,) ,( c ) 汾 ( s 翔嬲砭( a ) ,( b ) ,( c ) ) 爹 l s 啦p y 婚x ( b 涝 o m 】嫩) 如) ) ) l l n 啦 ( _ 簟饿h l 锄 哑g , t 塑! 垒望墅幽 :。垡型遨堕趔: 3 5 第五章c 代码运行效率分析及优化策略 i n _ 虹i 璐i c h 头文件使用d e 6 语句以带参宏定义形式实现i i 嫡m i c 运算符与 基本运算函数的对应关系。以上只是对这些函数的初步处理,在后续的优化过 程中,还要运用一些指令对除法运算函数进行改写,并使用d s p 固有的一些特 性代替部分基本运算函数完成相应功能,这些内容将在后续章节中进行介绍。 基本运算函数代换后编解码函数运行情况如表5 2 所示。 表5 2 基本运算函数代换后编解码函数运行情况统计 统计项 e n c o d e 0d e c o d e o c o d es i z e2 81 2 4 c d m t2 0 52 0 5 h l c l t 0 t a l 2 9 0 ,6 3 1 ,2 6 7 6 l ,6 6 5 ,4 7 9 h l c l m a x i 加u r n l ,5 5 9 ,2 3 3 3 l o 1 7 2 1 1 1 c 1 m 诚m 啪 1 ,2 0 4 ,8 4 6 1 7 9 3 7 0 1 1 1 d a 、惯a g el ,4 1 7 ,7 1 3 3 0 0 8 0 7 e x c l t b t a i3 0 7 51 4 i 1 8 8 e x c l m a x i m 啪1 56 8 9 e x c l m i l l i m u m1 56 8 7 e x c l a v e f a g e 1 5 6 8 8 编码函数和解码函数的最大执行周期数都减少为替换前的大约1 5 ,运算量 总计约1 8 7 m 个机器周期,虽然效率提高到了替换前的5 倍,但是距达到实时 运行的标准还有较大差距,因此还要对源程序进行更加深入的优化。 第三节t m s 3 2 0 v c 5 4 1o 汇编与c 语言混合编程1 1 3 1 1 2 0 1 【2 l l l 2 2 j 由p r o f i l e r 对部分函数运行情况的统计可知,运算量并非平均分布在代码上 的,代码长度与运算量并不成正比关系。部分函数由于被调用次数较多,或者 内部含有循环次数较多的循环体等原因,而使这些函数消耗了程序绝大部分的 运算量。为进一步提高程序的运行效率,需要对生成的汇编代码进行优化。集 第五章c 代码运行效率分析及优化策略 中精力对运算量较大的关键代码进行优化,可以取得事半功倍的效果。 对部分函数进行手工汇编优化,首先要用编译生成的相应汇编文件替换c 语言文件,这就牵涉到c 语言与汇编语言混合编程的内容。下面就来介绍一下c 与汇编语言的接口,包括寄存器规则、c 语言函数调用规则及c 与汇编语言混 合编程格式约定。 一 5 3 1 寄存器规则 寄存器规则规定的是编译器如何使用寄存器、在交叉调用时如何保存寄存 器值。在寄存器规则之下,寄存器被分为两种类型,即入口保存寄存器和调用 保存寄存器。其区别在于交叉调用时保存的方法不同:入口保存寄存器的值由 被调用函数保存,而调用保存寄存器由调用函数保存。表5 3 对编译器如何使用 寄存器和如何保存寄存器值进行了总结。 表5 3 寄存器使用和保存规定 寄存器用途 入口保存调用保存 a r d 指针和表达式 否 是 a r l指针和表达式 是否 思2 ,陋5指针和表达式 否是 a r 6 指针和表达式 是否 嘲 指针、表达式和帧指针是 否 a 表达式、传递首个变量给函数、函数返回值 否是 b表达式 否是 s p 堆栈指针入口入栈,返回出栈 t乘法和移位表达式否是 s t o s t l状态寄存器见表5 4 b r c 块重复计数器 否是 5 3 1 1 状态寄存器的位 对状态寄存器状态位的规定包括预设值和修改状态。编译器总是假定状态 寄存器s t l 中的0 m 位在硬件复位时被清除,如果在汇编代码中对0 m 位进 行了设置,则返回到c 环境之前必须将其复位。表5 4 列出了编译器使用的状态 第五章c 代码运行效率分析及优化策略 寄存器的标志位。 表5 4 编译器使用的状态寄存器标志位 标志位名称预设值修改状态 a r p辅助寄存器指针o 是 a s m 累加器移位模式 是 b r a f块重复有效位 否 c进位位 是 c 1 6 双1 6 双精度模式位 o 否 c m t修改模式位o否 c p l编译器模式位l否 f r c t 小数模式位 o 是 d 朔累加器a 溢出模式位 是 0 v b累加器b 溢出模式位 是 0 v m溢出模式位oi 肭妇i c 修改 s ) ( m符号扩展模式位 是 s 姗l 乘法饱和模式位 o i n 埘n s i c 修改 s s t存储饱和位o否 t c测试控制位 是 注:( 1 ) 预设值一项中的“”表示没有期望值,预设值指如下的这些值: 编译器进入函数或从函数返回时所期望的值; 当c 代码调用汇编函数时,相应的汇编函数默认的值; 当汇编函数返回调用它的c 代码时,必须提前设定的值。 ( 2 ) 修改状态表示编译器产生的代码是否会对这个标志位进行修改。 5 3 1 2 寄存器变量 c 编译器在一个函数中可分配最多两个寄存器变量,由r e 百s t c r 声明。用户 必须在变量列表或函数的第一个块中声明寄存器变量,在嵌套块中定义的寄存 器变量被看作普通变量。编译器使用a r l 和舢m 作为寄存器变量,第一个变量 声明为a r l ,第二个变量声明为u 也。 第五章c 代码运行效率分析及优化策略 5 3 2 c 语言函数调用规则 c 编译器针对函数调用有一套严格的规则,任何c 函数调用的函数都必须 遵守这些规则,否则会破坏c 环境并导致程序运行失败。如果单纯使用c 语言 编程,那么函数的调用规则是不必关心的,因为这部分工作是交由编译器处理 的。但是在使用c 与汇编语言混合编程时,就必须对这部分内容加以了解。c 函数使用堆栈传递参数、分配局部变量,函数调用时堆栈使用情况如图5 1 所示。 低 高 调用前 父函数 参数头 父函数的 局静变量 将参教移动列参教块分配新喷 祗 离 瘊 邋西壤址 参复船 l 参数l | 参数n 累加器a 父函数的 局部变量 蔼 局帮变量块 扁龆帧 返回地址 父蘧致 l 参数i i 参数块 li 豢加嚣a 父两教螅 局邬变量 图5 1 函数调用时的堆栈使用情况 当父函数调用其他函数时,会执行以下任务: 1 、被调函数的第一个参数放进累加器a ,余下的变量按照从右到左的顺序 依次移入已经在堆栈中的开辟好的参数块中由于t m s 3 2 0 v c 5 4 1 0 的堆栈是从 高地址向低地址生长的,那么最左边的参数就应该位于最低的地址; 2 、若被调函数返回一个结构,则父函数为该结构分配空间,用累加器a 传 递返回空间的地址给被调函数; 3 、将返回地址压入堆栈,调用被调函数。 父函数调用被调函数之后,被调函数将执行下列操作来做出响应: 1 、若被调函数修改a r l 、j r 6 或a i 订,则将它们压入堆栈; 第五章c 代码运行效率分析及优化策略 2 、被调函数通过从s p 减去一个常数来为局部变量和参数块分配存储空间; 3 、执行代码; 4 、被调函数若有返回值,则将其放在累加器a 中,若返回一个结构,则将 结构复制到累加器a 指定的存储地址; 5 、被调函数给s p 加上一个常数,以释放局部变量和参数块; 6 、恢复被调函数保存的寄存器; 7 、被调函数返回。 有些汇编语句可以读写3 2 位操作数,而1 m s 3 2 0 v c 5 4 1 0 的基本存储单元是 1 6 位的,这就产生了一个3 2 位数据高位和低位如何排放的问题。例如d l d ( l m e m a d d r ) a 这条语句,从l m e m a d d r 中读出的数据作为高位,而从 ( l m e n l a d d r 1 ) 地址读出的数据则被作为低位。编译器要求保证任何3 2 位对象的 高位放在偶地址中,而低位放在奇地址中,因此s p 总是被定位在偶字边界,且 3 2 位局部变量的偏移量总是偶数。 下面以一个实际的例子来说明这一过程。c o d j d 8 k c 文件中的c o d 刚d 8 k o 函数,调用了l a g 谢n d o w o v 互,r 二h ,r _ 1 ) 。c o d e r - l d 8 k o 将m 放入累加器a 中,然 后按照

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论