目录:
第一章:第二代及以后的GPU工作流程简介

第二章:DirectX8和DirectX9 GPU的传统流水线
第三章:顶点和像素操作指令
第四章:传统GPU指令的执行
第五章:统一渲染架构
第六章:G80和R600的统一渲染架构实现
第七章:G80与R600效能对比
第八章:尴尬的中端--Geforce8600简析
前面4章 我将先简要介绍下DirectX8/9显卡的核心----图形处理单元GPU的工作流程和指令处理情况
从第5章开始讨论统一渲染架构、新一代DirectX10 GPU的特性,G80/Geforce8800与R600/RadeonHD2900XT的架构具体实现及其区别。最后将会对中端最受关注的Geforce8600进行相应的简单分析。
第一章:第二代及以后的GPU工作流程简介
简单(而不一定绝对科学)的说:GPU主要完成对3D图形的处理--图形的生成渲染。
GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序)
顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。
光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。
像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。
最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
第二章:DirectX8和DirectX9 GPU的传统流水线
前面的工作流程其实已经说明了问题。本章来总结一下,承前启后。
传统的GPU功能部件我们不妨将其分为顶点单元和像素流水线两部分。
顶点单元由数个硬件实现的Vertex Shader组成。
传统的像素流水线由几组PSU(Pixel Shader Unit)+TMU+ROP组成。
于是,传统的GPU由顶点单元生成多边形,并由像素流水线负责像素渲染和输出。
对于像素流水线需要做的说明是:虽然传统的流水线被认为=1PSU+1TMU+1ROP,但这个比例不是恒定的,例如在RadeonX1000(不包括X1800)系列中被广为称道的3:1黄金架构,PSU:TMU:ROP的数量为3:1:1。一块典型的X1900显卡具有48个PSU,16个TMU和16个ROP。之所以采用这种设计方法,主要考虑到在当今的游戏中,像素指令数要远远大于纹理指令的数量。ATI凭借这个优秀的架构,成功击败了Geforce7,在DX9后期取得了3D效能上的领先。
总结:传统的GPU由顶点单元生成多边形,像素流水线渲染像素并输出,一条像素流水线包含PSU,TMU,和ROP(有的资料中不包含ROP),比例通常为1:1:1,但不固定。
第三章:顶点和像素操作指令
GPU通过执行相应的指令来完成对顶点和像素的操作。
熟悉OpenGL或Direct3D编程的人应该知道,像素通常使用RGB三原色和alpha值共4个通道(属性)来描述。而对于顶点,也通常使用XYZ和W 4个通道(属性)来描述。因而,通常执行一条顶点和像素指令需要完成4次计算,我们这里成这种指令为4D矢量指令(4维)。当然,并不是所有的指令都是4D指令,在实际处理中,还会出现大量的1D标量指令以及2D,3D指令。
总结:由于定点和像素通常用4元组表示属性,因而顶点和像素操作通常是4D矢量操作,但也存在标量操作。
第四章:传统GPU指令的执行
传统的GPU基于SIMD的架构。SIMD即Single Instruction Multiple Data,单指令多数据。
其实这很好理解,传统的VS和PS中的ALU(算术逻辑单元,通常每个VS或PS中都会有一个ALU,但这不是一定的,例如G70和R5XX有两个)都能够在一个周期内(即同时)完成对矢量4个通道的运算。比如执行一条4D指令,PS或VS中的ALU对指令对应定点和像素的4个属性数据都进行了相应的计算。这便是SIMD的由来。这种ALU我们暂且称它为4D ALU。
需要注意的是,4D SIMD架构虽然很适合处理4D指令,但遇到1D指令的时候效率便会降为原来的1/4。此时ALU 3/4的资源都被闲置。为了提高PS VS执行1D 2D 3D指令时的资源利用率,DirectX9时代的GPU通常采用1D+3D或2D+2D ALU。这便是Co-issue技术。这种ALU对4D指令的计算时仍然效能与传统的ALU相同,但当遇到1D 2D 3D指令时效率则会高不少,例如如下指令:
ADD R0.xyz , R0,R1 //此指令是将R0,R1矢量的x,y,z值相加 结果赋值给R0
ADD R3.x , R2,R3 //此指令是将R2 R3矢量的w值相加 结果赋值给R3
对于传统的4D ALU,显然需要两个周期才能完成,第一个周期ALU利用率75% ,第二个周期利用率25%。而对于1D+3D的ALU,这两条指令可以融合为一条4D指令,因而只需要一个周期便可以完成,ALU利用率100%。
但当然,即使采用co-issue,ALU利用率也不可能总达到100%,这涉及到指令并行的相关性等问题,而且,更直观的,上述两条指令显然不能被2D+2D ALU一周期完成,而且同样,两条2D指令也不能被1D+3D ALU一周期完成。传统GPU在对非4D指令的处理显然不是很灵活。
总结:传统的GPU中定点和像素处理分别由VS和PS来完成,每个VS PS单元中通常有一个4D ALU,可以在一个周期完成4D矢量操作,但这种ALU对1D 2D 3D操作效率低下,为了弥补,DX9显卡中ALU常被设置为1D+3D 2D+2D等形式。
第五章:统一渲染架构
相对于DirectX 9来说,最新的DirectX 10最大的改进在于提出了统一渲染架构,即Unified Shader。
传统的显卡GPU一直采用分离式架构,顶点处理和像素处理分别由Vertex Shader和Pixel Shader来完成,于是,当GPU核心设计完成时,PS和VS的数量便确定下来了。但是不同的游戏对于两者处理量需求是不同的,这种固定比例的PS VS设计显然不够灵活,为了解决这个问题,DirectX10规范中提出了了统一渲染架构。
不论是顶点数据还是像素数据,他们在计算上都有很多共同点,例如通常情况下,他们都是4D矢量,而且在ALU中的计算都是没有分别的浮点运算。这些为统一渲染的实现提供了可能。
在统一渲染架构中,PS单元和VS单元都被通用的US单元所取代,nVidia的实现中称其为streaming processer,即流处理器,这种US单元既可以处理顶点数据,又可以处理像素数据,因而GPU可以根据实际处理需求进行灵活的分配,这样便有效避免了传统分离式架构中VS和PS工作量不均的情况。
总结:统一渲染架构使用US(通常为SP)单元取代了传统的固定数目的VS和PS单元,US既可以完成顶点操作,又可以完成像素操作,因而可以根据游戏需要灵活分配,从而提高了资源利用率。
第六章:G80和R600的统一渲染架构实现
以下我们着重讨论G80和R600的统一着色单元而不考虑纹理单元,ROP等因素。
G80 GPU中安排了16组共128个统一标量着色器,被叫做stream processors,后面我们将其简称为SP。每个SP都包含有一个全功能的1D ALU。该ALU可以在一周期内完成乘加操作(MADD)。
也许有人已经注意到了,在前面传统GPU中VS和PS的ALU都是4D的,但在这里,每个SP中的ALU都是1D标量ALU。没错,这就是很多资料中提及的MIMD(多指令多数据)架构,G80走的是彻底的标量化路线,将ALU拆分为了最基本的1D 标量ALU,并实现了128个1D标量SP,于是,传统GPU中一个周期完成的4D矢量操作,在这种标量SP中需4个周期才能完成,或者说,1个4D操作需要4个SP并行处理完成。
这种实现的最大好处是灵活,不论是1D,2D,3D,4D指令,G80得便宜其全部将其拆成1D指令来处理。指令其实与矢量运算拆分一样。
例如一个4D矢量指令 ADD R0.xyzw , R0,R1 R0与R1矢量相加,结果赋R0
G80的编译器会将其拆分为4个1D标量运算指令并将其分派给4个SP:
ADD R0.x , R0,R1
ADD R0.y , R0,R1
ADD R0.z , R0,R1
ADD R0.w, R0,R1
综上:G80的架构可以用128X1D来描述。
R600的实现方式则与G80有很大的不同,它仍然采用SIMD架构。
在R600的核心里,共设计了4组共64个流处理器,但每个处理器中拥有1个5D ALU,其实更加准确地说,应该是5个1D ALU。因为每个流处理器中的ALU可以任意以1+1+1+1+1或1+4或2+3等方式搭配(以往的GPU往往只能是1D+3D或2D+2D)。ATI将这些ALU称作streaming processing unit,因而,ATI宣称R600拥有320个SPU。
我们考虑R600的每个流处理器,它每个周期只能执行一条指令,但是流处理器中却拥有5个1D ALU。ATI为了提高ALU利用率,采用了VLIW体系(Very Large Instruction Word)设计。将多个短指令合并成为一组长的指令交给流处理器去执行。例如,R600可以5条1D指令合并为一组5DVLIW指令。
对于下述指令:
ADD R0.xyz , R0,R1 //3D
ADD R4.x , R4,R5 //1D
ADD R2.x , R2,R3 //1D
R600也可以将其集成为一条VLIW指令在一个周期完成。
综上:R600的架构可以用64X5D的方式来描述。
总结:G80将操作彻底标量化,内置128个1D标量SP,每个SP中有一个1D ALU,每周期处理一个1D操作,对于4D矢量操作,则将其拆分为4个1D标量操作。
R600仍采用SIMD架构,拥有64个SP,每个SP中有5个1D ALU,因而通常声称R600有320个PSU,
每个SP只能处理一条指令,ATI采用VLIW体系将短指令集成为长的VLIW指令来提高资源利用率,例如5条1D标量指令可以被集成为一条VLIW指令送入SP中在一个周期完成。
第七章:G80与R600效能对比
从前一章的讨论可以看出,R600的ALU规模64X5D=320明显比G80的128X1D=128要大,但是为何在实际的测试中,基于R600的RadeonHD2900XT并没有取得对G80/Geforce8800GTX的性能优势?本章将试图从两者流处理器设计差别上来寻找答案,对于纹理单元,ROP,显存带宽则不做重点讨论。事实上,R600的显存带宽也要大于G80。
我们将从频率和执行效能两个方面来说明问题:
1、频率:G80只拥有128个1D流处理器,在规模上处于绝对劣势,于是nVidia采用了shader频率与核心频率异步的方式来提高性能。Geforce8800GTX虽然核心频率只有575MHZ,但shader频率却高达1375MHZ,即SP工作频率为核心频率的两倍以上,而R600则相对保守地采用了shader和核心同步的方式,在RadeonHD2900XT中,两者均为740MHZ。这样一来,G80的shader频率几乎是R600的两倍,于是就相当于同频率下G80的SP数加倍达到256个,与R600的320个接近了很多。在处理乘加(MADD)指令的时候,740MHZ的R600的理论峰值浮点运算速度为:740MHZ*64*5*2=473.6GFLOPS 而shader频率为1350MHZ的G80的浮点运算速度为:1350MHZ*128*1*2=345.6GFLOPS,两者的差距并不像SP规模差距那么大。
2、执行效能:G80虽说shader频率很高,但由于数量差距悬殊,即使异步也无法补回理论运算速率的差距。于是,要寻找答案,还要从两者流处理器的具体设计着手。
在G80中,每个矢量操作都会被拆分为1D标量操作来分配给不同的SP来处理,如果不考虑指令并行性等问题,G80在任何时刻,所有SP都是充分利用的。而R600则没这么幸运,因为每个流处理器只能同时处理一条指令,因而R600要将短指令合并为能充分利用SP内5DALU运算资源的VLIW指令,但是这种合并并不是总能成功。目前没有资料表明R600可以将指令拆开重组,也就是说,R600不能每时每刻都找到合适的指令拼接为5D指令来满载他的5D SP,这样的话我们假设处理纯4D指令的情况,不能拆分重组的话,R600每个SP只能处理一条4D指令,利用率80%,而对于G80,将指令拆开成1D操作,无论何时都能100%利用。而且,R600的结构对编译器的要求很高,编译器必须尽可能寻找Shader指令中的并行性,并将其拼接为合适的长指令,而G80则只需简单拆分即可。
另外还需要说明的一点是,R600中每个SP的5个1D ALU并不是全功能的,据相关资料,每组5个ALU中,只有一个能执行函数运算,浮点运算和Multipy运算,但不能进行ADD运算,其余的4各职能执行MADD运算。而G80的每个1D ALU是全功能的,这一点也在一定程度上影响了R600的效能。
总结:虽然R600的ALU规模远大于G80,但G80的SP运行频率几乎是R600的两倍,而且G80的体系架构采用完全标量化的计算,资源利用率更高,执行效能也更高,因而总体性能不落后于R600。
第八章:尴尬的中端--Geforce8600简析
在新一代中端显卡中,最早发布也是最受关注的莫过于nVidia的G84---Geforce8600系列。
但是相比其高高在上的价格,它的性能表现实在不尽如人意,很多测试中均落后于价格低于它的老一代高端显卡Geforce7900GS。本章将利用前面讨论的结论对G84核心的SP处理能力作简要地分析。
G84是G80核心的高度精简版本,SP数量从G80的128个锐减为32个,显存位宽也降为1/3--128bit。
抛开显存位宽和TMU ROP,我们着重看SP,G84的SP频率与核心频率也不相同,例如8600GT,核心频率只有540MHZ,shader频率却高达1242MHZ,即核心频率的两倍多,我们粗略按两倍记,则G84核心相当于核心shader同步的64(个1D标量) SP,而传统的VS和PS中ALU是4D的,于是可以说G84的计算能力相当于传统VS和PS总数为64/4=16的显卡,粗略比较,它与Geforce7600(PS+VS=17)的计算能力相近。但当然,事实这样比较是有问题的,因为在G7X中,每个PS中有两个4D ALU,因而7600的运算能力高于传统PS+VS=17的显卡。下面的计算就说明了问题:(MADD操作)
对于7600GT ,VS为4D+1D PS为4D+4D 核心频率560MHZ 理论峰值浮点运算速度:
560MHZ*(12*(4+4)+5*(1+4))*2=135.52GFLOPS
而对于8600GT:1242MHZ*32*1*2=79.4GFLOPS
由此可见,8600GT的峰值运算速度甚至远低于上代的7600GT,更不用跟7900GS相比了。但是,实际情况下,迫于传统架构所限,G7X满载的情况基本不可能出现,G7X的实际运算速率要远低于理论值,而对于G8X架构,执行效率则高很多,实际运算速率会更加接近理论极限。而且支持SM4.0的G8X寄存器数目也要远多于G7X,众多效率优势,使得Geforce8600GT仅凭借少量的SP就足以击败上代中端7600GT。
但是作为DX10显卡,仅仅击败7600GT显然不是最终目标,仅32SP的它在计算量要求空前之高的DX10游戏中表现极差,根本不能满足玩家要求。
总结:8600GT性能上取代7600GT的目标凭借着高效的统一渲染架构总算勉强完成,但过少的SP数量使得其显然难以击败上代高端,更不用说流畅运行DX10游戏了,而高高在上的价位更使其处境不利,归根到底,nVidia对G84 SP数量的吝啬以及过高的价格定位造就了Geforce8600的尴尬,因此,就目前的情况来看,选用8600系列显然不如Geforce7900和RadeonX1950GT来的划算。
题目:利用DSP的FIR滤波器设计
数字处理器(DSP)有很强的数据处理能力,它在高速数字信号处理领域有广泛的应用,例如数字滤波、音频处理、图像处理等。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等。使用可编程的DSP芯片实现数字滤波可以通过修改滤波器的参数十分方便地改变滤波器的特性,下面主要说明利用TMS320VC54x DSP芯片设计实现FIR数字滤波器。
设计目的意义
一个实际的应用系统中,总存在各种干扰,所以在系统设计中,滤波器的好坏将直接影响系统的性能。使用DSP进行数字处理,可以对一个具有噪声和信号的混合信号源进行采样,再经过数字滤波,滤除噪声,就可以提取有用信号了。所以说,数字滤波器是DSP最基本的应用领域,熟悉基于DSP的数字滤波器能为DSP应用系统开发提供良好的基础。
技术指标
1、数字滤波器的频率参数主要有:①通带截频:为通带与过渡带的边界点,在该点信号增益下降到规定的下限。②阻带截频:为阻带与过渡带的边界点,在该点信号衰耗下降到规定的下限。③转折频率:为信号功率衰减到1/2(约3dB)时的频率,在很多情况下,也常以fc作为通带或阻带截频。④当电路没有损耗时,固有频率:就是其谐振频率,复杂电路往往有多个固有频率。
2、增益与衰耗
滤波器在通带内的增益并非常数。①对低通滤波器通带增益,一般指ω=0时的增益;高通指ω→∞时的增益;带通则指中心频率处的增益。②对带阻滤波器,应给出阻带衰耗,衰耗定义为增益的倒数。③通带增益变化量指通带内各点增益的最大变化量,如果通带增益变化量以dB为单位,则指增益dB值的变化量。
3、阻尼系数与品质因数
阻尼系数α是表征滤波器对角频率为ω0信号的阻尼作用,是滤波器中表示能量衰耗的一项指标,它是与传递函数的极点实部大小相关的一项系数。

