采用FPGA实现多种类型的数字信号处理滤波器

时间:2024-03-08 17:15:46

滤波器是任何信号处理系统的关键组成部分,随着现代应用的日趋复杂,滤波器设计的复杂程度也日益提高。采用 FPGA 设计和实现的高性能滤波器的能力是模拟方法所望尘莫及的。另外,采用FPGA 设计的数字滤波器可以避免模拟设计中存在的某些问题,特别是组件漂移和容差(在高可靠应用中,由温度过高、老化和辐射问题造成)。这些模拟问题会显著降低滤波器的性能,特别是在通带纹波等方面。

 

当然, 数字模型也有自身的缺陷。滤波器数学运算中的舍入可能会带来问题,因为舍入误差会被累加,给性能造成不良影响,比如增大滤波器的噪声基底。工程师可以采取多种方法最大程度地减轻这种影响,例如使用收敛舍入可以获得比传统舍入更好的性能。最终, 舍入误差问题的严重性与模拟器件相比得到了显著降低。

 

将 FPGA 作为滤波器构建模块的主要优势之一在于,如果因为集成原因或者需求变动原因需要调整性能,允许在设计过程的后期修改或者更新滤波器的参数,且产生的影响很小。

 

滤波器类型和拓扑结构

 

大多数熟知数字信号处理的工程师都知道滤波器的主要类型有四种。低通滤波器只允许频率低于预设截止频率的信号通过。高通滤波器与低通滤波器相反,只允许频率高于截止频率的信号通过。带通滤波器只允许频率在预设带宽内的信号通过,不允许其它频率的信号通过。带阻滤波器与带通滤波器相反,不允许频率在预设带宽内的信号通过,但允许其它频率的信号通过。

 

大多数数字滤波器都采用下列两种方法之一来实现: 有限脉冲响应(FIR) 和无限脉冲响应 (IIR)。首先我们深入探讨如何设计和实现 FIR 滤波器。这种滤波器也常被称为窗口 sinc滤波器。

 

为什么我们首先以 FIR 滤波器为重点呢?两种滤波器的最大区别在于有无反馈。对未采用反馈的 FIR 滤波器,在给定的输入响应下,滤波器的输出最终会稳定为 0。而对采用反馈的IIR 滤波器,在相同的给定输入下,输出不会稳定为 0。

 

FIR 滤波器的设计由于未采用反馈,故天生具有稳定性,因为滤波器的所有极点都与原点重合。IIR 滤波器就没有这么幸运。由于在设计 IIR 滤波器的时候,必须精心考虑其稳定性,这样窗口 sinc 滤波器对新接触 DSP 技术的工程师来说,更加易于理解和实现。

 

如果要求工程师绘制理想低通滤波器在频域中的原理框图,大多数工程师会画出和图 1 一样的图。

 

 

采用FPGA实现多种类型的数字信号处理滤波器

 

图 1 所示的频率响应一般称为“砖墙型”滤波器。这是因为通带和阻带之间的过渡非常陡峭,要比现实中能够实现的陡峭很多。这种频率响应还具备其它“理想”特性,例如没有通带波纹以及具有理想的阻带衰减。

 

如果将该图围绕 0 Hz 进行对称扩展,同时扩展到 +/- FS Hz(FS 指采样频率),然后对响应进行离散傅里叶逆变换 (IDFT),就可以得到该滤波器的脉冲响应,如图 2 所示。

 

 

采用FPGA实现多种类型的数字信号处理滤波器

 

这就是图 1 所示理想滤波器频率响应的时域表示法,也称为滤波器内核。FIR 或窗口 sinc 滤波器正是由这个响应而得名,因为画出 sinc 函数的曲线可以得到脉冲响应:

 

 

 

结合滤波器阶跃响应, 频率响应、脉冲响应和阶跃响应提供了有关滤波器性能的所有信息,可用于判断滤波器是否满足设计要求。

频率响应

 

频率响应是工程师在考虑滤波器时所习惯关注的问题。它代表着滤波器改变频域信息的性能。

 

通过频率响应可以观察到截止频率、阻带衰减和通带波纹。在该响应中还可以清晰地观察到通带和阻带之间的滚降,也称为过渡带。通带中的波纹会给滤波信号造成影响。阻带衰减则表明滤波器输出中存在多少不必要的频率。这对需要抑制特定频率的应用意义重大,比如在通信系统中为频分多路复用通道滤波。

 

脉冲响应

 

从脉冲响应中可以抽象出滤波器的系数。但是,要实现滤波器的最佳性能,标准的方法是采用窗函数。窗函数指给截断的脉冲响应应用额外的数学函数,以求减轻截断带来的副作用。

 

在图 2 中,由于纹波的存在,脉冲响应向外无限延伸,尽管纹波的振幅显著降低,但永远不会降低至 0。因此,必须围绕位于中心的主瓣,在两侧对称地按 N+1 的系数截断脉冲响应,这里 N 是期望的滤波器长度(切记 N应为偶数)。脉冲响应被突然截断会给滤波器的频域性能带来不良影响。如果对截断的脉冲响应进行离散傅里叶变换 (DFT),可以观察到通带和阻带都有波纹出现以及滚降性能的下降。这就是为什么一般会采用窗函数来改善性能的原因。

阶跃响应

 

对脉冲响应进行积分所得的阶跃响应体现着滤波器的时域性能以及滤波器自身如何影响该性能。观察阶跃响应时应重点关注的三大参数分别是上升时间、过冲以及线性度。

 

上升时间指从振幅级的 10% 上升到 90% 所需的样本数量,可显示滤波器的速度。要在最终系统中具有实用性,滤波器必须能够区分输入信号中的不同事件,因此阶跃响应必须短于信号中各事件之间的间隔。

 

