热度 21
2013-10-18 09:51
3073 次阅读|
1 个评论
基于 FPGA 的数字滤波设计— FIR 设计 1 3.1 FIR 阶数和系数的确定 按照 1.3 节给出的滤波器指标,利用 MATLAB 的 FDATOOL 工具,采用窗函数法设计出的 FIR 滤波器需要 700 多阶,如图 3.1 所示。评估 FPGA 资源,不能够完成滤波的主要原因是无法保存输入的历史数据。即使参数做微调也只能将阶数降到 300 阶。究其 FIR 阶数居高不下的原因主要在于, 60Hz-64Hz 的过渡带相对于采用频率 1KHz 来说太窄,即滤波器的滚降过快。 Fstop=64Hz 就是由此 公式计算得来。从 1024 序列中抽取出 128 的序列,那么 M=8 ,计算得 fc64Hz 。所以为了保证不出现混叠, Fstop=64Hz 。 经过多次评估得出,在 2C8 器件基础上对 72 个通道进行 FIR 滤波,最多只能运算 85 阶,为了便于计算采用 64 阶 FIR 滤波。 图 3.1 按照指标设计的 FIR 滤波器模型 考虑到脑电信号一般低于 30Hz ,那么我们将通带频率定为 20Hz 。同时我们考虑到,混叠只要对带内信号不产生影响,混叠也可以产生,那么我们可以计算出 Fstop=128-60=68 。这样优化的方向就是,使得滤波器的过渡带趋于平坦,我们知道,过渡带直接影响到 FIR 的阶数。 形成了新的指标如下: 原采样率 : Fs=1024Hz 通带 : Fpass=20Hz 保证 30Hz 衰减不低于 3dB 截止频率 : Fstop=68Hz 利用 MATLAB 的 FADTool 工具生成 FIR 模型如 3.2 图所示。 37Hz 左右才衰减 3dB ,保证率 30Hz 不衰减 3dB 。 图 3.2 设计的 64 阶 FIR 滤波器模型 具体设置参数如下: 选择:低通( lowpass )、 FIR 、基于窗口设计( window )、 kaiser 窗口设计。 设置:采样频率 Fs=1024, 通带 Fpass=20, 阻带 Fstop=68 ; 通带衰减 Apass=0.2, 阻带衰减 Astop =50dB 。 这些参数中, Fpass 、 Fstop 、 Astop 等都可以修改,主要目的就是为了使得 FIR 的阶数为 64 阶(由于 FPGA 硬件资源限制,本系统中只能设计 64 阶的 FIR )。当然在保证系统需求的前提下,可以尽量降低 FIR 的阶数。 FIR 阶数确定后,就可以生成 FIR 系数了,利用 FDATOOL 如图 3.3 的系数生成工具,可以生成各种不同类型的系数。 图 3.3 FDATOOL 系数生成工具 此系统中 FPGA 采用了 16 位有符号乘法器结构,所以在此生成了 Signed 16-bit integer 类型的系数。 3.2 基于 FPGA 的 72 通道 FIR 滤波器设计 3.2.1 FIR 参数和 FPGA 资源之间的对应关系 1、 FIR 的阶数决定了 FPGA 乘法单元使用次数,阶数的高低影响滤波的效果(频响)。 2、 FIR 计算的位宽选择: 8bits 、 16bits 、 32bits 。影响精度,即滤波效果(小信号)。 3、 运算速度,决定了 FPGA 的主时钟,即影响功耗。 4、 通道数量,每个 ADC 器件采集的 24 路信号轮流滤波,那么滤波过程中需要保存每个通道的阶数个历史数据,影响的存储单元容量的大小。 3.2.2 FIR 实现结构: 1 个 MAC 对应一个 ADC 器件 利用 Quartus II 软件中的 MegaWizard Plug-In Manager 工具生成的 MAC 单元结构如图 3.4 所示。设置 datab 为有符号输入(输入 FIR 系数), dataa 为无符号输入(输入信号序列)。 aclr0 为异步清零。 图 3.4 MAC 乘累加单元 利用此 MAC 单元设计出的 64 阶 FIR 滤波器结构如图 3.5 所示。 ADC 器件对 24 路通道进行采样,并将采集到的 16bits 位宽的数据存入 RAM 中。在 RAM 中划分 24 个通道对应的不同的地址范围。 RAM 中保存的每个通道输入的历史数据个数有 FIR 阶数决定,即为 64 个。在 ADC 完成当前通道当前采样值后, MAC 单元开始从 RAM 中调入数据、从 ROM 中调入 FIR 系数,进行 FIR 最基本的乘累加运算,运算次数由阶数决定。系数采用 16bis 无符号整型表示,所以在计算完成后需要做归一化处理。 图 3.5 64 阶 FIR 滤波器结构