下载本文的PDF版本 PDF

将算法映射到架构
HOMAYOUN SHAHRI,TUFON CONSULTING

对算法和目标架构的了解至关重要。

我们复杂的世界以信息的表示、传输和存储为特征——而信息主要以数字形式处理。随着DSP(数字信号处理器)的出现,工程师们能够相对容易地实现复杂的算法。今天,我们在我们周围的汽车、数码相机、MP3和DVD播放器、调制解调器等等中都发现了DSP。它们在复杂系统中的广泛使用和部署引发了DSP架构的革命,这反过来又使工程师能够实现日益复杂的算法。今天的DSP程序员不仅必须精通数字信号处理,还必须精通计算机体系结构和软件工程。

本文重点介绍将DSP算法映射到DSP架构。目标是描述高效的方法和技术来做到这一点,并帮助我们的读者在他们作为DSP程序员的工作中。我们讨论了哪些类型的算法能够很好地映射到DSP,哪些类型的算法不容易映射到DSP架构,以及可以促进算法模拟和映射到DSP的可用工具的现状。我们首先简要介绍DSP的历史和演变,然后介绍DSP算法,并了解DSP工具。然后,我们描述了将复杂算法映射到DSP架构的有效方法,为了使我们提出的方法精确,我们最后给出一个例子,其中我们将一个著名的算法映射到一个假设的架构。

简史

晶体管(始于20世纪50年代)和集成电路(始于20世纪60年代)的发明导致了许多新的和改进的电子产品。到20世纪末,消费电子产品已成为世界经济的主要部门。造成这种快速增长的一个主要因素是数字信号处理。

信号分为模拟信号或数字信号。模拟信号随时间连续变化,而数字信号由二进制数(0和1的序列)表示。数字信号的一些关键优势在于能够精确地传输和表示,以及操纵这些信号。

虽然地震科学家已经利用数字滤波来解决某些有趣的问题,但直到20世纪60年代中期,数字信号处理的更正式的理论才开始出现。数字信号处理领域的一些最早的主要贡献来自贝尔实验室的James Kaiser1在数字滤波器设计和综合领域,以及Hank McDonald在A/D(模数转换)和D/A(数模转换)转换领域,以及Rader和Gold,他们撰写了第一本关于DSP的书2。大约在同一时间, Cooley和Tukey在他们对现在被称为FFT(快速傅里叶变换)的工作中,为这个新兴领域带来了主要的推动力3。这是一种用于计算信号中存在的频率的技术。

到20世纪60年代中期,集成电路的潜力得到了赏识,并且想象可以使用数字组件最好地合成完整的信号处理系统并非不合理。这将需要20年的时间才能使这一愿景成为更普遍和实际的现实。在此期间,在整个20世纪60年代和70年代,大多数数字信号处理系统都是使用硬连线(固定功能)解决方案实现的。

20世纪70年代早期微处理器(芯片上的计算机,低功耗计算)的发明改变了这种范式。第一次有可能完全在软件中实现数字信号处理系统。虽然数字信号处理作为工程的一个分支对大多数人来说仍然是陌生的,但诸如语音合成和识别,以及图像、音频和视频压缩等许多应用现在已经变得熟悉。从20世纪60年代至今,数字信号处理技术在电子产品的扩展中发挥了重要作用。

数字信号处理器

单芯片DSP首次出现在20世纪80年代早期。最初,DSP是具有某些专用硬件和相关指令(单周期乘法、乘法累加、多次内存访问)的通用微处理器,这些硬件和指令辅助了DSP算法的实现。当DSP算法在DSP而不是微处理器上实现时,速度提高了不止一个数量级。

最初可供DSP程序员使用的工具通常是汇编器和调试器。DSP工程师不得不为这些早期的DSP编写晦涩的汇编语言程序。结果代码难以编写和维护。在DSP上实现越来越复杂的算法导致了DSP与微处理器并行快速发展,以及C编译器和集成开发环境等工具的发展。现在有两种通用的架构类别可以实现指令级并行性和高性能:超标量和VLIW(超长指令字)架构。

