FIR滤波系数具有对称性,利用MATLAB 设计工具,求得三阶8位FIR滤波系数
h(0)~h(4)={-1,3.75,3.75,-1}
---------------三阶8位的FIR 直接型滤波器VHDL 源程序 ---------------------------------
定义自定库:
package eight_bit_int is
subtype fbyte is integer range -128 to 127 ;
type array_byte is array(0 to 3) of fbyte;
end eight_bit_int;
-------上面程序开始定义的私有库------------------------------------
-----标准库调用声明----------------------------------------------
library work;
use ieee.std_logic_1164.all;
use_ieee.std_logic_arith.all;
entity firfilter is
port
(
clk: in std_logic;
x: in fbyte;
y: out fbyte
);
end firfilter;
arichitecture fir of firfilter is
signal t: array_byte;
begin
p1: process
begin
wait unitl clk='1'; ------上升沿检测
------滤波器表达式
y<=2*t(1)+t(1)+t(1)/2+t(1)/4+2*t(2)+t(2)+t(2)/2+t(2)/4-t(3)-t(0);
------输入数据移动,每个时钟移动一次------------------------
for i in 3 downto 1 loop
t(i)<=t(i-1);
end loop;
t(0)<=x;
end process;
end fir;
上面的程序是标准的FIR 数字滤波器直接型,VHDL程序表达。这种设计对应对称和非对称滤波器设计都很适用。
上面的程序有几处可以改进:
1. 最优的CSD码实现每个滤波器的系数,即3.75=2^2-2^-2;
2. 通过流水线来提高有效的乘法器的速度。输出加法器可以放在流水线平衡树中,如果系数被编码成2的幂的形式,流水线乘法器和加法器就可以合并。
3. 利用对称系数,乘法复杂度,线性相位。
根据上面三点改进最快的设计如下:
wait until clk='1';
t1<=t(1)+t(2); -------加法合并
t2<=t(0)+t(3);
-------第一级流水线处理-----------------
t3<=4*t1-t1/4; --------组合成2的幂相乘
t4<=-t2;
-------第二级流水线处理----------------------
y<=t3+t4;
-------第三级流水线处理,得到结果------------
与开始程序相比,增加4个中间变量寄存器,处理速度大为提高! 这招叫做资源换速度!
|