EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 863|回复: 0

[资源共享] dsp入门,经验

[复制链接]

10

主题

0

回帖

25

E币

技术员

Rank: 2

积分
20
发表于 2016-12-27 10:49:20 | 显示全部楼层 |阅读模式
作者:王彦
许久许久没有这么安静下来写点东西了,最近特别有功夫,就回忆了一下学习DSP的整个过程,我算不上会DSP只是在认真的学习罢了,我想时常有空就把我学习DSP的心得写下来,以作将来自己的一份回忆,也许无什么大的价值供大家参考,我还是会认真虚心的去写下去。
我学DSP有半年多了吧,还是不是很懂整个奥妙的专业,也许台深了也许我的知识储备还是不够吧,学习起来也说不上吃力,但还是不是那么明朗的感觉。闲话就不多说了,我们说正题吧,学DSP其实是我的一个同学给我引的路,他是做ARM的对这个方面多少有点了解,就推荐我学DSP,在大三的暑假快结束的时候就引我见了一个导师,在DSP方面做过研究我就跟着老师学习,开始嘛自己不是了解,老师就推荐我先看TI的54系列的手册,我用了一个暑假认真的看,做了至少一本的笔记,感觉还是不够,但想想那本书其实还真的很有用的,我到显示还时常在那时做的笔记中去查找一些东西。
要说学DSP我不得不说一本学DSP人很多都了解的一本书,程佩青的《数字信号处理》,初学DSP不看这本书也许会走些弯路吧,这本书讲了很多基础的数字信号处理的知识,我现在不管在哪都会带上这本书,为什么呢?这本书讲了很多基础知识,算法从何而来,就是从那些传递函数,从那些模拟向数字转换的推导再经过MATLAB做以处理,就会得到DSP的一些算法的数据,说的是很简单,我们大家都有这样的经历吧,别人给你好的路让你去走你会觉得没什么难的,等叫你自己去走一条别人没有告诉你的路的时候我们就知道自己的问题很多了,所以这条路不是说的那么简单。但我想数学好的人在这方面可能会少走一些弯路,我用了一个暑假看TI手册和数字信号处理,反正到现在还是不能说自己都懂,我只认为自己都了解一点皮毛而已。到了大四开学,我就去实验室做DSP的实验,没什么难的都是按实验书的步骤往下走就会完成预订的目标,大概用了一个星期做完了这些。在接下来的日子感觉有点漂浮了,呵呵。导师就给了我一个新的任务,把我做的DSP的实验的程序不管是C语言的还是汇编的都“翻译”出来,这个可够我呛的了,学C的时候还学了点大概就跟看英语一样还能马马虎虎看下去,可汇编啊,我的天哪,学单片机和微机原理的汇编时候就没怎么学,谈汇编色变啊。没办法,自己想学就只有拿一本写有指令集的书一个对着一个慢慢的看,终于用了快一个月的时间完了。松了一口气,可后面的路还厂呢,岂是这些就足矣的,在后面学习CMD文件。。。。。就是关于CCS的一些知识,到此还是只会在试验箱上跑现成的程序,自己下的程序都还不会在试验箱上运行,怎么办呢?不跑怎么知道自己下的程序是不是可以通过运行呢?就找导师教我,先将CMD文件的后缀改为CMD这样就变成了CMD文件了,在CCS中先建一个工程文件,随便你想放哪都可以,但最好要有一个文件夹,建完了就在ADD(在工程文件的下拉目录下点右键)加C文件,要是有汇编的话还要加汇编的文件,加了C语言就要加编译器,将C转换为汇编语言,当然这是机子自身的运行步骤不是我们考虑的我们只要把转换器加载进去就OK了,这个也是在右键ADD加载了,最后还有一点重要的别忘了,CMD文件还没加呢,这些做完了可以用CCS上的检验功能检验,无错的话可以生成OUT文件,这个就是运行的执行文件,大家有一点需要注意的,有时一些参数需要修改的在DEBUG中,依自己需要修改,这个现在还不是太明白,以后弄懂了在后续文章中写出来。运行OUT文件,就要在LODE中加入这个OUT文件再运行就可以了,可以在视窗中改些参数看到自己想要得到的图形等。
以上些的比较杂,我现在在看MATLAB在数字信号处理中的应用,我想DSP就是做算法最难,而MATLAB是做算法实现的工具,所以就抽些时间集中把MATLAB看下,DSP也不是传说中的那么难我们只要有信心多看多做一定可以做的很好的。好了,今天就先写这么多吧,以后在写。这个博客中的一些文章是我转载的,希望对大家有用,我以后也会尽量加些自己写的文章。欢迎大家常来看看,支持小弟。
要学好DSP我们有不能忽视的三门基础先修课程:信号与系统,数字信号处理和微机(单片机)。这三门课是学DSP的基础,要想做好DSP我们要做到硬件和软件的结合,还要会设计系统,那么问题来了,硬件和软件的结合必然要求对基础知识有深刻的理解和认识(这里系统的设计我们在后面谈)。

