图 1 所示的频率响应一般称为“砖墙型”滤波器。这是因为通带和阻带之间的过渡非常陡峭,要比现实中能够实现的陡峭很多。这种频率响应还具备其它“理想”特性,例如没有通带波纹以及具有理想的阻带衰减。
如果将该图围绕 0 Hz 进行对称扩展,同时扩展到 +/- FS Hz(FS 指采样频率),然后对响应进行离散傅里叶逆变换 (IDFT),就可以得到该滤波器的脉冲响应,如图 2 所示。
结合滤波器阶跃响应, 频率响应、脉冲响应和阶跃响应提供了有关滤波器性能的所有信息,可用于判断滤波器是否满足设计要求。
频率响应
频率响应是工程师在考虑滤波器时所习惯关注的问题。它代表着滤波器改变频域信息的性能。
通过频率响应可以观察到截止频率、阻带衰减和通带波纹。在该响应中还可以清晰地观察到通带和阻带之间的滚降,也称为过渡带。通带中的波纹会给滤波信号造成影响。阻带衰减则表明滤波器输出中存在多少不必要的频率。这对需要抑制特定频率的应用意义重大,比如在通信系统中为频分多路复用通道滤波。
脉冲响应
从脉冲响应中可以抽象出滤波器的系数。但是,要实现滤波器的最佳性能,标准的方法是采用窗函数。窗函数指给截断的脉冲响应应用额外的数学函数,以求减轻截断带来的副作用。
在图 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,可便捷设计和实现窗式正弦滤波器。