FPGA 学习小组
直播中

尤娟

7年用户 224经验值
私信 关注

怎么利用赛灵思FGPA实现降采样FIR滤波器?

怎么利用赛灵思FGPA实现降采样FIR滤波器?这种滤波器在软件无线电与数据采集类应用中都很常见。


回帖(2)

李琴

2019-8-15 16:21:37
这项工作即便对于经验丰富的设计师也不是一件小事。事实上,仅仅算出在 FGPA 中实现滤波器所需要的资源可能就是一个很大的问题。虽然 MATLAB®(MathWorks 开发)具有用于滤波器设计与分析 (FDA) 的绝妙工具箱,但是它提供太多滤波器设计方法,会让新用户无从下手。另外,您必须能够根据 DSP 理论解释 MATLAB 命令产生的结果,仅仅这一点就需要研究。

抛开理论的细枝末节,让我们开始围绕上述问题探讨降采样有限脉冲响应 (FIR) 滤波器的设计与实现。本辅导资料实际上旨在向您介绍一种简便、易于理解的流程——从滤波器系数生成到 FGPA 目标器件中抽取滤波器的实现。所需工具只有 MATLAB 较新版本(本人仍在使用R2008a)及其 FDA 工具箱、以及 ISE® 11.4 套件提供的赛灵思 CORE Generator™ 工具。这些工具是设计多速率 FIR 滤波器的必备工具。

特别是我们将探讨固定降采样速率变化的两个实例:整数值与有理值。您应当能够把我们在本辅导资料介绍的 MATLAB 指令和 CoreGen 图形用户界面 (GUI) 设置应用到您的设计当中。为了说明公用逻辑块 (CLB) Slice 、18KB 内存 RAM 块 (BRAM) 和 DSP48 乘法累加 (MAC) 单元等方面的资源占用情况,我们将采用 XC6VLX75T-2ff484 作为目标 FPGA 器件。

整数倍降采样器
假设基带中进行解调后按 250MHz 速率传输带宽只有 2.5MHz 的信号。我们必须过滤从2.5MHz 到 250MHz 的所有频率,因为它们不传输任何有用信息;这正是我们准备设计和实现的低通 FIR 滤波器的目的。根据尼奎斯特定理,输出数据速率是信号带宽的两倍;因此,我们需要按照 M=50 的整数倍对其执行降采样。我将介绍两种采用多级滤波方法的可行备选实现方案:第一种方法采用三个串联的 FIR 抽取滤波器,而第二种方法则同时采用级联积分梳状 (CIC) 滤波器与 FIR 滤波器。


以下是用于设计理想滤波器的 MATLAB 代码。我们假设通带和阻带频率的衰减分别为 0.1dB 和 100dB。



假设 FPGA 时钟频率 Fclk=Fs_in,那么在 Virtex®-6 器件中我们需要多少个 DSP48 MAC 单元?它是用于按 M 进行降采样的滤波器。根据 FIR Complier 5.0 数据手册 (fir_compiler_ds534.pdf) 详细阐述的理论,我们可以把 DSP48 MAC 分成 M 个相位,因此引入“多相”这一术语。由于每个相位都是按更低的输出频率 Fs_out 进行处理,因此可以按时分复用方式共享 DSP48 MAC。以下理论计算表明,FIR-Compiler 在通过多相分解方式实现滤波器时采用最小的 22 个 MAC 单元(total_num_MAC_ref )。滤波器长度是 2100 (total_num_coeff),填写 0 成为 M 的整数倍。请注意:此方案考虑系数对称性。












在 MATLAB 中可以轻松按低通滤波建立抽取过程模型,然后按 M 降采样,最终分别产生 y与 y_filt 输出信号。不过,在 FPGA 器件中,这种实现方式效率不高:它会很笨地计算随后必须抛弃的值。相反,多相抽取器把输入信号降采样到 M 个 wk 通道,每个通道由其自身的子滤波器 ph(k,:) 过滤。部分结果 y_out(k,:) 然后汇总在一起组成最终输出 y_tot。把 y_tot 与本机 MATLAB 指令产生的基准 y 对比,结果表明最终输出均处于数值精度 3e-15 范围内(由于不同运算阶数而出现偏差)。




























举报

白桦