那先说下信号与系统,信号与系统的核心思想是什么呢?就是把复杂的信号给分解了,分解成简单的信号分解成我们可以容易下手的处理的简单信号,再通过一个系统或者若干得到响应,最后将这些若干响应用同样组合的方式组合起来送到输出端,结果就会得到我们的系统响应。细点说,时域分析,时域分析是把信号分解后分别乘上单位冲击响应(即把信号分别通过单位系统),再把得到的响应累加求和就会得到时域的响应(单位冲击响应移位加权和),为什么说是累加求和呢?线性积分就是求和很多因子的求和这里也是同样的道理。再说频域分析,频域分析是把信号分解成若干不同频率的正弦信号再通过系统然后累加求和。思路跟上面一样,总的来说信号与系统的思想就是把复杂的信号分解成简单的信号,分别通过系统,但后累加求和(积分)得到我们需要的响应。说到信号与系统不能不提到傅立叶变换,傅立叶变换是信号与系统的工具,通过它才可以得到系统变换,下面几个需要记下,正余弦函数的指数表示,欧拉公式(重点),周期函数的傅立叶级数的展开,傅立叶变换对,一些常用函数的傅立叶变换需要记住(正余弦,指数,常数,冲击响应,,,,),单位冲击序列的傅立叶变换尤其需要记住这是DSP后面处理函数的核心内容,F[δ(t-nT)]=w。Σn=-δ(w-w。)=w。δw。(w).
这里说下数字信号处理,数字信号处理主要处理的是离散信号,离散时间信号尽管在时间上是离散的,但在幅度上仍然是连续变化的,因此仍然是模拟信号,只有经过量化器,也就是将各离散时间点上的信号幅度归并到有限的若干个电平上,并用数字来表示时,才称其为数字信号(digital signal).实际上,任何序列都可以表示成δ[n]的移位加权和,这是一个非常重要的概念,因为我们在讨论信号通过系统的时候,只需要讨论单位数字冲激通过系统的响应,即单位冲激响应,然后将系统对各移位的冲击的响应叠加,就得到系统的输出。这个思想和信号与系统的处理思想是一样的,整个一部信号与系统的理论就是建立在对信号的不同形式分解,然后再综合的基础上的。数字信号处理中有两个比较重要也比较基础的冲激响应系统:有限冲激响应系统(FIR,Finite Impulse Response);无限冲激响应系统(IIR, Infinite Impulse Response);也有两个比较基础的变换:Z变换和傅立叶变换。

下面是时域和频域的对应:

时域的连续非周期信号←→频域连续非周期谱(FT)

时域的周期信号
←→频域离散谱(FST)

时域的离散信号
←→频域周期谱(DTFT)

时域的离散周期信号
←→频域离散周期谱(DFT)

在DFT中,变换的两边都是离散的,从而才是真正能用计算机来做数字信号处理的变换对。两边都是周期的,从而处理可以只在一个周期内进行,这有两个重要的意义,一是所做的处理是有限的(这对计算机来说是必须的);二是只在一个周期内就可以保留全部的信息(这对准确的处理来说是必须的);

在现实工程中我们遇到的信号往往是连续的非周期的,为了进行DFT,就必须将其离散(抽样)周期化(周期延拓)。

在信号的采样的时候要遵循奈奎斯特准则,奈奎斯特抽样频率fS=1/T=2fm(即不失真的最低采样频率);奈奎斯特抽样间隔T=1/2fm(即不失真的最大采样间隔),由于理想低通滤波器是不可实现的,所以实际上的低通滤波器都有上升时间和下降时间,因此工程上往往采用fS›2.5~3 fm.采样后的信号,时间上是离散的,但幅度仍然是连续的,还不是真正的数字信号,必须对其幅度做量化,即将离散时间点上的幅度归入有限数目的等级。