4、灵敏度
滤波电路由许多元件构成,每个元件参数值的变化都会影响滤波器的性能。
5、群时延函数
在滤波器设计中,常用群时延函数评价信号经滤波后相位失真程度。
以上的几个技术指标是一般滤波器的特性,但在实际应用中,数字滤波器通常用来实现选频操作,因此在利用DSP实现数字滤波器设计中要求的技术指标主要为在频域中给出的幅频响应和相频响应。如下图所示
幅频响应和相频响应特性曲线
对于幅频响应,它的含义是信号通过系统之后的输出信号的幅度与它输入时的信号的幅度的比值,一般以分贝值表示。对于相频响应,含义是信号通过系统之后的输出信号的相位与它输入时的信号的相位之差,在运用线性相频响应指标进行滤波器设计具有如下优点:①只包含实数算法,不涉及复数运算;②不存在延迟失真,只有固定数量的延迟;③可以采用FFT算法,从而提高运行效率;④由于FIR滤波器的单位脉冲响应是有限长序列,故FIR滤波器没有不稳定的问题,且误差较小。
基本原理
利用DSP实现FIR滤波器的设计方法主要有窗函数法和频率抽样法,其中窗函数法是基本的设计方法,这里采用窗函数法设计FIR滤波器。设希望得到的滤波器理想响应为 ,那么FIR滤波器的设计就在于寻找一个传递函数
去逼进 ,设
这里 就是傅立叶级数的系数。在这种逼近中,最直接的一种方法就是从单位脉冲响应 入手,使 逼近理想的单位脉冲响应 。由于 是一个无限长序列,因此,最简单的方法就是对 做截尾处理,即得到一个近似的传递函数
上式中,Q就是最终确定FIR滤波器的阶数,Q越大,近似程度就越高。对 截尾,实际上就是对 乘上一个矩形窗口 ,即
令z= ,则
其脉冲响应系数为 , ,…, , , ,…, , 。为使 具有因果性,延时Q个样值,可得:
令n+Q=k,上式成为
令 ,N=2Q,得
式中, 是脉冲响应系数,这里 …, ,…, 。
一般来说,FIR数字滤波器输出 的Z变换形式 与输入 的Z变换形式之间的关系如下:
实现结构如下图所示:
Z变换结构图
从上面的Z变换和结构图可以很容易得出FIR滤波器的差分方程表示形式,即对上式进行反Z变换得:
上式为FIR数字滤波器的时域表示方法,其中x(n)是在时间n的滤波器的输入抽样值,根据上式即可对滤波器进行设计。
硬件设计
1、DSP芯片
根据设计原理,实现的核心器件采用美国德州仪器公司生产的低功耗定点数字信号处理器芯片TMS320C5402。选择该芯片主要是因为它是目前最常用的低成本DSP芯片,而且包括以下主要特点:
⑴运算速度快,最快可达532MIPS;
⑵多总线结构,片内共有8 条总线(1条程序存储器总线、3条数据存储总线和4条地址总线);
⑶CPU采用冯? 诺依曼并行结构设计,使其能在一条指令周期内,高速地完成多项算术运算;
⑷片内集成了4K×16bitROM和16K×16bit的双存取RAM;
⑸丰富的片上外围电路(通用I/O 引脚,定时器,时钟发生器, HPI 接口,多通道缓冲串行口McBSP)使其与外部接口方便;
⑹3.3V I/O电压,1.8V核点压,工作电流平均值为75mA,其中核45mA,I/O约30mA;
⑺144脚BGA封装,使体积减少,功耗降低。
2、AD和DA电路
在本数字滤波器系统中选择了TI公司的TLV1570芯片作为模数转换器件,8通道10位2.7到5.5 V低电压模数转换芯片。TLVl570在3V电压下的采样频率为625KSPS,输入信号最高频率不能超过300K。
由于模数转换选择了10位器件,为了简化程序代码,减少DSP 的运算工作量,在本数字滤波器系统中选择了TI公司的TLV5608芯片,它是一款8通道10位2.7到5.5V低电压数模转换芯片。
3、电源电路
根据DSP芯片工作的电压电流需求,及芯片采用双电源供电对加电顺序的要求,考虑使用TI公司的电源转换芯片TPS73HD318,其输出电压为一路3.3V、一路1.8V,每路电源的最大输出电流为750mA,能满足本系统的供电需求。而且TPS73xx具有非常低的静态电流,能使稳压器输出稳定。
4、时钟电路
C54xx系列的时钟端子为X1和X2/CLKIN,采用无源晶振提供时钟信号,由于DSP有一组端子可以用来调整其工作频率的高低,故对晶振频率大小的选定没有特别的要求,这里选用10Mhz的晶振。
5、复位电路
为了克服DSP系统因时钟频率较高导致在运行时可能发生的干扰和被干扰的现象,最好是使用具有监视(Watchdog)功能的自动复位电路,于是采用专门的自动复位芯片MAX706。MAX706的电源为3.1V~5.0V,低电平复位输出,复位门限为3.08V。
6、未用端子处理
根据使用DSP芯片的相关原则,以及芯片手册具体决定未用端子是接上拉电阻还是悬空。
7、基于上述的各部分电路组成,可以得出DSP数字滤波器的整体硬件电路连线图,如下所示
程序设计
1、设计思路
⑴在DSP进行数字滤波运算前首先要进行初始化,只有正确设置了DSP的初始状态才能保证芯片能正常运行。本系统主要进行以下两方面的初始化:
①寄存器初始化:状态寄存器ST0、状态寄存器ST1、处理器模式控制寄存器PMST、软件等待状态寄存器SWWSR、组交换控制寄存器BSCR和时钟模式寄存器等。
②中断矢量表初始化:根据DSP芯片对各中断矢量的设置位置编写一个子程序;设置PMST控制寄存器;连接时将矢量表重定位到IPTR指定的地址。
⑵其次就是FIR 数字滤波的子程序设计,主要步骤如下:
①查询SPCR11寄存器的第二位,当为1时说明read ready,将DRR11的值读入AR3所指向的地址,该值为最新的采样值。
②将最新的采样值减去200h,然后AR3的值减1。
③执行MAC指令。
④将累加器的值送给变量Y,并将Y加上200h。
⑤查询SPCR20寄存器的第二位,当为1时说明writeready,将Y值赋给DXR10,该值为滤波器输出值。
⑥循环执行上面步骤。
2、程序流程图
依据上述程序设计思路可以得到利用DSP实现FIR滤波器设计的程序流程图,如下
3、程序代码
由于初始化程序部分过于庞大繁杂,这里只给出用MAC指令编程实现FIR低通滤波器的程序片断:
FILT_task1
LD Store_SICX,A
STLM A,ar4
STM #1,ar0 ;间址
STM #28,bk
LD DEM_Out,A
STL A,*ar4+% ;输入信号:实部
STM #Coef_Tab1,ar5 ;滤波器实部系数地址
LD #0,A
STM #27,brc
RPTB SICXU-1
MAC *AR4+0%,*AR5+,A
SICXU LD A,-16,A ;低通滤波结果
LD C7FFF,B
MIN A
NEG B
MAX A
STL A,DEM_Out
LDM AR4,A
STL A,Store_SICX
RET
Coef_Tab1
.word 100 ;h(0)
.word 7 ;h(1)
… ;脉冲响应系数
.word -248
.word -71 ;h(N-1)

.end
总结
通过利用DSP的FIR滤波器设计,对DSP芯片的使用,以及利用DSP芯片组成的基本系统的相关电路有了比较深的认识。熟悉DSP芯片的系统设计和应用开发流程,并利用图书馆、网络、询问同学等方式查找资料和解决相关的难题,这是最基础的工作,也是最关键的步骤。这样做可以培养自己的动手解决问题的能力和独立思考的处事方法,使自己具有技术人员的气质和工作态度,为将来的就业增加优势。
数字滤波器是DSP的典型应用,学会了有助于触类旁通,利于进一步的学习研究,能做到理解其他基于DSP的系统的功能和工作原理。掌握了基于DSP的应用开发,开阔了视野,增长了知识,是进入现代数字信号处理领域重要技能,乃至大规模集成电路的开发也是会用到的基础,今后要予以重视并积极努力去学习。
求采纳为满意回答。