2019-8-15 16:21:40
为了设计参考滤波器,CoreGen FIR-Compiler 需要名为“COE 文件”的系数文本文件。以下MATLAB 例程说明如何以十进制基数轻松生成此 COE 文件;FIR-Compiler 然后按照所采用的设置量化相关系数。



图 1 与图 2 说明 FIR-Compiler GUI 头两个页面所应用的设计参数;在最后两个页面我只需接受其默认值,但是“优化目标 (Optimization Goal)”除外, 我把它设为“速度 (Speed)”而非“区域 (Area)”。如无明确说明,我在本文件以及下面例子中始终采用上述设置。在完成 ISE 11.4 布局布线之后,参考单级降采样滤波器占用以下 FPGA 资源:
Slice 触发器数量:1,265 个
Slice LUT 数量:1,744 个
占用的 Slice 数量:502 个
DSP48 单元数量:22 个



图 1. 50 整数降采样。参考单级滤波器的 FIR-Compiler 5.0 GUI 设置第 1 页(共 4 页)。













图 2. 50整数降采样。参考单级滤波器的 FIR-Compiler 5.0 GUI 设置第 2 页(共 4 页)。



图 3. 通过串联三个 FIR 滤波级进行的按 50 整数抽取,此处单独放大显示 0~25MHz 频率。


三个 FIR 滤波级串联
现在我们以滤波级串联方式实现理想抽取滤波器。这种方法可以让我们通过时分复用节省 MAC单元,因为每个新的滤波级都是按前一级提供的较低数据速率运行。我让 FDA 工具决定最佳滤波类型:利用 MATLAB 指令信息,您可以看出:它会提出三级解决方案建议,其抽取因数分别是 M1=2、M2=5 和 M3=5。




图 3 显示了组成上述多级系统的三个滤波器的频率响应。蓝色曲线代表第一个降采样滤波器(M1=2);绿色曲线代表第二个滤波器 (M2=5),按 Fs_in/M1 倍数周期波动;而红色曲线则代表第三个降采样器 (M3=5),按 Fs_in/(M1*M2)倍数周期波动。

用于三级滤波器的 FIR-Compiler 设置与图 1 及图 2 所示大同小异。第一个滤波器唯一不同的参数是COE 文件名和“抽取率值”,其分别设为 filt1_rad10.coe 和 M1=2。第二个滤波器 COE文件名是 filt2_rad10.coe,抽取率值为 M2=5,输入采样频率此时为 125MHz,因为第二级按M1=2 抽取来自第一级的输入数据。最后,第三个滤波器参数的唯一区别是 COE 文件名为filt3_rad10.coe,抽取率值为 M3=5,输入采样频率此时为 25MHz,因为第三级按 M2=5 抽取来自第二级的输入数据。

在布局布线后,三个滤波级占用以下 FPGA 资源:
第一级(M1=2):
Slice 触发器数量:280 个
Slice LUT 数量:208 个
占用 Slice 数量:62 个
DSP48 MAC 单元数量:3个
第二级(M2=5):
Slice 触发器数量:236 个
Slice LUT 数量:168 个
占用 Slice 数量:60 个
DSP48 MAC 单元数量:3 个
第三级(M3=5):
Slice 触发器数量:357 个
Slice LUT 数量:414 个
占用 Slice 数量:158 个
DSP48 MAC 单元数量:4 个

由于采用上述多级方法,我们现在比参考滤波器最初的 22 个 DSP48 MAC 单元少用了 12 个单元;与单级理想滤波器占用资源相比,我们节约了 30% 左右的触发器,55% 的 LUT,44%的 slice 和 54% 的 DSP48 单元。

与 CIC 滤波器串联
另一种按 50 抽取的可行方法是把级联积分梳状 (CIC) 滤波器 和 CIC 补偿降采样级串联在一起,其变化速率分别为 M1=10 与 M2=5。CIC 滤波器是一类特殊的 FIR 滤波器,由 N 个梳状滤波器和积分器组成(因此产生“第 N 级”术语)。尽管梳状滤波器仍然可以实现成一种“传统的”基于 MAC 的 FIR 滤波器,不过 CIC 架构之所以有趣是因为它不需要任何 MAC 单元,因此可以用 CLB sclice 替代 DSP48 单元,参阅 CoreGen CIC-Compiler 1.3 数据手册(cic_compiler_ds613.pdf)。

