基于FPGA的四阶IIR数字滤波器设计
本文引用地址:https://www.eepw.com.cn/article/168076.htm
tan<=tmpa(9);tbn<=tmpb(9);
tp<=taa*tbb;
p<=(others=>‘0’) when (tmpb=“0000000000”) else
tp2n & tpp;
process (clk_reg,clk_regbt)
begin
if clk_reg=‘1’ then cnt<=“000”;ytmp<=(others=>‘0’);
elsif (clk_regbt’event and clk_regbt=‘1’) then
if cnt<5 then cnt<=cnt+1;ytmp<=ytmp+p;
elsif (cnt=5) then
if ytmp(7)=‘1’ then
yout(8 downto 0)<=ytmp(16 downto 8)+1;
yout(9)<=ytmp(23);
else yout(8 downto 0)<=ytmp(16 downto 8);
yout(9)<=ytmp(23); end if;
end if;
end if;
end process;
end behav;
IIR2模块的输出数据采用将补码最高符号位直接取反转换为移码后,就可以送到DAC7520实现双极性信号输出。
3 系统性能测试
系统性能的测试采用单极性方波周期信号作为输入信号。信号的频率为100kHz,在采样频率为2MHz时,每个周期采样20个点,换算成数字域频率为0.1π,其二次谐波的数字频率为0.2π。输入到TLC5510的信号电压幅度为0~2V,则经过A/D转换后的输出为00H~FFH。由于低通滤波器的阻带截止频率选在200kHz,衰减32dB,由信号理论分析可知,周期方波信号没有二次谐波,所以对三次谐波的衰减经过IIR滤波器后输出有直流分量的基波(频率为100kHz)正弦信号。理论计算给出的方波周期信号基波幅度为:
2E/π=(2×255)/π=162.34
输入一个周期的数据,Matlab的计算值与MAX+plusⅡ的仿真值如表3所示。
表3 滤波后输出的数据
输入数据
255
255
255
255
255
255
255
255
255
255
计算值
28.7
-8.2
-29.4
-34.9
-25.2
-1.3
34.8
80.0
130.5
182.0
仿真值
32
1020
999
993
1002
1
36
80
129
179
输入数据
0
0
0
0
0
0
0
0
0
0
计算值
223.4
260.2
281.4
286.9
277.2
253.2
217.1
172.0
121.5
70.1
仿真值
219
255
276
282
273
250
215
171
122
72
由表3可见,仿真输出值为补码,谷点输出值993换算成符号数为993-1024=-31。Matlab软件计算的满度输出值为286.9,其基波幅度为[286.9-(-34.9)]/2=160.9,与理论值的误差为:
(160.9-162.34)/162.34=-0.87%
四阶IIR滤波器实现的满度输出值为[282-(-31)]/2=156.5,与理论值的误差为:
(156.5-162.34)/162.34=-3.6%
这是由于有限精度算法所引起的误差,可以通过增加二进制位数来提高系统的运算精度。图4给出单极性方波信号的前三个周期经过滤波后得到的含直流分量的输出波形,其中实线为Matlab的计算值,“*”为MAX+plusⅡ的仿真输出。可见,该四阶级联IIR滤波器达到了设计要求。
如果改变滤波器的输入时钟频率,则可以改变滤波器的截止频率。另外如果输入无直流分量的周期信号,而且其频率为采样频率的1/20,则该低通滤波器可以直接得到基波分量输出。其实,要将TLC5510输出的直流分量滤出很容易,只需利用FPGA做一个减法运算即可。
评论