×

提高嵌入式DSP系统设计的集成工具

消耗积分:1 | 格式:rar | 大小:0.3 MB | 2017-10-20

分享资料个

嵌入式DSP系统传统设计流程通常由概念到算法及算法到产品两个阶段构成,通常这两个阶段互相独立且由不同设计小组完成。
  传统的设计流程里要用手工在两个阶段之间进行转换与衔接,这样容易出现错误而推迟产品的上市时间。本文介绍一种集成工具可以使设计与验证测试更加自动化,且具有更高效率,可减少产品缺陷。
  过去几年以来,产品与系统在软件方面的功能不断增强,高强度实时要求越来越多。对设计工程师而言,为与竞争对手展开竞赛,争取更快将新产品投向市场,高效系统开发方法成为重中之重,对开发数字信号处理器算法的工程师而言尤为如此。此外,产品开发周期和生命周期不断缩短等因素,也促使工程师和设计经理对开发方法和软件工具进程进行全面重新评估。
  产品漏洞会导致市场份额迅速下降,如果公司牺牲质量,那么其声誉会马上受到影响。产品工程师在实施由研发工程师设计的算法时,会遇到很多难题,其中之一就是将系统参数、测试向量以及其它数据从基于主机PC概念的开发工具用手工方式转向基于目标硬件的DSP代码开发工具。这种手工转化常常会造成错误,要在确认和测试中才能被发现,从而导致开发时间延长。市场调查显示,客户产品开发中常常有50%以上的时间是用于产品集成与测试。在这个阶段,省时的工具对产品功能可靠性、上市时间以及能否最终取得成功都有很大的影响。
  在今天市场环境下,要将工程师的开发流程从概念发展至算法并最终推出产品,传统的产品开发流程已显得力不从心,新开发流程需要广泛的工具集成,保证数据以及其它信息能够动态共享以实现更高的工作效率。
  传统DSP开发流程
  嵌入式DSP系统传统设计流程通常包括两个主要阶段,即概念到算法阶段(由研发小组实施,其中包括算法开发与系统设计)以及算法到产品阶段(由产品开发小组实施,该阶段包括实际产品实现、目标编程和测试),如图1所示。
  由于上面两个阶段常常是彼此独立的,并由不同的设计小组完成,而各小组的目标可能不一致,因此这种结构内部会有一些问题。此外,设计小组使用的工具还可能彼此不兼容,不能够整合在一起。
  在多数情况下,研发工程师使用数字计算环境,可充分发挥算法开发、分析以及各种科学、数学或工程应用可视化功能。研发工程师常常以M或C代码创建算法,也可以为其算法创建测试向量(通常是文本或二进制格式的数据文件)。他们随后会在主机PC上运行算法进行模拟,以便分析并使算法响应可视化,目标是确保算法不仅能够独立于特定的平台进行工作,还能独立于任何物理存储器、速度或实时限制工作。当他们希望将设计转给产品开发小组时,他们将提交书面规范或实际的C或M代码,并请开发小组就具体的DSP目标实施算法。
  在产品开发方面,大多数DSP工作小组都使用集成开发环境(IDE),小组的目标是使用书面的规范实施算法、测试算法,并在最终产品中进行确认,以保证其满足系统的实时、速度、功率及内存等限制条件。产品开发小组常常依靠手工方法从事上述任务,因为直接根据规范或算法测试向量进行产品测试通常没有便捷路径可循。在遇到复杂系统时,手动转换和确认会延缓产品开发,影响产品的成功。
  产品工程师为防止出现前后脱节而采取一些手工方法包括:
  1. 手工复制并粘贴M文件测试向量(如100个值的阵列)至IDE的C代码(或汇编)文件中。但是工程师必须注意,应复制所有数据不能遗漏,还必须添加正确的语法以保证兼容性(如逗号、方括号、圆括号等);
  2. 使用典型IDE中的“载入数据”命令手工从PC硬盘向DSP存储器载入整个数据文件。工程师必须注意应以人工方式或通过脚本(需要编写并调试)对数据进行重新格式化,以保证文件格式和随后的语法能够匹配;
  3. 可使用IDE的文件I/O功能(如fscanf()功能)以便以自动方式像上面第二种方法一样载入文件,但是有关文件格式与语法类型的问题仍然存在。传统文件I/O带来的另一大主要问题在于,工程师必须在DSP本身上面运行庞大而低效的C库,这将导致代码膨胀,不仅浪费内存,还会拖慢DSP的速度,使其丧失实时工作性能;
  4. 利用外部硬件生成信号作为系统的输入(如音乐或正弦波),以观察系统是否能够实时响应。与前面所说测试向量和数据已经数字化的情况不同,这里的数据是模拟的,必须通过A/D转换器,这就会带来更多的错误和不一致性,因为它不再是纯粹的数字信号,导致内在的模拟失真。此外还会带来额外的变量,造成更多不确定性,也使寻找问题根源更加困难重重。
  集成工具提高效率与生产率
  集成度更高的开发流程能以更动态的方式自动执行上述任务。
  我们不妨给出一个真实情况的例子,即在DSP上实施适应性噪声消除系统。设计第一步是设计一个适应性过滤器(即过滤器系数、过滤器响应等),开发工程师以通常采用的DSP算法设计和分析工具(诸如MathWorks公司提供的MATLAB)开发C代码,并在DSP上运行,而后综合输入信号并测试该过滤器的表现。
  通过将MATLAB与通用DSP IDE(如德州仪器的Code Composer Studio)进行集成,工程师可使用相同的前端工具在模拟环境下进行算法设计、可视化、分析与优化,随后在DSP目标上实施设计,对其再次运行,并采用模拟设计对实际结果进行比较。
  在我们给出的例子中,开发工程师可使用MATLAB直接访问DSP目标存储器,当DSP程序在目标上运行时对其进行控制,同时可以获得MATLAB的可视化、模拟和优化功能。该连接由高速实时双向数据通讯机制加以实现,如TI的高速实时数据交换(RTDX)。图2显示了MATLAB代码,展示了如何使用MATLAB对信号进行综合测试,通过RTDX实时连接可执行过滤器的DSP实施,并使结果可视化。
  运行于目标DSP上的算法接收噪声信号与白信号作为输入,并执行LMS算法消除噪声。图3显示了通过RTDX实时发回至MATLAB的DSP输出信号、过滤器阀(filter tap)和过滤器响应,这意味着代码执行时,我们在MATLAB中可以动态优化参数,适应性地调节过滤器,并运行蒙特卡洛模拟使结果可视化。在算法运行于DSP上的同时,用户还可以直接从MATLAB调用DSP上特定的函数,并以批处理模式或互动模式对其加以执行。
  因此,测试与验证小组可以使用原始的基于MATLAB的设计或规范,直接将其作为测试设置的一部分。测试小组再直接把实际系统输出与原始MATLAB设计生成的所希望的输出进行比较,并以此进行适当的实时改变。
  本文结论
  通过将研发小组与产品开发小组所用的工具进行集成,我们可以极大地提高生产率,从而使设计与验证测试不仅更加自动化,而且具有更高的效率。开发DSP算法以及在真实目标上对那些算法进行实施工作的设计小组毋需改变开发流程方法,即可采用与IDE以及硬件后端集成的设计环境前端。他们也可以自动实时地转移数据,以便更迅速高效地重复产品设计,而不会导致出现新的错误。
  设计与开发工具集成能够推动开发周期早期的测试与验证,从而帮助工程师以更高的效率确认并解决问题。工程师要以更快的速度构建并向市场推出新型具有更强大功能的DSP产品,最重要的是要保证减少产品缺陷,工具集成将为最终成功助一臂之力。
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'提高嵌入式DSP系统设计的集成工具',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);