超标量架构使用特殊的片上硬件来查看指令流,寻找可以并发执行的独立操作,以最大化并行性。这些处理器旨在动态地解决硬件中的数据依赖性并发出并行操作。超标量处理器中的每条指令仅执行单个操作。为了实现指令级并行性,片上硬件一次查看多条指令,并尝试尽可能多地并发执行指令。为了保持流水线繁忙并提高吞吐量,硬件执行分支预测。这增加了超标量架构的复杂性。

VLIW处理器具有高度并行的架构,为多处理器提供了一种替代方案。与超标量处理器一样,VLIW处理器通常具有许多独立的功能单元,每个功能单元共享多个片上或外部存储器库。由于每条指令都包含每个功能单元的操作码,因此许多单元可以并发执行其分配的操作。与超标量方法相反,VLIW处理器不需要大量的片上硬件来解决数据依赖性或发出并行操作。这是因为所有并行操作的调度都是编译器的责任。因此,编译器必须深入了解目标架构,以便能够为任何给定算法调度以获得最佳性能。然而,即使使用C等高级语言进行编码,程序员也必须熟悉架构的细节。因此,发出并行指令的负担转移到了软件。

在过去的几年中,可重构架构也已经出现。这些新来者表示,为了适应无线和消费领域众多快速变化的标准——加上对芯片尺寸和功耗以及所需计算吞吐量的限制——下一代通信和消费产品需要新的灵活性和可编程性水平,而传统的固定DSP设备无法满足这些需求。对于某些应用来说,完全可编程的DSP芯片可能效率太低。在可重构架构中,设计人员可以灵活地设计高效执行所需任务的指令,或者可以添加专用硬件来非常高效地执行部分任务。简而言之,可重构架构是完全可编程DSP和硬连线ASIC4之间的混合体。

DSP算法

韦氏词典将算法定义为在有限步骤内解决数学问题的过程,该过程通常涉及重复操作,或逐步解决问题或完成某些目标的过程,尤其是在计算机上。术语DSP算法非常广泛,涵盖了各种各样的算法——从相对简单的算法,例如用于实现FIR(有限脉冲响应)滤波器的循环卷积,到稍微复杂的算法,例如FFT或DCT(离散余弦变换),到非常复杂的算法,例如语音/音频、图像/视频编码器和调制解调器。

数字信号处理是有目的地改变数字信号,以便改善信号的传输、存储或增强信号的质量。这些变化的例子包括滤波(在预处理和后处理以及分解中)、变换(在压缩中)、估计(在视频压缩的运动估计中)、检测(在雷达中)、分析(在语音压缩中)、识别(在语音识别中)和合成(在语音合成和压缩中)。因此,数字信号处理算法具有某些共同的块。一个数字信号处理系统包含许多连接在一起的这些小块。

因此,为了实现复杂DSP算法的高效实现,我们必须从高效实现这些通常消耗总运算量很大比例的小块开始。因此,DSP程序员需要考虑各种参数,例如内存使用量(对于便携式和低功耗设备很重要),以及以运算次数衡量的复杂性。他们必须根据其目标架构的适当复杂性度量来选择算法。例如,一种FFT算法以大幅增加加法次数为代价来最小化乘法次数,不适合映射到大多数DSP架构,因为在DSP中,加法与乘法一样昂贵。DSP中复杂性的适当度量是乘法累加或乘法-累加的数量。但是,此指标非常依赖于设备,DSP工程师必须意识到这一点。

一旦为DSP系统选择了正确的算法,就可以继续进行实现,这通常以高级语言(通常是C)完成,并评估系统的正确性和功能。由于功耗和芯片尺寸的考虑,直到今天,大多数DSP仍执行定点运算。如果您的初始设计和实现使用浮点数,则下一步是将算法转换为定点(整数)。DSP程序员必须非常熟悉算法的内部结构才能执行此任务,并防止溢出和下溢。此过程通常逐块执行,并且在每个块转换结束时,检查其功能和正确性。一旦选择了适用于该设备的算法并实现,并且所有块都转换为定点(对于定点设备),您就可以开始下一个任务:将代码映射到目标设备。在开始映射算法之前,您必须了解DSP开发工具的功能。

