求DSP学习建议

求DSP学习建议,第1张

有些资料可供你参考:

DSP的特点

对于没有使用过DSP的初学者来说,第一个困惑就是DSP其他的嵌入式处理器究竟有什么不同,它和单片机,ARM有什么区别事实上,DSP也是一种嵌入式处理器,它完全可以完成单片机的功能

唯一的重要的区别在于DSP支持单时钟周期的"乘-加"运算这几乎是所有厂家的DSP芯片的一个共有特征几乎所有的DSP处理器的指令集中都会有一条MAC指令,这条指令可以把两个 *** 作数从RAM中取出相乘,然后加到一个累加器中,所有这些 *** 作都在一个时钟周期内完成拥有这样一条指令的处理器就具备了

DSP功能

具有这条指令就称之为数字信号处理器的原因在于,所有的数字信号处理算法中最为常见的算术 *** 作就是"乘-加"这是因为数字信号处理中大量使用了内积,或称"点积"的运算无论是FIR滤波,FFT,信号相关,数字混频,下变频所有这些数字信号处理的运算经常是将输入信号与一个系数表或者与一个本地参考信号相乘然后积分(累加),这就表现为将两个向量(或称序列)进行点积,在编程上就变成将输入的采样放在一个循环buffer里,本地的系数表或参考信号也放在一个buffer里,然后使用两个指针指向这两个buffer这样就可以在一个loop里面使用一个MAC指令将二者进行点积运算这样的点积运算对与处理器来说是最快的,因为仅需一个始终周期就可以完成一次乘加

了解DSP的这一特点后,当我们设计一个嵌入式系统时,首先要考虑处理器所实现的算法中是否有点积运算

,即是否要经常进行两个数组的乘加,(记住数字滤波,相关等都表现为两个数组的点积)如果有的话,每秒要做多少次,这样就能够决定是否采用DSP,采用多高性能的DSP了

浮点与定点

浮点与定点也是经常是初学者困惑的问题,在选择DSP器件的时候,是采用浮点还是采用定点,如果用定点是16位还是32位其实这个问题和你的算法所要求的信号的动态范围有关

定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算

而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,

单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数

这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)2^127动态范围为20log(最大的数/最小的数)=16676dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20log(65536/1)=96dB对于32定点DSP,动态范围为20log(2^32/1)=192dB,远小于32位ieee浮点数的16676dB,但是,实际上192dB对绝大多数应用所处理的信号已经足够了

由于AD转换器的位数限制,一般输入信号的动态范围都比较小,但在DSP的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的DSP另外就是浮点的DSP更易于编程,定点DSP编程中程序员要不断调整中间结果的P,Q值,实际就是不断对中间结果进行移位调整和舍入

DSP与RTOS

TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基于各自DSP的嵌入式多任务内核DSP编程可以用单用C,也可以用汇编,或者二者结合,一般软件编译工具都提供了很好的支持我不想在这里多说BIOS,VDK怎么用这在相应的文档里说的很详细我想给初学者说说DSP的RTOS原理用短短几段话说这个复杂的东西也是挑战!^_^

其实DSP的RTOS和基于其他处理器的通用RTOS没什么大的区别,现在几乎人人皆知的uCOSii也很容易移植到DSP上来,只要把寄存器保存与恢复部分和堆栈部分改改就可以一般在用BIOS和VDK之前,先看看 *** 作系统原理的书比较好uCOS那本书也不错

BIOS和VDK其实是一个RTOS内核函数集,DSP的应用程序会和这些函数连接成一个可执行文件其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个scheduler函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行然后在此基础上写几个用于任务间通信的函数就可以了,比如event,message box,等等

RTOS一般采用抢先式的任务调度方式,举例说当任务A等待的资源available的时候,DSP会执行一个任务调度函数scheduler,这个函数会检查当前任务是否比任务A优先级低,如果是的话,就会把它当前挂起,然后把任务A保存在堆栈里寄存器值全部pop到DSP处理器中(这就是所谓的任务现场恢复)接着scheduler还会把从堆栈中取出任务A挂起时的程序执行的地址,pop到PC,使任务A继续执行这样当前任务就被任务A抢先了

使用RTOS之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,类似于C语言中的main函数一个任务创建的时候,RTOS会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS就会从其堆栈中d出其入口地址开始执行

有一个疑问是,不使用RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行那么,这种常用的方法与使用RTOS相比有什么区别呢其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个LED),只要他不主动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁LED的函数执行完毕这样就使整个DSP处理的优先次序十分不合理而在使用了RTOS之后,当一个重要的事件发生时,中断处理会进入RTOS,并调用scheduler,这时scheduler 会让处理这一事件的任务抢占DSP处理器(因为它的优先级高)而哪个闪烁LED任务即使晚执行几毫秒都没任何影响这样整个DSP的调度策略就十分合理

RTOS要说的内容太多,我只能讲一下自己的一点体会吧

DSP与正(余)弦波

在DSP的应用中,我们经常要用到三角函数,或者合成一个正(余)弦波这是因为我们喜欢把信号通过傅立叶变换映射到三角函数空间来理解信号的频率特性信号处理的一些计算技巧都需要在DSP软件中进行三角函数计算然而三角函数计算是非线性的计算,DSP并没有专门的指令来求一个数的正弦或余弦于是我们需要用线性方法来近似求解