过冲是指滤波器添加至其正在处理的信号时产生的失真。降低阶跃响应中的过冲有助于判断信号的失真是来自系统,还是来自系统正在测量的信息。过冲不但可增大失真来源的不确定性,降低最终系统性能,而且还可导致系统无法满足所需的性能要求。

 

如果信号的上半部分和下半部分是对称的,则滤波器的相位响应具有线性相位,这是确保阶跃响应的上升沿和下降沿相同的要件。

 

优化滤波器,以在时域和频域中同时实现良好的性能是非常困难的,在这一点上它也是毫无价值的。因此,必须明白需要处理的信息位于哪一个域中。对于 FIR 滤波器而言,需要处理的信息位于频域中,因而频率响应占主导地位。

 

滤波器加窗

 

使用截断脉冲响应不能提供最佳性能数字滤波器,因为它不能展示任何理想的特性。因此设计人员可采用视窗函数来改善滤波器的通带纹波、滚降以及阻带衰减性能。对于截断正弦函数,有许多视窗函数可以使用,如高斯、巴特利特、海明、布莱克曼以及凯塞等。不过最常用的两种视窗函数是海明和布莱克曼。下面将详细介绍这两种视窗。

 

采用这两种视窗不但可降低通带纹波,而且还可提高滤波器的滚降和衰减性能。图 3 是采用布莱克曼和海明视窗后截断正弦函数的脉冲响应和频率响应情况。如图所示,两种视窗均可显著改善通带纹波状况。

 

 

 

滤波器的滚降不仅由视窗决定,而且还由滤波器的字长决定,即系数的数量,也就是常说的滤波器抽头。

 

海明视窗:

w[i] = 0.42 – 0.52 cos (2PI*i/N)

 

布莱克曼视窗:

w[i] = 0.42 – 0.52 cos (2PI*i/N)+ 0.08 cos(4PI*i/N)

 

方程式中 i 为 1 至 N 时,总数等于 N+1个点。

 

要将这些视窗应用于截断脉冲响应,必须用视窗系数乘以截断脉冲系数,得出所需的滤波器系数。

 

虽然视窗类型决定了滚降频率,但经验法则告诉我们,对于所需的跳变带宽,需要的抽头数量为:N=4/BW,其中 BW 为跳变带宽。

实现不同的滤波器拓扑

 

无论最终得到的滤波器类型是什么(是带通、带阻还是高通),所有这些都始于低通滤波器的初始设计。如果知道如何设计低通滤波器和高通滤波器,将两者相结合就可得到带阻及带通滤波器。

 

 

 

 

 

首先看如何将低通滤波器转化成高通滤波器。最简单的方法叫做频谱翻转,即将阻带转换为通带,将通带转换为阻带。执行频谱翻转的方法是翻转每一个样本,同时给中心样本添加一个样本。第二种转换高通滤波器的方法为频谱倒转,即镜像频谱响应,方法很简单,就是倒转每一个其它系数。

 

完成低通滤波器和高通滤波器的设计之后,就可通过组合便捷地生成带通滤波器和带阻滤波器。生成带阻滤波器只需将高通滤波器和低通滤波器并行布置,然后将输出加总。生成带通滤波器则可通过将低通滤波器和高通滤波器串行布置来实现。

实际设计

 

上面的内容现已详细说明了窗式正弦滤波器的情况、视窗应用的重要性以及如何生成不同拓扑的滤波器。不过在 FPGA 中实现滤波器之前,必须使用如 Octave、MATLAB或者 Excel等一种软件工具生成一组滤波器系数。许多这些工具都可提供简化的界面和选项,帮助用户以最少的工作量完成滤波器设计,MATLAB 中的 FDA 工具就是最好的示例。

 

在为所需滤波器生成一组系数后,就可在 FPGA 中实现滤波器。无论决定采用的抽头数量多寡,FIR 滤波器每一级的基本结构是不变的,总是由乘法器、存储以及加法器构成。

 

现在在许多应用中都可看到数字滤波器的身影,而 FPGA 则可为使用它们的系统设计人员带来显著优势。

 

大多数工程师青睐的、迄今为止最简单的方法是使用赛灵思 COREGenerator? 工具的 FIR Compiler,其可为定制和生成高级滤波器提供多种选项。用户可将生成的系数以 COE 文件形式导入 FIR Complier。该文件内含已经为基数赋值的各种滤波器系数。

 

Radix=10;

Coefdata =

-0.013987944,

-0.01735736,

-0.005971498,

0.012068368,

0.02190073,

 

将这些系数加载后,FIR Compiler将显示与所提供系数相对应的该滤波器频率响应,以及阻带衰减与通带纹波等基本性能特征。

 

在使用 FIR Compiler 工具完成滤波器定制后,只要用户使用的是正确的仿真库,CORE Generator 就可生成实现设计以及在实现之前的行为仿真过程中对其仿真所需的全部文件。

 

如果愿意,用户还可以使用用户自己生成的 HDL 实现该滤波器。这种方法一般只有在用户最终实施目的是ASIC,只是将 FPGA 实施用作原型设计系统时使用。在这种情况下,第一步是量化滤波器系数,以便使用浮点结果的固定数字表示。由于滤波器系数可以为正,也可以为负,常见的做法是采用二的补码格式表示这些系数。在完成系数的量化后,就可将其当作常数用于HDL 设计中。

 

现在在许多应用中都可看到数字滤波器的身影,而 FPGA 则可为需要使用它们的设计人员带来显著优势。使用基本数学工具,结合 FPGA 内核生成工具或者直接使用 HDL,可便捷设计和实现窗式正弦滤波器。