请注意,面向位的算法以及包含复杂状态机的算法,由于其固有的顺序性质,因此不能很好地映射到DSP架构。可重构DSP通常确实为用户提供了设计和包含他们自己的位级操作引擎的能力。一些专用DSP还包括位级操作引擎,用于实现面向位的算法,例如霍夫曼解码器。

DSP工具的现状

在过去的二十年中,DSP开发工具得到了显着发展。当DSP在70年代末和80年代初出现时,DSP工程师唯一可用的工具是汇编器和调试器。第一代DSP架构存在许多异常情况,这使得生成紧凑代码非常困难。然而,今天,DSP工程师不仅可以使用汇编器,还可以使用C和C++等高级语言的编译器、优化器和分析器,以及高级设计和仿真工具。

在DSP的早期,程序员负责填充与分支相对应的延迟槽并设置循环以填充流水线(软件流水线),执行循环展开以及某些关键函数的内联,但是今天编译器处理了大部分这种复杂性。对于某些具有更简单架构的DSP以及超标量架构,与手工优化的汇编相比,设计良好的编译器可以以高达80%的效率运行,这对于大多数应用来说已经足够了。VLIW架构的编译器可能无法表现得那么好,因为如果不直接从程序员那里获得反馈,就很难从算法中提取并行性。如果流水线级数较小,则此类DSP的编译器通常表现更好;随着流水线深度的增加,其性能会下降。

今天,几家供应商提供用于复杂数字信号处理算法和系统设计和仿真的高级工具。使用Matlab、SPW(信号处理工作系统)和Mathematica5等高级工具,算法设计人员可以将DSP算法划分为更小的互连块,可以修改或替换这些块,直到达到所需的性能(例如,随意更改DMT[离散多音]的FFT大小)。算法设计人员可以用框图表示他们的算法,并轻松分析这些块的输入和输出。

这些高级仿真工具还提供了丰富的DSP原语、函数和算法库,这些库极大地帮助了设计人员,并且可以作为更复杂算法或系统中的构建块。这些工具还提供了可选软件包,用于为某些固定目标设备生成DSP代码。尽管生成的代码可以作为进一步优化的良好起点,但这种自动生成的代码的性能很少能满足程序员的期望,并且达不到应用要求。

为了帮助程序员,大多数DSP供应商都提供了优化的函数和算法库,例如FFT、DCT、运动估计、FIR和IIR滤波器,以及自适应滤波算法等等。如前所述,这些是消耗大部分周期的块类型。大多数DSP供应商还随其编译器提供特殊的高级API(应用程序编程接口),通常称为内在函数,这些函数调用会转换为一条汇编指令。内在函数对于VLIW架构和向量处理器最有用,它们可以帮助编译器最佳地调度指令。程序员还可以通过使用内在函数从C等高级语言访问专用硬连线块(运动估计、DCT或霍夫曼解码器等)。通常,这些内在函数是汇编指令。

对于可重构架构的程序员,这些工具通常还为他们提供了将自己的内在函数设计到编译器中的能力,从而可以使用C或C++等高级语言中的自定义块。实际上,这些工具被修改以匹配可重构架构的特性。其中一些工具还使程序员能够询问“如果……会怎么样?”,并评估添加他们的内在函数(硬件表示)如何影响算法的性能。

编译器执行的优化类型包括但不限于以下内容

提高VLIW编译器的性能是一个活跃的研究领域。

验证DSP算法和系统

一旦DSP算法被设计出来,通常使用高级设计和仿真工具或C等高级编程语言,就会生成一组测试向量,并且可能还会生成参考软件。测试向量和参考软件对于验证DSP算法在目标DSP架构上的实现至关重要。例如,大多数基于标准的算法(ITU和基于ISO的语音、音频、图像和视频压缩和解压缩算法)都存在测试向量和参考软件。提供的参考软件可以使用定点或浮点表示来实现DSP算法。通常还会提供适当的指标,以及测试向量和参考软件,以衡量实现的正确性。如果仅提供一组测试向量和相关指标,则DSP程序员应该编写符合测试向量的软件(产生正确的结果),并在通用计算机上运行。然后,该软件将在将算法映射到目标架构的过程中充当参考软件。否则,验证将变得更加困难。

