高效FIR滤波器设计
2010 年第 32 期
1.FIR 数字滤波器理论简述
数字滤波器包括有限冲激响应 (FIR,Finite Impulse
Response) 滤波器和无限冲激 响 应 (IIR,Infinite Impulse
Response)滤波器两大类,其中 FIR 滤波器因其可以得到严格
的线性相位、有限精度的计算不会产生振荡、运算速度快等优
点受到了人们更多的青睐。
1.1FIR 滤波器的特点
(1)既具有严格的线性相位,又具有任意的幅度;(2)FIR
滤波器的单位抽样响应是有限长的, 因而滤波器性能稳定;
(3)只要经过一定的延时,任何非因果有限长序列都能变成因
果的有限长序列,因而能用因果系统来实现;(4)FIR 滤波器由
于单位冲击响应是有限长的, 因而可用快速傅里叶变换(FFT)
算法来实现过滤信号,可大大提高运算效率。 (5)FIR 也有利于
对数字信号的处理,便于编程,用于计算的时延也小,这对实
时的信号处理很重要。 (6) FIR 滤波器比较大的缺点就是阶次
相对于 IIR 滤波器来说要大很多。
1.2FIR 滤波器的实现方法
(1)在 CPU 或 DSP 处理器上采用软件实现。 这种方法具
有稳定性高、不受环境影响、灵活性好等优点,但由于其运算
量过大, 对于无线通讯、 雷达以及工业控制等实时高速的系
统,实际中可能无法实现。 (2)用单片通用数字滤波器实现。 它
的优点是使用方便,但由于字长和阶数的规格较少,不能完全
满足实际需要。 (3)用 ASIC 实现。 这种芯片将相应的滤波算法
在芯片内部用硬件实现,无需进行编程,能够满足实际系统速
度上的要求。 但该芯片专用性强,且设计费用高、周期长,因此
应用受到很大的限制。 (4)用 FPGA(Field Programmable Gate
Array,现场可编程门阵列)实现。 它是一种采用纯硬件的方式
来实现 FIR 滤波器的方式,这种方法突出的优点是设计灵活、
运算速度快,特别适合在微波、卫星等高频应用场合使用。
FPGA 的一个缺陷是缺乏实现乘法运算的有效结构,本文
介绍了一种能够有效解决此问题的办法, 并在此基础上进一
步实现了一种高效 FIR 滤波器的设计。
1.3FIR 滤波器设计原理
FIR 数字滤波器是一个线性时不变系统 (LTI),N 阶因果
有限冲激响应滤波器可以用传输函数 H(z)来描述,
H(z)=
N
k = 0
Σh(k)z-k (1.1)
在时域中, 上述有限冲激响应滤波器的输入输出关系如
下:
y[n]=x[n]*h[n]=
N
k = 0
Σx[k]h[n-k] (1.2)
其中,x[n]和 y[n]分别是输入和输出序列。
该结构需用 n 个乘法器,n-1 个加法器。 实现有两种形式,
如下图所示:
a.直接结构形式
b.转置结构形式
当冲击响应满足下列条件时, FIR 滤波器具有对称结构,
为线性相位滤波器:
h(n)=h(N-1-n) (1.3)
这种对称性,可使得乘法器数量减半:对 n 价滤波器,当 n
为偶数时,乘法器的个数为 n/2 个;当 n 为奇数时,乘法器的个
数为(n+1)/2 个。 在电路实现中,乘法器占用的逻辑单元数较
多,乘法器的增加,意味着电路成本增加,另外对电路的工作
速度也有影响。
N 阶线性相位的因果 FIR 系统的单位冲激响应滤波器可
用对称冲激响应,
h[n]=h[N-n] (1.4)
或者反对称冲激响应来描述。
h[n]=-h[N-n] (1.5)
具有对称冲激响应的 FIR 传输函数的冲激响应可写成如
下形式:
当 N 为偶数时
H(z)=
N
n = 0
Σh[n]z-n =
N
2 -1
n = 0
Σh[n](z-n +z-(N-n)
)+h( N
2 )z
- N
2 (1.6)
当 N 为奇数时
H(z)=
N
n = 0
Σh[n]z-n =
N+1
2 -1
n = 0
Σ h[n](z-n +z-(N-n)
) (1.7)
则 FIR 线性相位系统的结构可转化成如图 2 (a) 和图 2
(b)所示。
图 2(a) N 为奇数
高效 FIR 滤波器设计
王聪慧
(南京机电职业技术学院 江苏 南京 211135)
【摘 要】分析 FIR 滤波器的基本结构和原理,提出了高效 FIR 滤波器的实现方法。 基于 MATLAB 用窗函数法设计一个输
入 10 位,输出 10 位的 16 阶线性相位 FIR 滤波器,此滤波器 Fs 为 80kHz,Fc 为 10kHz,确定了滤波器的系数,最后用 VHDL 语
言实现了 16 阶常系数 FIR 滤波器,并用 QuartusⅡ软件对滤波器进行了逻辑仿真,结果符合设计要求。
【关键词】VHDL 语言;MATLAB;FIR 数字滤波器;Quartus
◇职业教育◇
117
2010 年第 32 期
图 2(b) N 为偶数
本论文设计的是一个输入输出都是 10 位的 16 阶 FIR 滤
波器,所以我们采用图 2(b)所示的结构。
2.FIR 滤波器电路设计过程
2.1FIR 滤波器设计方案
根据要求,要设计一个输入 10 位,输出 10 位的 16 阶线
性相位 FIR 滤波器, 此滤波器 Fs 为 80kHz,Fc 为 10kHz。 由
MATLAB 的滤波器设计模块可得 FIR 滤波器的参数为:
[-31、-88 、106、-54、70、239、401、499、499、401、239、70、-
54、106、88、31]
基本的电路图就是和上图 2(b)一致的。 用一个 8 位的 D
触发器来实现延时的功能,设计一个通用的乘法器实现 h[n]的
乘法运算,最后将所有的数加起来,考虑到位数问题,可以两
个数分别相加,其和再两两相加,直到加成一个数。 因位数不
同每一步都设计一个加法器。
由于直接做两个有符号数相乘较复杂, 而根据给定数据
的特点,负数和正数的个数为整数个,则可以先不考虑符号做
乘法,而把乘数为负数和正数的分别相加,最后他们的和做减
法(正—负),即实现了正数和负数的相加。 而减法器和加法器
基本是一致的,程序复杂度没有变化。
具体说来,各子模块都是由 VHDL 语言编写的,而最后总
的电路图则由子模块生成的元件在图形界面里构成框图,其
基本的样子和原理图是一致的。
总体原理图如下所示:
2.2 子模块功能设计
2.2.110 位 D 触发器
输入:clk:时钟信号,din:10 位有符号二进制数
输出:dout: 10 位有符号二进制数
功能: 是在 clk 上升沿到来时,dout 端口接受 din 端口数
据,完成数据的延时。
主要程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity delay is
port(x :in signed(9 downto 0);
clk,reset :in std_logic;
d :out signed(9 downto 0));
end delay;
architecture behaviour of delay is
begin
process(reset,clk)
begin
if(reset='1')then
d<=(others=>'0');
elsif(clk'event and clk='1')then
d<=x;
end if;
end process;
end behaviour;
2.2.2 加法器
加法器有 10 位输入 11 位输出,21 位输入 22 位输出,22
位输入 23 位输出,以及一个减法器,其功能和程序是基本一
致的。 即逐位相加,由于进位,结果会比输入数据高出一位,补
出来的高位都重复符号位,然后再相加,这样就可以保证符号
位不会出错,减法器不需要扩展位。
输入:clk 时钟信号,两个有符号二进制数
输出:比输入最大高一位的有符号二进制数
主要程序(以两个 10 位相加为例):
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity add10 is
port(x:in signed(9 downto 0);
y:in signed(9 downto 0);
clk,reset :in std_logic;
d :out signed(10 downto 0));
end add10;
architecture behaviour of add10 is
signal s1,s2 : signed (10 downto 0);
begin
process(reset,clk)
begin
if(reset='1')then
d<="00000000000";
elsif(clk'event and clk='1')then
s1<=x(9)&x;
s2<=y(9)&y;
d<=s1+s2;
end if;
end process;
end behaviour;
2.2.3 乘法器
数乘法器的设计是整个 FIR 滤波器的设计中最关键的部
分, 如果使用通用乘法器来实现常 数 乘 法, 将 会 十 分 浪 费
FPGA 的资源。 所以在乘常数时我们可以采用另一种高效的方
法来实现常数乘法。 即采用以为相加和移位相减的方法来实
现。 具体来说就是把一个整数分解成 2 的幂相加相减的方式
来实现乘法。 其中, 与 2 的幂相乘就是使被乘数实现移位操
作。 而针对不同的乘数使用不同的方法,即:乘加,乘减法来实
现可以使执行的效率更高。
◇职业教育◇
118
2010 年第 32 期
如果做固定数字的乘法器,即被乘数已知,那么就不需要
进行判断,而直接移位相加。 实际做的是一个有符号数乘以无
符号数, 因此在移位相加的时候根据无符号数来移位有符号
数,扩展到 21 位,所有没有移到的高位都是补以原来最高位,
即重复符号位,低位则补 0。
输入:clk 时钟,两个乘数分别为 10 位(无符号)和 11 位
(有符号)
输出:21 位的数
程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;|
entity mul is
port(x:in signed(10 downto 0);
cas:in unsigned(9 downto 0);
clk,reset :in std_logic;
d :out signed(20 downto 0));
end mul;
architecture behaviour of mul is
signal s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s: signed (20 downto 0);
begin
process(reset,clk)
begin
if(reset='1')then
d<="000000000000000000000";
elsif(clk'event and clk='1')then
if(cas(0)='1')then s0<=x(10)&x(10)&x(10)&x(10)&x(10)&x
(10)&x(10)&x(10)&x(10)&x(10)&x;
else s0<="000000000000000000000";end if;
if(cas(1)='1')then s1<=x(10)&x(10)&x(10)&x(10)&x(10)&x
(10)&x(10)&x(10)&x(10)&x&"0";
else s1<="000000000000000000000";end if;
if(cas(2)='1')then s2<=x(10)&x(10)&x(10)&x(10)&x(10)&x
(10)&x(10)&x(10)&x&"00";
else s2<="000000000000000000000";end if;
if(cas(3)='1')then s3<=x(10)&x(10)&x(10)&x(10)&x(10)&x
(10)&x(10)&x&"000";
else s3<="000000000000000000000";end if;
if(cas(4)='1') then s4<=x(10)&x(10)&x(10)&x(10)&x(10)
&x(10)&x&"0000";
else s4<="000000000000000000000";end if;
if(cas(5)='1') then s5<=x(10)&x(10)&x(10)&x(10)&x(10)
&x&"00000";
else s5<="000000000000000000000";end if;
if(cas(6)='1') then s6<=x(10)&x(10)&x(10)&x(10)&x&"
000000";
else s6<="000000000000000000000";end if;
if (cas (7) ='1') then s7 <=x (10)&x (10)&x (10)&x&"
0000000";
else s7<="000000000000000000000";end if;
if(cas(8)='1') then s8<=x(10)&x(10)&x&"00000000";
else s8<="000000000000000000000";end if;
if(cas(9)='1') then s9<=x(10)&x&"000000000";
else s7<="000000000000000000000";end if;
s<=s1+s2+s3+s4+s5+s6+s7+s0+s8+s9;
d<=s;
end if;
end process;
end behaviour;
3.仿真结果
3.1FIR 滤波器波形仿真
3.2MATLAB 计算与仿真值比较
经比较,仿真结果与输出信号理论值基本吻合,实验符合
设计要求。 仿真实验结果表明,该 FIR 滤波器的实现方案,具
有工作速度快、实时信号好、节省硬件资源等特点,能够满足
实际的数字系统的要求。 科
输出结果 y[n]
理论值 仿真结果
MATLAB 卷积值/(2^12) 经仿真器仿真
y[0] 1.1959 1
y[1] 1.9521 2
y[2] 2.8783 3
y[3] 3.8822 3
y[4] 3.2428 3
y[5] 2.1860 2
y[6] 1.0817 1
y[7] -0.4119 0
y[8] -1.4246 -1
y[9] -2.2898 -2
y[10] -3.7106 -3
y[11] -2.8700 -3
y[12] -3.4657 -3
y[13] -2.2266 -2
y[14] -0.7408 -1
y[15] 0.1314 0
y[16] 0.7959 1
(上接第 88 页) 贸易有关的规范性文件都必须公布并履行通
知义务。 因此, 严格按照现行法律法规来解决纠纷对我国不
利, 而如可以适用调解原则可为我国一系列法律政策的出台
赢得时间。
综上,调解是一种能够达到当事人无反悔、无申诉、无上
访的理想结果的审判方式。 行政诉讼调解机制的确立势在必
行,使适宜调解的案件能真正取得应有的法律和社会效果。 只
有这样才能不负民众、国家的重托,才能为社会的和谐、稳定
作出贡献。 科
【参考文献】
[1]李浩.关于建立诉讼上和解制度的探讨 I 刀.北京:清华法律评论,
199(2):211.
[2]姜明安.行政法和行政诉讼法[M).北京:法律出版社,2003:60.
[3]翁岳生.行政法(下册)[M).中国法制出版社,删 2:1467.
[4]罗豪才.行政诉讼的一个新视角—如何将博弈论引入行政诉讼过
程 I 巧.法商研究,2003(6):51.
●
●
◇职业教育◇
119
高效FIR滤波器设计.pdf