| |
二相FIR滤波器即并行FIR滤波器,以面积换取速度,可以在同样的时钟频率下,提高原始滤波器的有效吞吐量,或者降低原始滤波器的功耗。
(以上内容来自陈弘毅、白国强等,VLSL数字信号处理系统--设计与实现,机械工业出版社)
因此为了实现并行处理,我们需要将序列以奇偶形式分为两个并行序列,滤波器则需要调用4个阶数为一半的ip核(自己写的仿真没通过),相应的滤波器系数也需要分奇偶分别送入。本实验以32阶低通滤波器,处理一路20M与80M的混频信号为例。
(1)产生混频信号的代码如下(混频信号要输出到文件,用于modelsim仿真):
(2)产生的正弦波及混频信号波形如下图
(3)接下来,我们用matlab的fdatool仿真FIR滤波
在MATLAB Command Window中输入fdatool并按回车键,得到fdatool工具框。再设置单位Units为MHz,采样频率为Fs为500,通带Fpass为20,阻带Fstop为60;再点击Design Filter(滤波器阶数刚好为32阶)。最终工具框如下图所示:
现在我们将此滤波器生成为.m文件,以在MATLAB中调用。点击File,点击Generate M-file,保存为mylowfilter.m。其内容为下图
接下来,可以在MATLAB中调用此.m文件对混频信号进行滤波,其程序如下(还对滤波后数据进行绘制,并输出到文件,再读回,为了全部以16进制表示,做了细微处理)
所有波形图如下
(4)输出滤波器系数(用于modelsim仿真)
现需取出滤波器系数。点File,点Export,得到下图
点击Export即可。
此时MATLAB主界面的workplace中会出现Num,如下图,
双击Num,即可在Editor界面中得到滤波器系数,直接将这些系数复制到文本文件Num.txt中
接下来,将Num的值量化后以16进制输出到文件,用于modelsim仿真(modelsim读数时,读取正数;故我们将Num的值量化后,需加上偏移量,在modelsim中再将偏移量减去)
此时,我们已用MATLAB产生了混频信号和滤波器系数。
根据图9-1的结构框图进行设计。本实验中为了避免不可预料的麻烦(最初是调用两个ip核分别做H0和H1,但仿真时发现两个核的工作状态不一致),只生成一个16阶滤波器,通过系数加载的方式得到两个具有不同滤波系数的滤波器,其中H0对应偶系数,H1对应奇系数。
这里不再阐述工程的建立过程。16阶FIR滤波器IP核的生成过程如下:
另外,由图9-1可见,还需要两个有符号数加法器,这里也调用xilinx的IP核。
接下来的工作是例化4个FIR和2个有符号数加法器,注意数据的对齐。
这是加载系数时的时序图,我们关注LD, WE, DIN三个信号。在tb中,以最简单的方式加载,给ld一个脉冲,马上给16拍的we高电平和16个系数。
测试代码如下,modelsim的输出结果还要将奇偶合并起来,并输出到文件,再由MATLAB回读后,画出波形。
仿真波形如下,从图中可以看到输入的奇偶序列是有混频的,而输出的波形已经只含有低频成分。