使用此参考软件和测试向量,DSP程序员可以隔离算法中的每个块(根据块的输入和输出),并验证其实现,因为可以使用适当的测试向量针对参考软件来衡量每个块的性能。这样做的好处是,DSP程序员可以在将算法映射到目标架构时验证实现。参考软件也可以作为将DSP算法映射到目标架构的起点。

将DSP算法映射到DSP架构

在整篇文章中,我们阐明了需要详细了解要映射到目标DSP架构的算法以及底层架构本身。作为第一步,详细研究目标DSP的架构并了解我们可支配的硬件资源非常重要。例如,您需要确定乘法器和加法器的数量、流水线深度、内存总线和内存端口的数量(允许同时内存访问)、从内存加载数据所需的周期数、指令和数据缓存量、DMA(直接内存访问)控制器、专用硬连线块的存在、指令依赖性、分支惩罚、下溢和溢出保护(饱和)、标志、寄存器文件、数据路径等等。

对于可重构架构,您需要了解您在功耗、芯片尺寸、开发时间和性能方面的预算。您需要仔细分析算法,并了解添加专用块(例如用于运动估计的SAD[绝对差值和]等)在额外芯片尺寸、功耗和性能方面的权衡。应非常明智地添加新指令和块。新块必须显着提高性能,并且不会使芯片尺寸超过预算。由于添加这些块会增加硅的验证时间并产生更多风险,因此这是一个需要注意的重要陷阱。

下一步是了解工具并确定其功能。由于今天几乎所有DSP供应商都提供C编译器,因此即使汇编器有其合适的应用并且仍在使用,我们在本文中也不考虑汇编器。例如,程序员经常查看生成的汇编代码以确保适当的优化。您需要了解可以从高级工具访问目标硬件的哪些方面,这对于内存分区以及将算法的某些部分映射到专用块非常重要。您还需要了解工具在多大程度上执行优化,例如填充分支延迟槽、循环设置、循环展开和指令调度以填充流水线,以及保持VLIW指令的填充(所有单元都处于忙碌状态)。最后,您需要了解编译器提供的内在函数。正确使用这些内在函数极大地帮助编译器生成高效的代码。

对于可重构架构,您需要设计使用新设计的块的内在函数,以及这些新块的延迟和数据依赖性。今天,大多数供应商都使程序员能够迭代设计(配置),直到他们在给定预算和底层架构的情况下找到接近最优的解决方案(在功耗、MIPS和芯片尺寸方面)。

您现在应该准备好开始映射到目标架构。根据我的经验,在可能的范围内,您应该从在目标架构上正确编译并正常执行的代码开始。由于今天大多数DSP供应商都提供编译器,因此我所说的映射DSP算法架构是指针对目标架构优化代码。对于算法的每个部分,首先确定消耗大部分周期的部分,并首先针对这些部分进行优化。

一旦您确定了要优化的块,就开始删除不必要的分支和/或组合分支。查找循环,尤其是包含少量指令的内部循环,并明智地展开它们,以及识别某些关键函数以进行内联。展开是一种经常用于消除循环开销的技术,因为在每次迭代中都必须测试循环变量。如果循环计数是常数,则某些架构可以使用专用计数器来实现零开销循环。这是通过在进入循环之前填充流水线并在退出循环之后刷新流水线(软件流水线)来完成的。具有小常数计数的循环也是循环展开的良好目标。通过循环展开,您牺牲了代码大小来换取性能。

研究生成的汇编代码以观察工具执行的优化并寻找其他潜在收益始终是一个好主意。对于具有非常深流水线的设备,您可能必须手动优化某些关键的内部循环。还需要指出的是,DSP具有高度优化的数据路径。性能下降的最重要原因之一是数据未对齐和加载不当。