一个直接的想法是用多项式拟合,这也正是大多数DSP C编译器提供正余弦库函数所采用的方法其原理是把三角函数向函数空间{1,x,x^2,x^3}上投影,从而获得一系列的系数,用这些系数就可以拟合出三角函数比如,我们在[0,pi/2]区间上拟合sin,只需在matlab中输入以下命令:

x=0:005:pi/2;

p=polyfit(x,sin(x),5)

就得到5阶的多项式系数:

p =

000581052047605 000580963216172 -017193865685360

000209002716293 099969270087312 000000809543448

于是在[0,pi/2]区间上:

sin(x)= 000000809543448+099969270087312x+ 000209002716293x^2-017193865685360x^3+

000580963216172x^4+000581052047605x^5

于是在DSP程序中,我们可以通过用乘加(MAC)指令计算这个多项式来近似求得sin(x)

当然如果用定点DSP还要把P这个多项式系数表用一定的Q值来改写成定点数

这样的三角函数计算一般都需要几十个cycle 的开销这对于某些场合是不能容忍的

另一种更快的方法是借助于查表,比如,我们将[0,pi/2]分成32个区间,每个区间长度就为pi/64,在每个区间上我们使用直线段拟合sin曲线,每个区间线段起点的正弦值和线段斜率事先算好,存在RAM里,这样就需要在在RAM里存储64个

常数:

32个起点的精确的正弦值(事先算好): s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)}

32个线段的斜率: f[32]={0049,}

对于输入的每一个x,先根据其大小找到所在区间i,通常x用定点表示,一般取其高几位就是系数i了,然 后通过下式即可求出sin(x):

sin(x)= sf

这样一般只需几个CYCLE就可以算出正弦值,如果需要更高的精度,可以将区间分得更细,当然,也就需 要更多的RAM去存储常数表

事实上,不仅三角函数,其他的各种非线性函数都是这样近似计算的

1. 接触DSP

在参加过一次社会上多的尽乎到了泛滥地步的"DSPxxx"培训班之后,我"自信"已经具备DSP工师资格,便欣喜若狂跑道书店买了一本名为"DSP xxx应用"的书,作者叫xxx,并且是这个领域的牛人,这本书确实是很出色的书籍但是当时,对于我这个对DSP一窍不通、刚刚入门的人来说却建立了一个错误的概念——DSP是个很容易的领域,只要培训一下,再稍微看看书,就可以成为专家所以,现在看来,这些都是误导,我认为学习DSP技术应该分为两个阶段,第一阶段学习DSP技术基础概念;第二阶段学习DSP技术的行业应用那本"DSP xxx应用"的书,它更适合书名应叫做"DSP中的数学或物理运用"什么的

2. 购买DSP学习套件

有了兴趣,就要去学习,于是我撺掇领导批准购买了DSP学习入门套件(DSK),许多公司均有销售,如TI等,大概是需要3000-4000人民币买后不久,我就发现,这种套件对于我来说一点用处都没有因为我的基础知识实在是太差了这些套件对于我来说,只是另一种涵义的PC机及一些外围设备,想要懂的这些东西,我就需要去读更多的相关书籍,这时,很难没有想要放弃的念头,我开始有点畏惧DSP这种技术,门槛太高了可是,我不能放弃,我已经投入了许多的金钱和时间,我不想丢掉这4000元钱,也不能对领导没有交待事实上,我没有想到,我将付出更多的钱和时间去学习

3. 再次参加培训班,再次购买DSP书籍

在我就感到了无助,困惑之际我又想到了放弃虽然我的数学还算不错,但其中遇到的一些问题在我思考后,还是无法解决,我越来越畏惧DSP了于是,我开始在"google"上搜索DSP培训相关的信息,终于发现闻亭公司"DSP培训中心"的教程和内容正是我一直寻找的东西也许是DSP技术对我的有着巨大的诱惑力,也许是我的之直着,我又一次勇敢的报名参加了培训32个课时之后,解决了我半年多来积累的很多粗浅的问题再翻开培训教材刚刚复读了第一章时,我想如果这本教材是我读到的第一本书,并且我没有花4000元买那个可的学习套件,我会毫不犹豫的投降,放弃学习DSP,但那个可的xxx作者,他的书怎么可以用作教学呀他的书虽然让我对DSP产生了浓厚的兴趣,却把我引到了一条艰难的路上,而且花了那么多的冤枉钱既然事已如此,我只有慢慢的去读这些书籍,在我读到教材的后面章节以后,我开始明白前面章节的内容,所以当你读书遇到不明白的时候,千万不要气馁有时,一个内容,可能需要读上几遍,才能明白,这比一开始的感觉要好的多了

4. 实验——至关重要的一步

