tag 标签: fir滤波器

相关帖子
相关博文
  • 热度 24
    2015-3-24 11:51
    985 次阅读|
    0 个评论
     本文开始通过描述多个并行进程的需求,讲述一个比双核提供更多能力的FPGA设计。接着,作者提出只需要简单的步骤,即可完成将C语言的有限脉冲响应(FIR)滤波器移植到FPGA硬件中。   高性能DSP应用,包括视频和音频处理,与其说是时钟的限制,不如说是缺乏并行处理的能力。在减少钟速率并使用多重并行处理硬件主要有两个优势:一,降低时钟速度,降低功耗;二,并行的应用可以大大提高应用程序的吞吐量。但如何将现有的DSP算法转成并行执行则是实现这些好处所面临的最大的挑战。   FPGA则可以很好地并行执行程序。传统上,这些设备已被使用较低级别的方法进行描述,包括硬件描述语言(HDLs),最常用的VHDL和Verilog。最近,C到HDL的编译已经成为许多FPGA开发的核心能力。HDLs是为PnR工具所创造的可在FPGA上运行的RTL代码的输入文件格式。有效编程硬件需要软件开发人员了解如何将设计改写至硬件。软件开发者也需要知道如何使用优化编译器,了解最终的硬件资源消耗,以减少产品上市时间。这是其中C到HDL工具可以提供很大的帮助。本文的目的是为软件开发者提供将C代码快捷的转换至FPGA硬件中使之并行执行的方法。   并行   微处理器通过利用不断增加的时钟速度,以及使用有限的指令流水线(双核或四核)来提高性能。 FPGA却早已提供了这些核远没有达到的并行执行能力。它能够使用优化的并行处理逻辑来执行多个串行程序。缺点是,从以微处理器为导向C至优化后的RTL(布局布线后)需要经过多个步骤,使用多种工具。对于C程序员,这意味着C必须被编译成HDL,HDL必须被综合至较低水平的逻辑,而低级别的逻辑必须在FPGA中进行布局布线。因此,优化应用需要一些了解FPGA架构并且懂得进行结构优化的程序员。为了解释我们要遍历一个简单的FIR滤波器从C移动到FPGA的硬件(图1)的步骤。 图 1: producer, FIR 与consumer 三个进程被连接至一起    项目描述 - 16位,12阶FIR滤波器   具体过程被编译成硬件是由以下函数表示:   void fir(co_stream filter_in, co_stream filter_out)   这个C语言子程序是定义为一个代码模块的单一进程,作为一个空的子程序,用来描述一个硬件或软件的组成。如果您是一位经验丰富的硬件设计师,你可以简单地认为是类似于一个VHDL的实体,或一个Verilog模块的进程。   如果您是一位软件程序员,你可以把该进程想像成一个永远循环的、独立于其他进程的子程序。我们的fir函数没有返回值,有两个被定义使用类型为co_stream的数据接口。这两个流用于:   滤波器系数为12,取filter_in 为采样数据流。   写出对filter_out中滤波器的值。   如果你是一个硬件设计师,你可以将co_stream视为一个先进先出(FIFO)的缓存。如果您是一位软件程序员,你可以把一个co_stream看成是大致类似于C中的文件类型而非磁盘上读和写的文件,但是,我们将使用co_stream类型进行多个并行进程之间的数据传输。 图2:源代码,显示的算法及其嵌套循环   请注意在图2中的子程序包括外部DO,而(1)循环,这表明该子程序将不间断的执行。该子程序描述了一个持续的,不间断运行的进程。 《电子设计技术》网站版权所有,谢绝转载   在这个循环中,观察co_stream_open,co_stream_read,co_stream_write和co_stream_close是如何管理滤波器的数据移动的功能的。这些功能为您和C程序员提供了用简洁和平台可移植的方法,来表示数据流。支持许多我们所熟悉的可以用来描述移动和进程到进程的数据管理功能。   Fir函数开始通过从filter_in流中的读取12个系数并存储到一个本地数组(系数)。该函数然后读取并开始处理输入数据,每次一个采样。滤波器的结果写入到输出流filter_out中。   在算法的描述(图3),你会发现一个while循环,它描述了滤波操作,迭代乘法累加的操作。 图3:滤波进程是一个迭代的乘法累加操作。   此包含有两个内循环和一个简单的计算的循环结构对每一段输入的12采样点迭代以进行滤波操作。在每个循环迭代的同时,使用co_stream_write命令将滤波数据写入到输出流。   上述循环说明了使用ImpulseC来描述滤波器的常见模式:C语言对输入数据进行循环迭代、处理,并将结果写到输出流(如图所示)或其他方式。   你可能注意到了在代码中使用的三个编译指示(PIPELINE, UNROLL 和 SET StageDelay)。这些编译指示是更详细的优化技术指南,总结(在代码中使用这些编译指示):   CO PIPELINE pragma表示我们希望while循环被实现成为一个高吞吐量的硬件流水线(pipeline)。如果硬件编译器能够生成一个速度完美的流水线,那么我们可以预计,此循环遍历的时间和每一个采样时间一样快,即使在循环中的计算超过一个时钟周期。   CO SET pragma允许我们指定生成的硬件的某些特征。在这种情况下,我们正在建立一个StageDelay的约束,指示优化器限制任意流水线阶段的组合逻辑深度。如果任意生成的流水线阶段超过这个限制,优化器将添加额外的流水线阶段,以更好地平衡流水线从而使硬件工作在高时钟频率下。   表示优化器将删除(依靠使用unrolling命令)循环,使该循环所有的迭代并行工作。展开Unrolling要求循环服从(例如有一个固定数量的循环迭代)某些规定,但提高性能的同时也会急剧增加FPGA逻辑门搭建。    FIR滤波器的子程序配置   上述FIR的子程序描述了要在FPGA硬件上实现的C算法。然而,为完成整个程序,我们还需要包含一个额外的程序来描述I / O接口和该应用的其他编译时的特性。这种配置常规有三个重要的目的,使我们能够:   定义I /O特性,例如FIFO深度和共享内存的大小等。   将一个或多个ImpulseC进程实例化并相互联接。   任意指定芯片级的物理名称和/或位置分配给特定的I / O端口。   这个例子包括一个硬件进程(FIR滤波器),同时也包括了前面描述的两种测试程序,生产者(producer,信号发送)和消费者(consumer,信号收集)。我们的配置程序(图4)描述该如何把生产者(producer),消费者(consumer)与主体(fir)的进程连接在一起。 图4:一个完整的配置程序   总之,fir子程序所描述生成的算法作为FPGA硬件,而生产者和消费者子程序(描述在其他地方,fir_sw.c)是用于测试。配置例程用于描述如何沟通这三个过程,并描述了进程I / O中的其他特点的。 《电子设计技术》网站版权所有,谢绝转载    编译C代码来创建HDL   在创建FPGA硬件和相关的C代码文件的步骤前,首先选择的目标平台。该平台可以是个人的FPGA或是FPGA的开发板。设备选择通常是通过下拉菜单将列出由C到FPGA编译器所支持的设备。或者,您通常可以选择“一般的VHDL”来编译一个非特定的设备架构的VHDL。大多数HDL生成器还可以生成Verilog。HDL的生成是自动的,创建一个项目文件,其中包括循环延迟、流水线速率估算和所需硬件操作的估算,如图5所示。这些数据有助于工程师在FPGA漫长的综合,布局布线等步骤以前,反复重构和完善算法。 图5:项目文件包括操作循环延迟、流水线速率、所需的硬件操作的估算。   这个 C到FPGA的工具将优化和处理您的工作,生成FIR滤波器的HDL文件。作为完善迭代代码进程的一部分,将使用代码工具和图形工具对这些结果进行检查。此HDL文件包括状态机和其他逻辑,它使用C实现了并行和流水线。.在图5中的示例包括的展开循环的流水线内码循环会导致大量的HDL代码的生成。   当您检查这个生成的HDL代码,请记住,HDL代码行数并不直接关系着FPGA资源的大小。在这种情况下,由于循环展开和流水线的存在,编译器会生成大量的中间信号。 这些中间信号会在综合时被FPGA的综合工具优化掉,将会导致实际生成的逻辑将远远少于HDL所显示的代码量。注:这滤波器所占用的FPGA的资源量和性能将取决于选定器件在什么PGA平台上,综合的设置,与其他硬件元素相接的完整系统。在这个算法案例(16位,全流水线并行12阶滤波器),可以相当于拥有约12个DSP slices的FPGA。   图形化工具使得可以查看一个扩展形式(图6)的源代码,并查看所有展开的和流水线的内循环图。 图6:源代码的扩展形式。   从现在开始,你拥有了一个可重用的、被测试过的FIR过滤器,并可与其他团队共享使用,或是在较大规模的系统集成芯片上重复使用。有趣的是,生成的HDL的可用性为您提供了可进一步手工细化各个设计部分的可能。通常团队将使用C来创建整个设计,然后将一部分转换为HDL代码以备硬件化。因此另一种选择是使用流生成HDL,导出至符合IEEE标准的HDL仿真器(如:ActiveHDL,ModelSim)。这样也可将另一部分C代码自动生成测试向量,作为设计过程中的一部分。我们坚定地认为,“HDL是不可替代的”,HDL可以很好的处理胶合逻辑,地址控制,状态机,和其他的布尔运算等工作。而C恰好是另一个工具包,使软件和硬件开发人员更好地协作联合优化的设计项目。 《电子设计技术》网站版权所有,谢绝转载
  • 热度 31
    2015-3-22 18:09
    1640 次阅读|
    0 个评论
    采样就是采集模拟信号的样本。通常采样指的是下采样,也就是对信号的抽取。其实,上采样和下采样都是对数字信号进行重采,重采的采样率与原来获得该数字信号的采样率比较,大于原信号的称为上采样,小于的则称为下采样。上采样是下采样的逆过程,也称增取样或内插。 本文介绍一种使用Virtex-6器件和免费WebPACK工具实现实时四倍上采样的方法。 许多信号处理应用都需要进行上采样。从概念上讲,对数据向量进行M倍上采样的最简单方法是用实际频率分量数的(M-1)倍个零填充数据向量的离散傅里叶变换(DFT) ,然后将零填充向量转换回时域 。但这种方法计算量很大,因此不能在FPGA内部高效实现。在本文介绍的高效并行实时上采样电路中,每个ADC时钟可产生M个上采样值,其中M是所需的上采样倍数。在我们的Virtex-6 XC6VLX75T FPGA实现方案中,上采样倍数M为4,可以作为较普遍方法的一个实例。 我们并行上采样方法的总体概念源于某些作者所称的“窗口SINC插值”,这种方法在文献资料 中有一些非常精彩的专文介绍。 为了更好的说明,现以图1中所示的16MHz模拟信号为例。该信号的表达式为: 等式 1 图1 - 展示上采样过程的16MHz信号实例 如果用12位ADC以80MHz的频率对图1所示的信号进行采样或量化,输入范围为ADC完整输入范围的97.7%,则每个信号周期只能采样五次,产生的样本数据序列如图2所示。如果对该示例数据序列进行四倍上采样,则有效采样率为320MHz,每个信号周期能够提供20个样本。虽然您可以使用本文介绍的方法进行更高倍数的上采样,但为了说明起见我们还是使用M=4的上采样。 图2 - 本图是12位ADC,输入范围为ADC完整输入范围的97.7%,用80MHz或每周期五次频率对图1的模拟信号采样得到的样本数据序列实例。 当然,还可以通过直接在ADC生成的数据序列的每个实际样本值之间插入(M-1)个零来获得上采样数据向量及所需的样本数(公认效果较差)。该“零插入步骤”对应于复制频域中的原始信号频谱。通过对得到的“零填充”时域信号进行低通滤波,就能去除频域中所需频谱的“复本”,从而获得上采样数据向量。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化 FIR滤波器设计 频域中的理想(砖墙式)低通滤波器相当于在时域中用无限域Sinc函数作卷积。因此为近似化所需的卷积运算,可让前述的零填充时域信号通过速率为ADC时钟频率M倍的对称低通FIR滤波器,该滤波器拓扑结构与图3所示的示例31抽头FIR滤波器相同。用这种方法,我们可以实时生成上采样数据向量。图3中的R1、R2、...、R31代表速率为ADC时钟频率M倍的寄存器,C0、C1、…、C15代表FIR滤波器的系数。 图3 - 当滤波器工作在基本ADC时钟频率的M倍频率时,零插入步骤中使用31抽头FIR滤波器每时钟周期可生成一个上采样数据值 需要说明的是,图3所示的FIR滤波器中的大部分寄存器在任何特定时钟间隔内都会包含0,而非实际的样本数据。以M=4为例,当R1包含实际样本数据时,R2、R3和R4将包含0。当R1包含实际样本数据时,R5、R9、R13、R17、R21、R25和R29也将包含实际样本数据,其余的寄存器将包含0。在下一时钟间隔中,R2、R6、R10、R14、R18、R22、R26和R30将包含实际样本数据。 如图3所示,由于在通过FIR滤波器的每M个样本中有M-1个样本为0,就M=4、使用31抽头FIR滤波器的情况而言(如图4所示),您可以将滤波器分解开,并行产生M个输出。采用这种实现方案,并行FIR滤波器的工作频率为ADC的基本时钟频率,而非ADC时钟频率的M倍。 图4 - 通过在任何给定时钟周期内对图3中每四个寄存器中唯一一个包含非零数据的寄存器进行观察,可以拆解该滤波器,再让滤波器在以基础ADC时钟频率运行的情况下并行 如图4所示,您可以设定窗口SINC函数的系数Cw(n)来最大限度地减少实现该FIR滤波器所需的乘法器数量。对于T个抽头的低通FIR滤波器而言,可通过下式得出最佳系数: 等式2 这里的汉宁窗系数的计算方法为: 等式3 窗口SINC函数系数Cw(n)随即通过对应的C(n)和H(n)值相乘即可得到,如: 等式 4 在M=4时,如果按上面介绍的方法计算31抽头FIR滤波器的系数,令C0=1.0,C4=C8=C12=C15=0,则无需使用与图4中这些系数有关的9个乘法器。此外,由于生成UPSAMPLED VALUE(1)每个系数会使用两次,用户可以“折叠”该实现方案,比如在相乘之前让R1和R8相加,这样就可以去掉四个乘法器。最后得到的设计仅使用18个乘法器每时钟周期就可产生四个上采样值。需要注意的是按上文介绍的设计方法,每个原始样本值会原样从并联滤波器输出。 我们使用图5所示的可综合VHDL 模型评估图4所示电路的性能。该VHDL实现方案假定样本数据为12位,即可能来自美国模拟器件公司的AD9670八通道超声前端集成电路的数据。滤波器系数表达为25位定点常数,以与集成到FPGA芯片上的乘法器输入位数相匹配。来自ADC的输入样本先馈入与输入引脚相连的寄存器(图4中的R1),上采样输出值则使用与输出引脚相连的寄存器。寄存器R2到R8属芯片内部寄存器。寄存器R1到R8故意设定为15位宽度,以便为综合后逻辑提供执行计算所需的动态余量。该设计能检查溢出或下溢,还能将结果钳制在有效范围以内。 图5 - 该VHDL源代码使用单进程和25位定点系数实现图4的滤波器拓扑结构。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化 无需流水线化 图6显示的是使用免费的WebPACK工具中提供的14.7版ISim仿真器对该VHDL模型进行仿真并将馈送图2中的采样/量化12位数据序列后得到的上采样数据序列。每个原始的12位样本均保持不变,原因上文已述。原始波形中每个实际样本之间插入了三个新样本。 图6 - 该图表显示的是VHDL模型生成的上采样数据序列 计算所得(上采样所得)值与原始模拟信号中理想值之间最大的误差为整个范围的0.464%,平均误差为整个范围的0.070%。当然因初始量化步骤原因,在采样/量化12位源矢量数据值中存在1/2 LSB的误差(合整个范围的0.012%)。 布局布线设计使用19个DSP48E1模块,但占用的Virtex-6 Slice资源不足1%,无需流水线化即可运行在107MHz下。 我们使用WebPACK工具14.7版在XC6VLX75T-3FF484 Virtex-6 FPGA上实现这一上采样器。布局布线设计占用该器件中288个DSP48E1模块中的19个,但使用的Slice资源不足1%。最终得到的上采样电路能够运行在107MHz下。无需让滤波器流水线化即可实现这一性能。此外,我们还开发出了用流水线实现的版本,可以工作在217MHz以上。 虽然XC6VLX75T-3FF484是Virtex-6系列中的最低端成员,但芯片上仍集成有288个带有25x18位乘法器的DSP48E1模块。换言之,在理论上足以实现15个图4所示的并行上采样FIR滤波器。我们制作的原型环形阵列超声系统使用了八套以80MHz的频率运行在XC6VLX75T FPGA上的上采样器,在波束成形之前对来自八通道Analog Devices AD9670超声前端芯片的数据进行上采样处理。在该系统中,上采样器按仿真预测的方式运行,在以AD9670 ADC的基本时钟频率80MHz运行的情况下,能使用上采样到320MHz的数据实时完成波束成形。 最大型Virtex-6 FPGA器件XC6VSX475T包含有2,016个25x18位乘法器,在理论上一个芯片就可以实现106个图4所示类型的上采样滤波器。 只要滤波器使用本文介绍的高效并行拓扑结构进行设计,就能够使用实现在工作频率为107MHz的XC6VLX75T-3FF484 FPGA上的FIR滤波器完成M=4倍的实时上采样。原始数据样本将原封不动通过滤波器,并行产生(M-1)=3个上采样值。这种简明的FIR滤波器设计方法无需借助复杂精密的滤波器设计工具就能提供优异的结果。本文介绍的思路稍加拓展,就可以使用更大的因数进行上采样,或者是使用抽头数更多的FIR滤波器降低计算出的上采样值的误差。 这种简明的FIR滤波器设计方法无需借助复杂精密的滤波器设计工具就能提供优异的结果。 参考资料: 1.A.V. Oppenheim、R.W. Schafer,《离散时间信号处理》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1989年。 2.H. Stark、J.W. Woods、I. Paul,《使用直接傅里叶逆转换和最优插值法对计算机体层摄影术进行探讨》,IEEE生物医学工程通讯第28期,496到505页(1981年)。 3.R.W. Schafer、L.R. Rabiner,《插值的数字信号处理方法》,IEEE第61期会刊,692到702页(1973年) 4.R. Crochiere、L.R. Rabiner,《多速率数字信号处理》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1983年。 5.D. Pellerin、D. Taylor,《轻松VHDL设计》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1997年。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化
  • 热度 28
    2015-3-14 22:12
    1276 次阅读|
    0 个评论
    采样就是采集模拟信号的样本。通常采样指的是下采样,也就是对信号的抽取。其实,上采样和下采样都是对数字信号进行重采,重采的采样率与原来获得该数字信号的采样率比较,大于原信号的称为上采样,小于的则称为下采样。上采样是下采样的逆过程,也称增取样或内插。 本文介绍一种使用Virtex-6器件和免费WebPACK工具实现实时四倍上采样的方法。 许多信号处理应用都需要进行上采样。从概念上讲,对数据向量进行M倍上采样的最简单方法是用实际频率分量数的(M-1)倍个零填充数据向量的离散傅里叶变换(DFT) ,然后将零填充向量转换回时域 。但这种方法计算量很大,因此不能在FPGA内部高效实现。在本文介绍的高效并行实时上采样电路中,每个ADC时钟可产生M个上采样值,其中M是所需的上采样倍数。在我们的Virtex-6 XC6VLX75T FPGA实现方案中,上采样倍数M为4,可以作为较普遍方法的一个实例。 我们并行上采样方法的总体概念源于某些作者所称的“窗口SINC插值”,这种方法在文献资料 中有一些非常精彩的专文介绍。 为了更好的说明,现以图1中所示的16MHz模拟信号为例。该信号的表达式为: 等式 1 图1 - 展示上采样过程的16MHz信号实例 如果用12位ADC以80MHz的频率对图1所示的信号进行采样或量化,输入范围为ADC完整输入范围的97.7%,则每个信号周期只能采样五次,产生的样本数据序列如图2所示。如果对该示例数据序列进行四倍上采样,则有效采样率为320MHz,每个信号周期能够提供20个样本。虽然您可以使用本文介绍的方法进行更高倍数的上采样,但为了说明起见我们还是使用M=4的上采样。 图2 - 本图是12位ADC,输入范围为ADC完整输入范围的97.7%,用80MHz或每周期五次频率对图1的模拟信号采样得到的样本数据序列实例。 当然,还可以通过直接在ADC生成的数据序列的每个实际样本值之间插入(M-1)个零来获得上采样数据向量及所需的样本数(公认效果较差)。该“零插入步骤”对应于复制频域中的原始信号频谱。通过对得到的“零填充”时域信号进行低通滤波,就能去除频域中所需频谱的“复本”,从而获得上采样数据向量。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化 FIR滤波器设计 频域中的理想(砖墙式)低通滤波器相当于在时域中用无限域Sinc函数作卷积。因此为近似化所需的卷积运算,可让前述的零填充时域信号通过速率为ADC时钟频率M倍的对称低通FIR滤波器,该滤波器拓扑结构与图3所示的示例31抽头FIR滤波器相同。用这种方法,我们可以实时生成上采样数据向量。图3中的R1、R2、...、R31代表速率为ADC时钟频率M倍的寄存器,C0、C1、…、C15代表FIR滤波器的系数。 图3 - 当滤波器工作在基本ADC时钟频率的M倍频率时,零插入步骤中使用31抽头FIR滤波器每时钟周期可生成一个上采样数据值 需要说明的是,图3所示的FIR滤波器中的大部分寄存器在任何特定时钟间隔内都会包含0,而非实际的样本数据。以M=4为例,当R1包含实际样本数据时,R2、R3和R4将包含0。当R1包含实际样本数据时,R5、R9、R13、R17、R21、R25和R29也将包含实际样本数据,其余的寄存器将包含0。在下一时钟间隔中,R2、R6、R10、R14、R18、R22、R26和R30将包含实际样本数据。 如图3所示,由于在通过FIR滤波器的每M个样本中有M-1个样本为0,就M=4、使用31抽头FIR滤波器的情况而言(如图4所示),您可以将滤波器分解开,并行产生M个输出。采用这种实现方案,并行FIR滤波器的工作频率为ADC的基本时钟频率,而非ADC时钟频率的M倍。 图4 - 通过在任何给定时钟周期内对图3中每四个寄存器中唯一一个包含非零数据的寄存器进行观察,可以拆解该滤波器,再让滤波器在以基础ADC时钟频率运行的情况下并行 如图4所示,您可以设定窗口SINC函数的系数Cw(n)来最大限度地减少实现该FIR滤波器所需的乘法器数量。对于T个抽头的低通FIR滤波器而言,可通过下式得出最佳系数: 等式2 这里的汉宁窗系数的计算方法为: 等式3 窗口SINC函数系数Cw(n)随即通过对应的C(n)和H(n)值相乘即可得到,如: 等式 4 在M=4时,如果按上面介绍的方法计算31抽头FIR滤波器的系数,令C0=1.0,C4=C8=C12=C15=0,则无需使用与图4中这些系数有关的9个乘法器。此外,由于生成UPSAMPLED VALUE(1)每个系数会使用两次,用户可以“折叠”该实现方案,比如在相乘之前让R1和R8相加,这样就可以去掉四个乘法器。最后得到的设计仅使用18个乘法器每时钟周期就可产生四个上采样值。需要注意的是按上文介绍的设计方法,每个原始样本值会原样从并联滤波器输出。 我们使用图5所示的可综合VHDL 模型评估图4所示电路的性能。该VHDL实现方案假定样本数据为12位,即可能来自美国模拟器件公司的AD9670八通道超声前端集成电路的数据。滤波器系数表达为25位定点常数,以与集成到FPGA芯片上的乘法器输入位数相匹配。来自ADC的输入样本先馈入与输入引脚相连的寄存器(图4中的R1),上采样输出值则使用与输出引脚相连的寄存器。寄存器R2到R8属芯片内部寄存器。寄存器R1到R8故意设定为15位宽度,以便为综合后逻辑提供执行计算所需的动态余量。该设计能检查溢出或下溢,还能将结果钳制在有效范围以内。 图5 - 该VHDL源代码使用单进程和25位定点系数实现图4的滤波器拓扑结构。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化 无需流水线化 图6显示的是使用免费的WebPACK工具中提供的14.7版ISim仿真器对该VHDL模型进行仿真并将馈送图2中的采样/量化12位数据序列后得到的上采样数据序列。每个原始的12位样本均保持不变,原因上文已述。原始波形中每个实际样本之间插入了三个新样本。 图6 - 该图表显示的是VHDL模型生成的上采样数据序列 计算所得(上采样所得)值与原始模拟信号中理想值之间最大的误差为整个范围的0.464%,平均误差为整个范围的0.070%。当然因初始量化步骤原因,在采样/量化12位源矢量数据值中存在1/2 LSB的误差(合整个范围的0.012%)。 布局布线设计使用19个DSP48E1模块,但占用的Virtex-6 Slice资源不足1%,无需流水线化即可运行在107MHz下。 我们使用WebPACK工具14.7版在XC6VLX75T-3FF484 Virtex-6 FPGA上实现这一上采样器。布局布线设计占用该器件中288个DSP48E1模块中的19个,但使用的Slice资源不足1%。最终得到的上采样电路能够运行在107MHz下。无需让滤波器流水线化即可实现这一性能。此外,我们还开发出了用流水线实现的版本,可以工作在217MHz以上。 虽然XC6VLX75T-3FF484是Virtex-6系列中的最低端成员,但芯片上仍集成有288个带有25x18位乘法器的DSP48E1模块。换言之,在理论上足以实现15个图4所示的并行上采样FIR滤波器。我们制作的原型环形阵列超声系统使用了八套以80MHz的频率运行在XC6VLX75T FPGA上的上采样器,在波束成形之前对来自八通道Analog Devices AD9670超声前端芯片的数据进行上采样处理。在该系统中,上采样器按仿真预测的方式运行,在以AD9670 ADC的基本时钟频率80MHz运行的情况下,能使用上采样到320MHz的数据实时完成波束成形。 最大型Virtex-6 FPGA器件XC6VSX475T包含有2,016个25x18位乘法器,在理论上一个芯片就可以实现106个图4所示类型的上采样滤波器。 只要滤波器使用本文介绍的高效并行拓扑结构进行设计,就能够使用实现在工作频率为107MHz的XC6VLX75T-3FF484 FPGA上的FIR滤波器完成M=4倍的实时上采样。原始数据样本将原封不动通过滤波器,并行产生(M-1)=3个上采样值。这种简明的FIR滤波器设计方法无需借助复杂精密的滤波器设计工具就能提供优异的结果。本文介绍的思路稍加拓展,就可以使用更大的因数进行上采样,或者是使用抽头数更多的FIR滤波器降低计算出的上采样值的误差。 这种简明的FIR滤波器设计方法无需借助复杂精密的滤波器设计工具就能提供优异的结果。 参考资料: 1.A.V. Oppenheim、R.W. Schafer,《离散时间信号处理》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1989年。 2.H. Stark、J.W. Woods、I. Paul,《使用直接傅里叶逆转换和最优插值法对计算机体层摄影术进行探讨》,IEEE生物医学工程通讯第28期,496到505页(1981年)。 3.R.W. Schafer、L.R. Rabiner,《插值的数字信号处理方法》,IEEE第61期会刊,692到702页(1973年) 4.R. Crochiere、L.R. Rabiner,《多速率数字信号处理》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1983年。 5.D. Pellerin、D. Taylor,《轻松VHDL设计》,Prentice Hall,新泽西州恩格尔伍德克利夫斯,1997年。 【分页导航】 第1页: 实现实时四倍上采样 第2页: FIR滤波器设计 第3页: 无需流水线化
  • 热度 21
    2013-9-18 08:34
    1221 次阅读|
    2 个评论
      .
  • 热度 22
    2013-5-14 08:30
    1083 次阅读|
    0 个评论
    DSP对电子系统设计来说非常重要,因为它能够迅速地测量、过滤或压缩即时的模拟信号。这样有助于实现数字世界和真实(模拟)世界的通信。但随着电子系统进一步精细化,需要处理多种模拟信号源,迫使工程师不得不做出艰难的决策。是使用多个DSP并将其功能与系统的其余部分同步更具优势?还是采用一个能够处理多功能的具有精细软件的高性能DSP更具优势? 由于当今的系统非常复杂,在许多情况下,单DSP的实现方案根本没有足够的处理能力。同时,系统架构也不能满足多芯片系统带来的成本、复杂性和功耗要求。 FPGA已成为需要高性能DSP功能的系统的理想选择。事实上,与单独的数字信号处理器相比,FPGA技术常常能够为高难度的DSP挑战提供大为简化的解决方案。要明白其中的缘由,需要回顾一下DSP的起源以及发展。 专用微处理器 在过去二十年里,传统的DSP架构一直在竭尽全力地跟上不断提高的性能需求的步伐。但随着视频系统大踏步地迈进高清和3D时代,并且通信系统为实现更高带宽已将现有技术发挥到极致,设计人员需要替代性的实现策略。常用于实现数字信号处理算法的硬件不外乎如下三种基本器件之一:微处理器、逻辑电路和存储器。部分设计还需要额外的硬件来实现模数(A/D)和数模(D/A)转换以及高速数字接口。 传统的数字信号处理器是设计用于实现专门目的的微处理器。这类处理器非常适合算法密集的任务,但是性能却受时钟速率和其内部设计顺序性的限制。这限制了它们对输入数据采样每秒最多执行的运算次数。一般来说,每执行一次算术逻辑单元(ALU)运算需要三或四个时钟周期。多核架构可以提升性能,但是提升幅度仍然有限。因此,采用传统的信号处理器设计必须将架构单元重复用于算法实现。对每次执行的加、减、乘或其它任何基本运算,不论是内部还是外部反馈,每次执行都必须循环通过ALU。 不幸的是,在处理当今众多的高性能应用时,这种传统的DSP难以满足系统的要求。在过去为此提出过多种解决方案,包括在一个器件中使用多个ALU,或在一块板上布置多个DSP器件。然而,这些方案往往会造成成本的大幅上升,并且只是把问题推向另一个领域。例如:用多个器件提高性能遵循指数曲线。要让性能提高一倍,需要两个器件。再提高一倍,则需要四个器件,依此类推。另外,编程人员往往从注重信号处理功能转为注重多个处理器与内核之间的任务调度。这样会产生大量的附加代码,而且这些代码会成为系统开销,而不是用于解决眼前的数字信号处理问题。 FPGA技术的引入为解决DSP实现方案日益增长的复杂性带来了福音。FPGA最初开发用于整合和集中分立的存储器和逻辑电路,以实现更高的集成度、更出色的性能以及更高的灵活性。FPGA技术已成为当今使用的几乎每一款高性能系统的重要组成部分。与传统的DSP相比,FPGA是由可配置逻辑块(CLB)、存储器、DSP逻辑片(Slice)及一些其它元件组成的统一阵列构成的巨大并行结构。它们既可以使用VHDL和Verilog等高级描述语言进行编程,也可以在方框图中用系统生成器(System Generator)编程。FPGA还提供众多的专用功能和IP核,用于以高度优化的方式直接完成实现方案。 在FPGA中完成数字信号处理的主要优势在于能够根据系统要求定制实现方案。这意味着对于多通道或高速系统,用户可以充分利用FPGA器件的并行性来实现性能的最佳化,而对低速系统,则可以更多地采用串行方式完成设计。这样,设计人员就能够根据算法和系统的要求来定制实现方案,而不必折衷期望的理想设计来迎合纯顺序器件的诸多局限。另外,超高速I/O通过最大限度地提高从捕捉经处理链再到最终输出的数据流,可进一步降低成本并减少瓶颈问题。 下面以一个同时使用传统DSP架构和FPGA架构的FIR滤波器实现方案为例,来说明每种解决方案的优劣。 数字FIR滤波器实例 有限脉冲响应(FIR)滤波器是一种使用最广的数字信号处理元件。设计人员使用滤波器来改变数字信号的幅度或频谱,通常用于隔离或突出样本数据频谱中的特定区域。从这个角度说,可以把滤波器视为信号的预处理方式。在典型的滤波器应用中,输入数据样本通过小心同步的数学运算与滤波器系数相结合(这取决于滤波器的类型和实现策略),随后数据样本进入下一个处理阶段。如果数据源和目的地都是模拟信号,则数据样本必须首先通过A/D转换器,而结果则必须馈送给D/A转换器。 最简单的FIR滤波器类型采用一系列的延迟元件、乘法器和加法器树或加法器链来实现。 下面的等式是单通道FIR滤波器的数学表达式: 在选择滤波器的理想长度和系数值时,有多种设计工具可供使用。其目的是通过选择适当的参数来实现所需的滤波器性能。参数选择最常用的设计工具是MATLAB。一旦选定了滤波器参数,就可以用数学等式实现。 实现FIR滤波器的基本步骤包括:对输入数据流采样;在缓冲区组织输入样本,以便让每个捕捉到的样本与每项滤波器系数相乘;让每个数据样本与每项系数相乘,并累加结果;输出滤波结果。 使用“相乘累加法”在处理器上实现FIR滤波器的典型C语言程序,如下列代码所示: /* *捕捉输入数据样本 */ datasample=input(); /* *将新数据样本装入缓冲器 */ S =datasample; /* *将每个数据样本与每项系数相乘并累加结果 */ y=0; for(i=0;i{ y+=k *S ; } n=(n+1)%N; /* *输出滤波结果 */ output(y); 《电子设计技术》网站版权所有,谢绝转载 图3所示的实现方案被称为相乘累加或MAC型实现方案。这基本上就是用传统的DSP处理器实现滤波器的方法。采用内核时钟速率为1.2GHz的典型DSP处理器并以这种方式实现的31抽头FIR滤波器的最高性能约为9.68MHz,或最大的输入数据率为968MS/s。 这种设计需要存储器存储数据和系数,可以混合采用FPGA内部的RAM和ROM。RAM用于存储数据样本,故而采用循环的RAM缓冲器实现。字的数量与滤波器抽头数相等,位宽按样本大小设置。ROM用于存储系数。在最糟糕的情况下,字的数量与滤波器抽头的数量相等,但如果存在对称,则可以减少字的数量。位宽必须足以支持最大的系数。因为数据样本和系数数据都随每个周期改变,所以需要全乘法器。累加器负责将产生的结果累加起来。因为随着滤波器采集数据,累加器的输出会随每个时钟周期改变,所以需要捕捉寄存器。当全套N个样本完成累加后,输出寄存器负责捕捉最终结果。 如果采用MAC模式,DSP48则非常适用,因为DSP48 Slice内含输入寄存器、输出寄存器和加法器单元。实现31抽头MAC引擎需要的资源包括一个DSP48、一个18kb块RAM(block RAM)和9个逻辑片。另外,还需要一些逻辑片用于采样、系数地址生成和控制。如果FPGA内置有600MHz的时钟,则在一个-3速度等级的Xilinx 7系列器件中,该滤波器能够以19.35MHz或1,935MS/s的输入采样速率运行。 如果系统规范需要更高性能的FIR滤波器,则可采用并行结构来实现。图5显示了直接I型实现方案的方框图。 直接I型滤波器结构能够在FPGA中实现最高性能。这种结构(通常也被称作脉动FIR滤波器)采用流水线和加法器链,使DSP48 Slice发挥出最高性能。输入馈送到用作数据样本缓冲器的级联寄存器;每个寄存器向DSP48提供一个样本,然后乘以对应的系数;加法器链存储部分乘积,然后依次相加,从而得到最终结果。 这种设计无需外部逻辑电路支持滤波器,并且该结构可扩展用于支持任意数量的系数。因为没有高扇出的输入信号,所以这种结构能够实现最高性能。实现31抽头FIR滤波器仅需要31个DSP48逻辑片。如果FPGA内置有600MHz的时钟,则在一个-3速度等级的Xilinx 7系列器件中,该滤波器能够以600MHz或600MS/s的输入采样速率运行。 从这个实例可以清晰地看出,FPGA不仅在性能上显著超越了传统的数字信号处理器,而且要求的时钟速率也显著降低(因此,功耗也显著降低)。 这个实例只反映了采用PFGA实现FIR滤波器的两种技术。为了充分利用数据采样率规范,可对该器件进行进一步定制,此时,数据采样率可在连续MAC运算极值和全并行运算极值之间任取。用户还可考虑在包括对称系数、插值、抽选、多通道或多速率的资源利用和性能方面进行更多的权衡取舍。Xilinx CORE Generator或System Generator实用工具可以帮助用户充分发掘这些设计变量和技术。 在传统DSP和FPGA之间选择 传统的数字处理器已经有多年的应用历史,当然具有为特定问题提供最佳解决方案的实例。如果系统采样率低于数kHz且为单通道实现,DSP可能是不二之选。但是,当采样率增加到数MHz以上,或者如果系统要求多通道,FPGA就越来越具优势。在高数据率条件下,DSP可能只能勉为其难地在不造成任何损耗的情况下采集、处理和输出数据。这是因为在处理器中存在大量的共享资源、总线乃至内核。然而,FPGA却能够为每项功能提供专门的资源。 DSP是基于指令而非基于时钟的器件。一般来说,对单个样本上的任何数学运算需要三到四条指令。数据必须首先经输入端采集,再发送到处理内核,每完成一次运算后再循环通过内核,然后发送到输出端。相比之下,FPGA基于时钟,故每个时钟周期都有可能在输入数据流上进行一次数学运算。 由于DSP的运算以指令或代码为基础,编程机制为标准C语言,或者在需要更高性能的情况下,采用低级汇编语言。这种代码可能包含高级的决策树或者转移操作,而难以在FPGA中实现。例如:存在大量的用于执行如音频和电话编解码器之类的预定义功能或标准的遗留代码。 FPGA厂商和第三方合作伙伴已经意识到将FPGA用于高性能DSP系统的优势,并且如今已有许多IP核广泛应用于视频、图像处理、通信、汽车、医疗和军用等大部分垂直应用市场。与将高级系统方框图映射成为C语言代码的DSP设计相比,将高级系统方框图分解为FPGA模块和IP核会更加简便易行。 从DSP转向FPGA 考查一些主要标准将有利于在传统DSP和FPGA之间做出决策(表1)。 软件编程人员的数量远远超过硬件设计人员的数量,这已是不争的事实。DSP编程人员的数量与FPGA设计人员的数量之间的关系也是如此。不过,让系统架构师或者DSP设计人员转为使用FPGA的难度,并不像让软件编程人员转为从事硬件设计那么大。有大量的资源可以显著减轻对DSP算法开发和FPGA设计工作的学习过程。 主要的障碍是从基于样本和事件的方法转向基于时钟的问题描述和解决方案。如果能够在设计流程的系统架构和定义阶段就能够完成,对这种转换的理解和应用就会简单得多。由不同的工程师和数学专家来定义系统架构(DSP算法和FPGA设计在某种程度上相互孤立)是很寻常的事情。当然,如果每个成员对其他小组成员面临的难题有一定程度认识的话,这个过程会顺利得多。 《电子技术设计》网站版权所有,谢绝转载
相关资源
  • 所需E币: 3
    时间: 2019-12-25 22:00
    大小: 66.92KB
    上传者: 238112554_qq
    实验名称:FIR滤波器实验学时:5所属课程:DSP技术内容提要:数字滤波的作用是滤除信号中某一部分频率分量。信号经过滤波处理,就相当于信号频谱与滤波器的频率响应相乘的结果。从时域来看,就是输入信号与滤波器的冲激响应作卷积和。数字滤波器在各种领域由广泛的应用,例如数字音响、音乐和语音合成、躁声消除、数据压缩、频率合成、谐波消除、过载检测、相关检测等。本实验主要学习数字滤波器的DSP实现原理和C54X编程技巧,并通过CCS的图形显示工具观察输入/输出信号波形以及频谱的变化。该实验应该安排在串口和定时器操作实验之后进行。使用仪器:DES5402PP仪器套数:30每组人数:1最大容量:30实验方式:上机……
  • 所需E币: 3
    时间: 2019-12-25 21:43
    大小: 66.91KB
    上传者: 978461154_qq
    在ADSP-2126x上编写的优化过的FIR滤波器程序(用C和汇编编写)……
  • 所需E币: 4
    时间: 2019-12-25 21:45
    大小: 23KB
    上传者: 238112554_qq
    用循环缓冲法实现的FIR滤波器:1.对于N级FIR滤波器。在数据存储器中开辟一个N单元的缓冲区,用来存放样本和你的FIR系数;2.从最新样本开始取数;(关于这一点,存在一点问题,我认为只要你的系数和数据乘对了就OK了,我写的那个是由底部取起)3.读到最后一个样本后,输入新样本代替最老样本,而其他数据位置保持变(这使得新老样本的位置关系不是很明显,但是用线性缓冲法的话就不一样。)4.定义BK大小,这是实现循环的关键,可以是缓冲地址首尾相连,就象一个圆圈一样……
  • 所需E币: 5
    时间: 2019-12-25 21:45
    大小: 23KB
    上传者: 二不过三
    用循环缓冲法实现的FIR滤波器:1.对于N级FIR滤波器。在数据存储器中开辟一个N单元的缓冲区,用来存放样本和你的FIR系数;2.从最新样本开始取数;(关于这一点,存在一点问题,我认为只要你的系数和数据乘对了就OK了,我写的那个是由底部取起)3.读到最后一个样本后,输入新样本代替最老样本,而其他数据位置保持变(这使得新老样本的位置关系不是很明显,但是用线性缓冲法的话就不一样。)4.定义BK大小,这是实现循环的关键,可以是缓冲地址首尾相连,就象一个圆圈一样……
  • 所需E币: 3
    时间: 2019-12-25 17:21
    大小: 52.17KB
    上传者: wsu_w_hotmail.com
    基于FPGA实现FIR滤波器的研究……
  • 所需E币: 3
    时间: 2019-12-25 12:30
    大小: 69.67KB
    上传者: 978461154_qq
    CPLD基于FPGA实现FIR滤波器的研究……
  • 所需E币: 4
    时间: 2020-1-4 12:51
    大小: 199.09KB
    上传者: 16245458_qq.com
    数字滤波技术是数字信号处理的一个重要组成部分,滤波器的设计是信号处理的核心问题之一.根据FIR滤波器的原理,提出了FIR滤波器的窗函数设计法,并对常用的几种窗函数进行了比较.给出了在MATLAB环境下,用窗函数法设计FIR滤波器的过程和设计实例.仿真结果表明,设计的FIR滤波器的各项性能指标均达到了指定要求,设计过程简便易行.该方法为快速、高效地设计FIR滤波器提供了一个可靠而有效的途径.MATLAB环境下FIR滤波器的设计与仿真杨大柱(中国人民解放军汽车管理学院装备技术系,安徽蚌埠233011)摘要:数字滤波技术是数字信号处理的一个重要组成部分,滤波器的设计是信号处理的核心问题之一。根据FIR滤波器的原理,提出了FIR滤波器的窗函数设计法,并对常用的几种窗函数进行了比较。给出了在MATLAB环境下,用窗函数法设计FIR滤波器的过程和设计实例。仿真结果表明,设计的FIR滤波器的各项性能指标均达到了指定要求,设计过程简便易行。该方法为快速、高效地设计FIR滤波器提供了一个可靠而有效的途径。关键词:窗函数FIR滤波器MATLAB仿真随着信息时代的到来,数字信号处理已经成为当今FIR滤波器的设计问题实质上是确定能满足所要求一门极其重要的学科和技术,并且在通信、语音、图像、的转移序列或脉冲响应的常数的问题,设计方法主要有自动控制等众多领域得到了广泛的应用。在数字信号处窗函数法、频率采样法和等波纹最佳逼近法等。理中,数字滤波器占有极其重要的地位,它具有精度高、1.2窗函数设计法的步骤【3】【4l可靠性好、灵活性大等特点。现代数字滤波器可以用软窗函数设计法是一种通过截短和计权的方法使无件或硬件两种方式来实现。软件方式实现的优点是可……
  • 所需E币: 5
    时间: 2019-12-25 02:18
    大小: 1.36KB
    上传者: givh79_163.com
    FIR滤波器实现代码……
  • 所需E币: 3
    时间: 2020-1-6 11:19
    大小: 8KB
    上传者: 2iot
    FIR滤波器……
  • 所需E币: 3
    时间: 2019-5-26 19:07
    大小: 1.72MB
    上传者: royalark_912907664
    文中将多种测距转发模式进行对比,最终采用非相干AGC模式实现透传测距系统。系统基于锁相环原理设计了主载波解调模块,用于提取接收中频信号的相位信息;采用AGC(AutomaticGainControl)自动增益控制模块,保证测距滤波器输出的信号加噪声功率固定不变;通过FDATOOL和Xilinx的FIRIP核在FPGA内设计可复用了158阶带通滤波器,实现星上侧音提取;同时设计了相位调制器,将提取出来的侧音信号与由遥测副载波产生模块、遥测数据发生器产生的调制后的遥测数据一起送至相位调制器,完成调制并输出给发射机,最终形成了一个有效并具有实际应用价值的测控应答机透传测距系统。通过仿真和Matlab频谱测试,验证此系统功能正确,能够实现测距转发。