演示优化的最佳方法是给出一个例子。考虑MPEG Layer III(MP3)编码器6的前端部分,其中一次读取32个传入音频样本,并使用窗口(512个样本,带有Hann窗口——即,按点对点方式乘以一个特殊向量)进行窗口化,然后使用多相滤波器(一种实现滤波器组的特殊方式)将其划分为相等的频带(子带分析)。已知在可能的情况下使用多相滤波器实现子带分析从复杂性的角度来看是非常有效的(选择“正确”的算法)。假设代码已整数化或转换为定点表示。以下公式说明了IR(实数集)中Q格式的数字r的表示方式。

因此,Q.31包含二进制小数点右侧的31个二进制数字。我们假设窗口以Q.31(代码此部分具有足够的分辨率)格式表示,方法是将窗口系数乘以0x7fffffff。系数的幅度都小于1,因此所得的32位整数系数可以视为分数。滤波器系数也已类似地转换为Q.31格式。数据以16位整数接收(有关整数化代码,请参见图1)。

图1 整数化代码

// this is helper function that is used to // implement 32 bit multiply and shift. // // perform 32 bit multiply and return the most // significant 32 bits of the result // returns Q.30 #define HAN_SIZE 512 #define SBLIMIT 32 // for an optimized implementation this function should be inlined. long mul(long a1, long a2) { long long A; A = (long long) a1 * (long long) a2; return (long) (A >> 32); } // this code is from the shine implementation of MP3 encoder. void L3_window_filter_subband(short **buffer, long s[SBLIMIT] , int k) { long y[64]; int i,j;  // read 32 new samples and convert to Q.31 for (i=31;i>=0;i--) x[k][i+off[k]] = ((long)*(*buffer)<<16; // Q.31  // Hann window is: .5*{1-cos[2*PI*(i+1)/HAN_SIZE+1} // window (ew[i]) the new vector, HAN_SIZE = 512 for (i=HAN_SIZE; i--; ) z[k][i] = mul(x[k][(i+off[k])&(HAN_SIZE-1)],ew[i]); // Q.30  // get ready for the next block, and modify the offset off[k] = (off[k] + 480) & (HAN_SIZE-1);  // implement the polyphase filters, accumulate first for (i=64; i--; ) for (j=8, y[i] = 0; j--; ) y[i] += z[k][i+(j<<6)]; // Q.30  // the coefficients are: cos[2*(i+1)*(j-16)*PI/64] // now filter the data and produce 32 new subband coefficients for (i=SBLIMIT; i--; ) for (j=64, s[i]= 0; j--; ) s[i] += mul(fl[i][j],y[j]); // Q.31 * Q.30, result is Q.29 } 

现在假设我们的目标硬件有两个执行单元,每个单元都能够执行每个周期两次32位乘法累加,当两个操作数都打包在64位寄存器中时,以及能够执行单个32位乘法累加。此外,假设硬件还可以执行长度为2的向量的点积,当打包在两个64位寄存器中时,并且可以选择性地将64位标量添加到结果中。让我们进一步假设编译器提供特殊的类型来表示64位有符号和无符号整数,以及用于跨64位边界对齐数据的指令。编译器还提供用于右移的可选舍入的内在函数。由于硬件有两个执行单元,因此可以使用内在函数来寻址其中一个。如果同时寻址两个执行单元(由exe_1和exe_2索引),则编译器将并行调度它们。假设它们如图2所示。

图2 内在函数

// returns a+((b*c)>>31) signed, operation is performed in execute unit  1. int = multiply_add_exe_1(int a, int b, int c); // returns a+(b1*c1 + b0*c0) signed, operation is performed in execute unit  1. u64 = dotproduct_add_exe_1(u64 a, u64 b, u64 c); // returns (a >> b) sign extended u64 = right_shift_round_exe_1(u64 a, int b); 

新的优化代码如图3所示。

图3 优化代码