按 M1=10 抽取的第一级 CIC 滤波器频率响应较差,因此需要采用一个按 M2=5 抽取的补偿FIR 滤波器,以弥补第一级 CIC 滤波器本身通带的下降。以下 MATLAB 代码说明如何采用FDA 工具设计此类滤波器。





图 4 为赛灵思 CoreGen CICCompiler 1.3 GUI 设置的第一个页面;其它参数采用默认值,“使用 Xtreme DSP Slice”可选参数除外(GUI 的第 2 页(共 3 页)),其允许采用或不采用 DSP48单元实现梳状滤波器。FIR Compiler GUI 中的 CIC 补偿 FIR 滤波器设计参数与图 1及图 2 所示相同;唯一不同的设置是 COE 文件名(此处是 ciccomp_ dec5.coe),抽取率值为 M2=5,而输入采样频率为 25MHz。

在布局布线后,两个滤波级占用以下 FPGA 资源:

第一级(按 10 抽取的 CIC 滤波器,不使用“采用 Xtreme DSP Slice”)
Slice 触发器数量:755 个
Slice LUT 数量:592 个
占用 Slice 数量:172 个
DSP48 MAX 单元数量:0 个

第一级(按 10 抽取的 CIC 滤波器,使用“采用 Xtreme DSP Slice”)
Slice 触发器数量:248 个
Slice LUT 数量:154 个
占用 Slice 数量:42 个
DSP48 MAC 单元数量:7 个

第二级(按 5 抽取的 CIC 补偿 FIR 滤波器)
Slice 触发器数量:271 个
Slice LUT 数量:312 个
占用 Slice 数量:114 个
DSP48 MAC 单元数量:3 个



图 4. 按 10 抽取的 CIC 滤波器的设置。CIC-Compiler 1.3 GUI 的第 1 页(共 3 页)。

两种结果都很有趣,而是否选择使用 Xtreme DSP slice 取决于设计人员最需要节约哪些资源。我个人选择“采用 Xtreme DSP Slice”选项。与单级滤波器相比,我们可以节约大约 59% 的触发器,73% 的 LUT,69% 的 slice 和 54% 的 DSP48 MAC 单元。代价是阻带衰减更差,其现在是 80dB,而非所需要的 100dB,如图 5 所示。某项设计是否接受该衰减值事实上与应用相关。

图 5 对比上述三种按 50 降采样方法:单级、三级(比例为 2-5-5)和 CIC 滤波器与 CIC 补偿 FIR 滤波器串联(比例为 10-5)。

有理数降采样
在此第二个应用示例中,我们假设信号输入数据速率是 50MHz,其必须降采样到 12MHz,因此其需要采用 L/M=6/25 的有理数固定速率变化(换句话说,抽取因数为 M/L=25/6)。FPGA时钟频率假设为 150MHz。

如 FIR-Compiler 5.0 数据手册所解释,采用有理数速率变化的滤波器理论上需要两个处理步骤:按 L 插值,然后是按 M 抽取。在我们这个具体例子中,一旦输入信号按 L=6 插值,输出虚拟采样速率 Fv 就会变为 300MHz。因此,必须过滤掉 Fs_in/2=25MHz 与 Fv/2=150MHz 之间的频段,以滤除 Fs_in 整数倍之处的频谱。在 DSP 术语中其称为“图像”,这正是采用插值“抗成像”低通滤波器的原因。

在上述处理步骤之后、按 M 最终降采样之前,我们需要采用低通滤波器滤除从 Fv/(2*M)=6MHz 到 Fv/2=150MHz 的频率,其在 DSP 术语中称为“混叠”。由于这两个低通滤波器是串联在一起并且按相同的虚拟数据速率 Fv 运行,因此我们可以使用带宽较低的滤波器同时执行抗成像与抗混叠,从而节约资源。在我们的例子中,具有最低带宽的滤波器是抽取滤波器。

以下 MATLAB 片段说明如何使用单级滤波器设计和模拟上述降采样器。我们假设通带和阻带频率衰减分别为 0.05dB 和 70dB。


图 5. 三个降采样器的频率响应 – 整体速率变化为 50,图中显示了放大的 1.5~3MHz 频段。单级滤波器为蓝色***波器(比例分别为 M1=2、M2=5、M3=5)为绿色,基于 CIC 的二级滤波器(比例分别为 M1=10、M2=5)为红色。