关于微机原理的知识自己学的不是太好,也不知道怎么说起就不说了。我想还是多看看书会有帮助的。
前面(一)说了截至到现在我的大概学习过程,(二)说了信号与系统,数字信号处理的知识。这个篇章我想说说DSP的硬件结构。DSP的硬件和软件以及系统设计称为DSP的三大部分,我觉得这部分内容还是比较有用的。
说DSP的硬件结构不得不说起它的CPU结构,世界上的CPU结构从上个世纪四十年代起CPU发展的时候就分为两大种类,一种是冯•••诺依曼结构(Von Neuman);另一种是哈佛结构(Harvard);冯•••诺依曼结构主要用于通用的处理器中,而哈佛结构主要用于DSP处理器中。两个结构的构成见下图(1):
从上图可以显而易见的看出哈佛结构可以做并行处理,可以减少处理时间。
有两中指标可以表示处理器的处理速度:MIPS与MFLOPS。
MIPS--(million instruction per second),每秒百万次运算
MFLOPS――(million floating operation per second),浮点运算多少次每秒
现在市面上32的处理器可以达到90亿次浮点运算/秒(9000MFLOPS)
DSP的处理器可以进行流水作业(pipeline),一个数据从取指到存储需要经过取指,译码,寻址,取数,运算,存储这六个步骤,流水作业可以让他们在单周内完成,怎么讲呢?举个例子就是说DSP处理器进行的是并行的处理,可以在一个周期内同时进行第一条数据的寻址,第二条数据的译码,第三条数据的取指,依次类推理解这个概念就不难了。这里需要理解的是单周期,不说说一个数据可以在一个周期内进行完所有的步骤而是一个相对概念,可以一个周期内同时处理不同数据的不同步骤。
DSP处理器中用两个通用处理器没有的东西,是什么呢?1,独立的硬件乘法器:在卷积,数字滤波,FFT,相关,矩阵运算等算法中都有ΣA(k)B(n-k)一类的运算大量的重复乘法和累加。通用计算机的乘法是用软件实现的,当然需要若干个周期;DSP用硬件乘法器,用MAC指令(取数,乘法,累加)在单周期内完成。2,独立的DMA总线与控制器:当然通用的计算机中也有DMA也不占用CPU资源但它是公用的不是独立的。取数是从总线上取的是从存储器中取的,虽然现在的时钟频率很高,但你要从总线上取数就要占用总线的时间,CPU的数据也是从总线上收发的,总线的时间占用了CPU只能暂时的挂起,等于变相的占用了CPU的资源。运算速度的快满取决于数据的吞吐量,有了硬件乘法器和独立的DMA总线与控制器,可想了DSP的处理速度会加快很多。有一组或多组独立的DMA总线与CPU的程序,数据总线并行处理,在不影响CPU工作的条件下,DMA目前已达到800Mbyte/s。
在CPU方面DSP的CPU与通用的CPU也有着不同的方面,通用的CPU由ALU(算术逻辑单元)与CU(控制逻辑单元)组成,通过软件实现;DSP的CPU设有独立的硬件乘法器,可在单周期内完成乘法运算。
硬件电路图中的MUX是多路器,可以理解为一个选择开关,选取多路中的一个数据输出。
我们在说DSP的硬件结构,关于浮点与定点是不得不说的。DSP分为定点和浮点两种,那种更好无法说,因为看你怎么用,用在什么方面,适合的永远是最好的。浮点格式是用指数形式表示的,其动态范围要比定点的要大的多,定点的DSP经常需要考虑溢出的问题,浮点DSP中基本上可以不考虑这个问题。为了保证底数的精度,假如浮点DSP做成32BIT的那么总线,寄存器,存储器等的宽度也相应的是32BIT的。在处理数据方面浮点的DSP速度更快一些,尤其在做浮点运算的时候,为什么呢?因为它就是为浮点运算所做的,当然了浮点的DSP价格也高一些,开发难度也大一些。
DSP将来发展的趋势,更高的运行速度和信号处理速度,多DSP协同工作,更方便的开发环境,更多的专用DSP,价格更低,性能更高,应用更广泛。

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-26 05:31 , Processed in 0.040911 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表