现在,从你的架子上取下那套DSK,去尝试做一些小实验,我的第一个实验是"正弦发生器",这个实验比较简单,但是它也花费了我几周的时间去读大量的关于串口、编码、寄存器等的书并且进行大量的实验这个执行半小时的"正弦发生器",让我查阅了恨不得够组建一个图书馆的书籍,而且这个东西没有任何用途我是用汇编语言在54x中执行,这个实验让我很好的理解了什么是DSP,什么是McBSP, DMA, 等当然问题也同步产生了,我就又不得不做了许多的实验去验证我建议,在系统未定型之前,使用mathlab/simulink进行仿真,并且可以多实验几种芯片,这样可以让你明白更多的内容我觉得我就要成为一个真正的DSP工程师了,我度过了最困难的时期我觉得自己是个英雄,嘿嘿

5. 去寻找一份与DSP相关的工作,去当个DSP工程师

我希望困难已经过去,但这种愿望为时过早了在DSP的研究中,我还遇到了很多的困难,由于篇幅有限,我就不在进行描述了反正,如果想成为真正的DSP专家,就不要期望事情会变得容易有些DSP开发人员并不知道什么是真正的0和1,他们只会查阅各种参考书籍和参数表,我们并不提倡这种做法因为这些人选择了一种简单的做法,但是他们并不是真正的DSP开发人员他们只是编写一些他们不理解的代码,他们似乎在担当着一台"编码器"的角色

6. 总结

这篇文章只是我的一点感慨,可能并不是很适用现在的DSP开发工程师,因为,市面上已经有了供你学习的DSP教学套件,搭配了多种实验供你参考,轻松入门,如:闻亭公司的"大学实验箱"什么的这个实验箱提供了一个很好的实验环境,并且为初学的你设计了多种实验、教材,让你由浅入深的学习不会向我似的,绕一大圈才走到正确的路上另外,你也可以向他们的工程师咨询

DSP芯片的优点:

1、大规模集成性。

2、稳定性好,精度高。

3、可编程性。

4、高速性能。

5、可嵌入性。

6、接口和集成方便。

DSP芯片一般具有如下的一些主要特点:

(1) 在一个指令周期内可完成一次乘法和一次加法。

(2) 程序和数据空间分开,可以同时访问指令和数据。

(3) 片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问。

(4) 具有低开销或无开销循环及跳转的硬件支持。

(5) 快速的中断处理和硬件I/O支持。

(6) 具有在单周期内 *** 作的多个硬件地址产生器。

(7) 可以并行执行多个 *** 作。

(8) 支持流水线 *** 作,使取指、译码和执行等 *** 作可以重叠执行。

扩展资料

DSP芯片的应用

1、数字信号处理数字滤波器

数字滤波器的实用型式很多,大略可分为有限冲激响应型和无限冲激响应型两类,可用硬件和软件两种方式实现。

2、数字信号处理傅里叶变换

1965年JW库利和TW图基首先提出离散傅里叶变换的快速算法,简称快速傅里叶变换,以FFT表示。自有了快速算法以后,离散傅里叶变换的运算次数大为减少,使数字信号处理的实现成为可能。

3、数字信号处理谱分析

数字信号处理的应用领域十分广泛。就所获取信号的来源而言,有通信信号的处理,雷达信号的处理,遥感信号的处理,控制信号的处理,生物医学信号的处理,地球物理信号的处理,振动信号的处理等。

bootloader是dsp芯片上固化的一段引导程序,dsp程序在ram上掉电易丢,所以启动时运行bootloader将辅存中的程序调入ram中

至于dsp的框架结构在ti公司有(有点复杂),开发时通常是先在开发板上仿真然后实践,由于dsp一般用于数字信号处理,离不开matlab软件连调。说起来有点复杂,要熟悉dsp开发流程序最简单的方法就是自己动手实践一下,如做个滤波器,频谱分析器等就可以深刻了解了。

ps有点繁琐,自己慢慢体会!

在现有的硬件基础上开发DSP软件大体步骤如下:

一、准备阶段

1、分析开发项目需求,即软件所需要具备的功能,如AD采样、通讯、外设控制等等;

2、了解硬件平台资源,如硬件存储器资源、外设IO资源、通讯接口等等,为DSP的初始化工作做准备的;

3、结合硬件资源和需求制定一个可行的软件方案;

二、代码编写阶段

代码编写因人而异,大体步骤:

1、搭建文件框架,一般一种功能对应一个C文件和H文件,根据11软件需求来;(特别提醒不要把所有代码都放在一个或几个文件里,不然哪怕注释得再清楚,在后期的调试和维护时都很费劲)

2、搭建函数框架,文件搭好后,在对应的文件中添加对应的功能函数,函数只需要定义函数名即可,如VoidSystemInit(){;};

3、函数框架也搭好后就可以开始添加代码了,首先是添加DSP器件相关程序,比如系统时钟配置,中断函数;I/O功能脚配置等;其次逐块添加算法代码,原则是从易到难,每个函数框架代码搭建完后最好都进行测试。

三、调试优化阶段

以上一块块功能测试正常后,就可以开始整体测试了,直至最终调试完成。

以上就是关于求DSP学习建议全部的内容,包括:求DSP学习建议、DSP芯片的优点与特点是什么、DSP的开发流程是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10630764.html

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

发表评论

登录后才能评论

评论列表(0条)

保存