DSP学习入门:
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的调度策略就十分合理。
目前好像还没有,DSP片子里都会有专用乘法器,甚至有的片子里有两个,
而且单周期就可以完成一到两次乘加运算。
除法运算需要转换为乘法运算,需要很多周期来完成,
所以在DSP编程的时候尽量避免除法运算。
比浮点慢,还用它干嘛啊 没有意义,我定点化的目的,就是想让速度提升的啊这种基础算法,你能想到的优化别人肯定都想过,如果没有广泛传播开来的话说明这办法本身优化不了多少甚至更慢。整数FFT最大的问题是必须要有取模运算。取模一下子就比浮点加乘要慢很多了。 定点的话,如果没有硬件支持,肯定要比有硬件支持的浮点加乘要慢。现在浮点加法乘法的速度又不比整数差多少。定点对于FFT的实际意义并不大,却又要牺牲精度。所以一般没人这么干。
4us乘法/除法指令是指一种用于数字信号处理器(DSP)中的指令。其中,“4us”表示该指令执行时间为4个时钟周期。这个指令可以用于执行乘法和除法 *** 作,用于实现数字信号处理算法中的复杂运算。
具体来说,4us乘法/除法指令可以在DSP中执行一次32位的乘法或除法运算,并将结果存储在一个32位的寄存器中。由于它的执行时间非常短,因此可以在实时应用中使用,如音频处理、视频编码和解码等。
需要注意的是,由于这是一种特定于DSP的指令,因此只能在支持该指令的DSP芯片上使用。
基于DCT变换的图像压缩编码方法中,对DCT系数必须做量化处理。量化过程是一个多对一的映射,例如对一个8×8块的64个DCT变换系数分别除以量化步长后取整。由于大多数DCT变换系数量化后变为零,因而达到压缩的目的。由于在量化过程中用到除法,因此通常需要进行浮点运算。
但是,可进行浮点运算的数字信号处理器(DSP)芯片结构比定点DSP芯片复杂,价格一般也比定点DSP芯片高很多。所以数字图像处理系统中通常采用定点DSP芯片来完成图像压缩运算,这种方法已经成为数字图像处理技术的的一个趋势。
可用于数字图像处理的比较好的定点DSP芯片有德州仪器公司新一代高性能定点DSP芯片TMS320C6200系列。它具有VLIW(Very Long Instruction Word)结构,由8个可并行运行的执行单元构成。这些单元使得该系列芯片在单周期内可以并行执行多条指令,例如在单周期内并行完成2个16位×16位乘法和2个移位 *** 作。它还具有流水线结构,使得若干条指令的不同执行阶段可以并行执行。这些设计使得TMS320C6200系列芯片程序执行速度更快、性能更高。如200MHx时钟的TMS320C6201峰值性能可以达到1600MIPS。
在定点DSP上完成除法,通常的办法是调用库函数。但是调用库函数,势必会打破循环中的流水线 *** 作,严重影响量化的完成速度。所以提高量化过程速度的关键就在于避免任何函数调用、跳转等 *** 作。
本文以TMS320C6200系列定点DSP为例,提出一种用定点乘法和移位运算来代替量化过程中除法和饱和运算的方法,从而极大地提高了量化过程的运行速度。该方法也同样适用于其它各种定点微处理器。
1 MPEG-4标准中采用的量化技术及程序优化
MPEG-4标准中定义了两种量化方式:H263量化方式和MPEG-4量化方式。这里为简单起见,只介绍TMN20编码器所用到的一种量化策略:AC系数和帧间宏块的DC系数用H263量化方式,而帧内宏块的DC系数用MPEG-4量化方式中的DC系数非线性量化方式。
11 H263量化方式
量化参数QP可以取值[1,3],量化步长为2QP。则量化公式为:
对于帧内宏块,LEVEL= COF /(2QP)
对于帧间宏块,LEVEL=( COF -QP/2)/(2QP)式中,COF表示即将被量化的DCT变换系数,LEVEL表示量化结果的绝对值。
12 MPEG-4DC系数非线性量化方法
量化公式为:LEVEL=DC_COF//dc_scaler
式中,DC_COF表示即将被量化的DCT变换DC系数;LEVEL表示量化结果;//表示先进行除法运算,然后对结果四舍五入取整。
在内部宏块内,定义亮度块为类型 1块,色差块为类型2块,类型1块的C系数由类型1的非线性标尺量化;类型2的DC系数由类型2的非线性标尺量化。
表1为定义DC非线性量化标尺dc_scaler。
表1 帧内宏块DC系数标尺
类 型 量化参数(QP)范围内的dc_scaler
1~4 5~8 9~24 25~31
亮度:Type1 8 2QP QP+8 2QP-16
色度:Type2 8 (QP+12)/2 QP-6
从表1中可以看到亮度块和色差块的DC系数有独立的量化标尺,亮度块具有较大的标尺而色度块具有较小的标尺。这种分段线性的非线性量化策略是一种高效的量化方式,它在保证图像质量的基础上提高了压缩效率。
13 将量化除法改定点乘法的方式
以内部宏块的AC系数量化公式为例,将其改写为:
LEVEL= COF /2QP= COF (2 n/2QP)/2 n
定义量化参数ac_cocff=[2n/2QP],[x]表示对x截尾取整,则:
LEVEL= COF ×ac_coeff/2n
在QP的取值都范围[1,31]内,要使截尾取整后的每一个2 n/2QP的值都能够用量化参数ac_coeff一一对应地表示,n必须足够大。通过计算得出:当n≥11时满足要求。
取n=11得到ac_coeff的计算公式为:
ac_coeff=[2 11/2QP]
其实质就是用一个字(32 bit)的低11位(0Q11)来表示1/2QP的小数部分。
由于QP在[1,31]之间,可以用上述公式计算出对应于帧内宏块AC系数量化的量化系数的查找表:ac_coeff=AcQConff[QP]。用C语言表示为(假设QP=0时ac_coeff=0):
const short int AcQConeff[32]=
{0x000,0x400,0x200,0x155,0x100,0x0cc,0a,0x092,
0x080,0x071,0x066,0x05d,0x055,0x04e,0x049,0x044,
0x040,0x03c,0x038,0x035,0x033,0x030,0x02e,0x02c,
0x02a,0x028,0x027,0x025,0x024,0x023,0x022,0x021};
计算表明,AC系数量化系数、亮度块DC系数量化系数和色差块DC量化系数都可以统一用一个字的低11位(0Q11)来表示。这样就可以分别计算出它们的量化系数的查找表,从而实现用乘法运算代替除法运算。
而除以2 n的 *** 作可以用右移n位的办法来完成。
对于8bit无符号二进制数表示的象素值,在经过DCT变换后,其DCT变换系数的值域为[-2048,2047],最大有12位二进制数。同时,由上述分析可知量化系数最大有11位。所以DCT变换系数与量化系数相乘的结果最大将有11+12共23位。由于TMS320C62xDSP芯片中集成的乘法器是16位×16位的乘法器,乘法运算结果存放到32位的寄存器中。所以用本文方法计算出的量化系数与DCT变换系数相乘后,结果不会溢出。
根据MPEG-4 Visual标准TMN 20的要求,量化后AC系数值要饱和到[-2048,2047]之间。这可以利用TMS320C62x芯片指令集中的饱和左移指令SSHL来实现,只需两条指令即可完成饱和运算,无需使用比较指令和跳转指令。
下面给出内部宏块量化的TMS320C62x线性汇编程序:
cmpeq type,1 //type定义的是当前块的类型
[type] ldh +DcLumQCoeff[QP],dc_coeff //得到类型1的DC系数的量化参数
[!type] ldh +DcChromQCoeff[QP],dc_coeff //得到类型2的DC系数的量化参数
lde coeff[0],level //取出DCT变换DC系数
mpy level,dc_coeff,level //用乘法进行量化
addk 0x400,level //加 0x400,对结果进行四舍五入
shr level,11,level //右移11位
cmpgt level,maxDC,tmp //对量化后的DC系数进行饱和运算
[tmp] mv maxDC,level //将其限制在[1,maxDC]之间cmplt level,1,tmp
[tmp] mvk 1,level
ldh +AcQcoeff[QP],ac_coeff //得到AC系数的量化参数
mvk 63,cntr //63次循环,只对AC系数进行量化
loop: trip 63 ldh coeff++[1],cof //取出DCT变换AC系数
abs cof,level
mpy level,ac_coeff,level //对AC系数绝对值用乘法进行量化
shru level,11,level //右移11位
cmplt cof,0,tmp
[tmp] neg level,result
[!tmp] mv level,result
sshl result,20,result //将量化后的AC系数值进行饱和运算,
shru result,20,result //将结果限制在[-2048,2047]之间
sth result,qcoeff++[1]
[cntr] sub cntr,1,cotr
[cntr] b loop
由该程序可以看到,程序中没有任何会影响流水线的的跳转语句及函数调用。因此将该程序编译后会发现,此循环被优化构成软件流水。如果再使用其它一些优化手段,比如合并程序中的移位指令,合作字访问指令一次处理两个短型数据等,该程序的效率将会更高。我们用TMS320C62x软件仿真器测试表明,原来使用除法的量化函数需要4871个周期,而运用上述优化办法进行优化后的量化函数只需275个周期即可完成,效率提高约18倍。
DCT/IDCT变换及量化过程是视频图像压缩系统中的关键模块。该模块的执行速率对整个系统的处理流度影响很大,因此将量化过程中的浮点运算转换为定点运行,提高该模块在定点DSP芯片上的执行速度,其意义显得尤为重要。同时由于目前绝大多数数字通讯系统都基于定点DSP芯片,如果用定点芯片完成视频图像处理将会有易于与数字通讯系统集成的优点。我们的这一方法为在定点芯片上完成图像处理进行了有益的尝试,为后续的研发工作打下了一个良好的基础。
以上就是关于DSP学习入门全部的内容,包括:DSP学习入门、dsp 有除法器吗、大家觉得dsp算法定点化难不难啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)