请注意:此 MATLAB 代码只是有理数降采样滤波器的行为模型。在实际硬件多相架构中,您只需实现一个单相滤波器,然后改变每个新输出采样的系数即可(按 Fclk 速率执行处理)。其不同于采用整数比的多相降采样滤波器。

图 6 说明 FIR-Compiler GUI 第一个页面的设置。其它三个页面本人采用与第一个整数降采样应用例子相同的参数。

布局布线后的总体 FGPA 资源占用情况如下:
Slice 触发器数量:547 个
Slice LUT 数量:451个
占用 Slice 数量:153个
DSP48 单元数量:13
BRAM 单元数量:6个

图 6.  25/6有理数降采样。用于参考单级滤波器的 FIR-Complier 5.0 GUI 设置第 1 页(共 4 页)。

多级方法
FIR-Complier 已经为这种多相 L/M=6/25 滤波器生成了非常小的内核。不过,我们需要再次采用多级方法,因为这种方法使我们能够进一步节约 DSP48 与 BRAM。在手动设计多级系统时,  如本例所示,所有滤波级都必须采用与参考滤波器相同的通带频率 (Fpass)。

各级通带纹波均相等,是由参考滤波器通带纹波除以级数算出。各级的差异是阻带频率。第一级无需在 Fstop 截止,因为转换带宽会变得太急促(太多系数);现实中我们所需要的只是让第一级在 Fstop1=Fs_in/M1- Fs_in/(2M/L)截止。实际上 Fs_in/M1 与其所有倍数此时都是放置所有复本的新采样频率,而 Fs_in/(2*M1)是 Fs_in/M1 中第一个复本的带宽的一半。以下是相关MATLAB 代码。




由于第一级是 M1=4 整数降采样器,因此其 FIR-Compiler GUI 设置与图 1 所示非常相似。唯一不同的参数是 COE 文件名(即dec_L1_M4_rad10.coe)、抽取率值 (M1=4)、输入采样频率 (50 MHz) 和时钟频率 (150 MHz)。另一方面,第二级采用 L2/M2=24/25 有理数速率变化,因此,FIR-Compiler 设置与图 6 所示大同小异。此处 COE 文件名为 dec_L24_M25_rad10.coe,插值速率值设为 L2=24,而输入采样频率为 12.5 MHz。

在布局布线之后,上述两个滤波级占用以下 FPGA 资源:
第一级(L1/M1= 1/4):
Slice 触发器数量:321 个
Slice LUT 数量:223 个
占用 Slice 数量:62 个
DSP48 MAC 单元数量:4 个
BRAM 单元数量:0 个

第二级(L2/M2 = 24/25):
Slice 触发器数量:206 个
Slice LUT 数量:209 个
占用 Slice 数量:68 个
DSP48 MAC 单元数量:3 个
BRAM 单元数量:1 个

由于采用多级方法,与单级理想滤波器资源占用相比,我们现在可以节约 3% 左右的触发器,4% 的 LUT,15% 的 Slice,46% 的 DSP48 以及 83% 的 BRAM 单元。尤其是我们只需少得多的 MAC 与 BRAM 单元,分别只有 6 个和 5 个。原因是第二个滤波器以更低的输入采样频率运行,而采用整数速率变化的第一个滤波器可以充分利用系数对称。

其它资源
我们在本辅导资料中介绍了两个降采样滤波器例子,一个是整数系数(50),另一个是有理数系数(25/6),而且本文强调了在 MATLAB 设计滤波器以及采用 FIR-Compiler 和 CIC-Compiler在赛灵思 FGPA 中实现它们的方法。相关数据手册详细介绍采用 CORE Generator 实现滤波器所涉及的参数设置。

如果有兴趣进一步深入 DSP 领域,有两本专著具体介绍诸多理论和相关 MATLAB 指令:《数字信号处理基础与应用》,作者:Li Tan(Elsevier,2007 年)和《通信系统多速率信号处理》,作者:Fredric J. Harris(Prentice Hall,2004 年)。另外,赛灵思网站提供大量有关多速率数字上变频和下变频的应用手册(尤其是 Xapp113、569、1018 与 936)。

最后,为了理解如何有效实现 DSP 算法,本人强烈推荐参加赛灵思培训课程《赛灵思 FPGA的 DSP 实现技巧》。
作者:Daniele Bagni
DSP 专家级现场应用工程师
赛灵思公司
daniele.bagni@xilinx.com
举报

更多回帖

发帖
×
20
完善资料,
赚取积分