// ew is a 64bit aligned Hann window of length 512  // x, and y are 64bit aligned vectors of length 512  void L3_window_filter_subband(short **buffer, long s[SBLIMIT] , int k)  { int i, j, n, m, p, r; u64 s64_0, s64_1; u64 y[64/2]; long *x_ptr32; long *y_ptr32; long *ew_ptr32; long y0, y1; x_ptr32 = (long *) x[k]; // &x[k][0] /* shift samples and place them at the proper window positions */ for (i=31;i>=0;i--) x_ptr32[i+off[k]] = ((long) *(*buffer)++) << 15; // result is Q.30 /* convert the u64 pointer to long pointer for the next block */ ew_ptr32 = (long *) ew; y_ptr32 = (long *) y; for (i=0, j=63; i<HAN_SIZE ; i+=16, j-=2) { n = 448; m = j+n; p = j+n-1; y0 = y1 = 0; // this loop is an excellent choice for unrolling, which we have avoided // to unroll to aid readability for (r=0; r<8; r++) { y1 = multiply_add_exe_1(y1, x_ptr32[(m+off[k])&(HAN_SIZE-1)],  ew_ptr32[m]); // Q.30 y0 = multiply_add_exe_2(y0, x_ptr32[(p+off[k])&(HAN_SIZE-1)],  ew_ptr32[p]); // Q.30 // the compiler will execute these in both execute units! m -= 64; p -= 64; } y_ptr32[j] = y1; y_ptr32[j-1] = y0; } off[k] = (off[k] + 480) & (HAN_SIZE-1); /* offset is modulo (HAN_SIZE)*/ for (i=SBLIMIT-1; i>=0; i-=2) { s64_0 = 0; s64_1 = 0; // this loop should also be unrolled to increase performance for (j=64/2; j--; ) { // Q.31 * Q.30 = Q.61 s64_0 = dotproduct_add_exe_1(s64_0, fl[i][j], y[j]); // Q.31 * Q.30 = Q.61 s64_1 = dotproduct_add_exe_2(s64_1, fl[i-1][j], y[j]); } // Q.61 >> 32 = Q.29, s[i] = (long) right_shift_round_exe_1(s64_0, 32); // Q.61 >> 32 = Q.29, s[i-1] = (long) right_shift_round_exe_2(s64_1, 32); } } 

请注意,为了帮助代码的可读性,我们在此处没有展开循环。在最后一个循环中,内部循环的展开或预处理(如果硬件支持——不在每次迭代时检查循环条件)将大大提高性能。或者,如果硬件支持零开销循环,则可以使用专用计数器来实现相同的性能提升。

此外,请注意图3中的第二个和第三个循环是如何组合以减少数据加载和存储的。由于非连续寻址,我们无法使用multiply_add()指令的向量化形式,但我们仍然可以通过使用两个执行单元来实现某种并行性。在最后一个循环中,请注意如何使用dotproduct_add()指令来有效地获得至少4倍的因子,但可能比图1中的代码高得多。

某些架构还提供专用的地址生成器,这些地址生成器极大地帮助了数据的非连续寻址。这些地址生成器可以大大提高图3中第二个循环中计算的性能。这些类型的地址生成器通常使用内在函数进行编程,然后用作数组的索引,从而避免了数组索引计算。此外,在具有单独的ALU和MAC(乘法累加)单元以及单独的数据路径的设备中,第二个循环的数组索引的后递减可以与计算同时发生。当然,这取决于生成地址的特定流水线阶段。这种优化对于程序员来说应该是透明的,因为编译器通常在执行这些类型的优化方面做得很好。同样,最好研究生成的汇编代码,尤其是内部循环,以确保已进行适当的优化。

我们的示例清楚地展示了本文过程中讨论的步骤。显然,将DSP算法映射到DSP架构没有单一的最佳方法。我们讨论的是DSP程序员在尝试将算法映射到目标架构时面临的一些问题。所采用方法的优点是它是有条理的,如果遵循,它可以保证一个好的解决方案,尽管不一定是最佳的。需要注意的一个可能的陷阱是花费不必要的时间来优化算法中不是内部循环一部分的部分。因此,非常重要的是,DSP程序员在目标架构上分析代码,而不是在通用计算机上分析参考代码,以确定应首先针对优化的部分。结果可能大相径庭。

虽然大多数用于VLIW架构的编译器可以通过展开图3中的代码来实现一定程度的并行性和性能提升,但它们无法组合循环并利用对算法的详细了解带来的索引技巧。

不是一项简单的任务

我们在本文的开头声称DSP无处不在。我们表明,为了有效地将DSP算法映射到DSP架构,我们必须非常熟悉算法并深入了解目标架构。DSP设计、开发和仿真工具与DSP一起发展,并使算法的映射不再那么费力,但它们仍未达到完全自动化DSP算法的映射和移植的性能水平。

在DSP广泛使用的应用中,最重要的问题是在最大程度上将算法最佳地映射到目标架构,因为这直接转化为功耗和芯片尺寸的降低。将DSP算法映射到目标架构不是一项简单的任务。它需要几种不同的技能。它汇集了DSP算法开发、软件工程和计算机体系结构的知识。

参考文献

1. James Kaiser口述历史记录稿。IEEE历史中心,1997年2月11日;http://www.ieee.org/organizations/history_center/sloan/ASSR_Oral_Histories/jkaiser_transcript.html

2. Rader,C. M.和Gold,B. 信号的数字处理。McGraw-Hill,纽约:NY,1969年。3. Cooley,J. W.和Tukey,J. W. 用于机器计算复数傅里叶级数的算法。《计算数学》19(1965)297-301。

4. Abbott,C. MDP-1架构和编程手册。Malleable Technologies(MPC-Sierra)。

5. Matlab:http://www.mathworks.com;SPW:http://www.cadence.com;Mathematica:http://www.wolfram.com/products/mathematica

6. ISO/IEC 11172-3。信息技术。高达约1.5 Mbit/s的数字存储媒体的运动图像和相关音频的编码第3部分:音频。

HOMAYOUN SHAHRI,博士,是Tufon Consulting的首席合伙人,也是南加州大学(USC)的电气工程兼职教授,他在那里教授数字信号处理。

acmqueue

最初发表于Queue vol. 2,no. 1
数字图书馆中评论本文





更多相关文章

William J. Dally,Ujval J. Kapasi,Brucek Khailany,Jung Ho Ahn,Abhishek Das - 流处理器:可编程性和效率
许多信号处理应用既需要效率又需要可编程性。例如,3G蜂窝基站中的基带信号处理需要数百GOPS(每秒千兆或数十亿次运算),功耗预算为几瓦,效率约为100 GOPS/W(每瓦GOPS)或10 pJ/op(每次运算皮焦耳)。与此同时,需要可编程性来遵循不断发展的标准,支持多种空中接口,并在不同空中接口上动态配置处理资源。数字电视、监控视频处理、自动光学检测以及移动相机、摄像机和3G蜂窝手机也有类似的需求。


W. Patrick Hays - DSP:回到未来
从DSP(数字信号处理器)的曙光开始,一句古老的引言仍在回响:“哦,不!我们将不得不使用最先进的5µm NMOS!” 说话者的名字已淹没在历史的迷雾中,就像5µm芯片设计远古时代的许多事物一样。这句话指的是第一个贝尔实验室DSP,其掩模组实际上经历了10%的线性光刻收缩,达到4.5µm NMOS(N沟道金属氧化物半导体)沟道长度,并在1979年末以激进的全定制电路设计完成。


Gene Frantz,Ray Simar - 处理器与处理
数字信号处理是一项隐形技术。它是从您的手机到火星探测器的一切事物的核心使能技术。它的作用远不止于实现一次性的突破性产品。它提供了不断增强的功能;将拨号调制解调器的性能提升与DSL和有线调制解调器最近的性能提升进行比较。值得注意的是,数字信号处理已经变得无处不在,但鲜为人知,并且大多数用户甚至没有意识到它是什么。





© 保留所有权利。

© . All rights reserved.