数字信号处理

您所在的位置:网站首页 fpga实现数字滤波器 数字信号处理

数字信号处理

2024-02-21 08:23| 来源: 网络整理| 查看: 265

前言

        本文介绍了设计滤波器的FPGA实现步骤,并结合杜勇老师的书籍中的并行FIR滤波器部分进行一步步实现硬件设计,对书中的架构做了复现以及解读,并进行了仿真验证。

并行FIR滤波器FPGA实现

        FIR滤波器的结构形式时,介绍了直接型、级联型、频率取样型和快速卷积型4种。在FPGA实现时,最常用的是最简单的直接型结构。FPGA实现直接型结构的FIR滤波器,可以采用串行结构、并行结构等不同中的结构设计,上文根据书中提供的架构完成了串行 FIR滤波器的实现,本文沿用上文的基本代码结构,按照并行FIR滤波器的架构完成电路描述。

FIR滤波器需求

        设计一个15阶(长度为16)的低通线性相位FIR滤波器,采用窗函数设计,截止频率为500 Hz,采样频率为2 000 Hz;采用FPGA实现并行结构的滤波器,系数的量化位数为12比特,输入数据位宽为12比特,输出数据位宽为29比特,系统时钟为16 kHz。

滤波器系数确定与量化

        确定滤波器的结构后,就根据滤波器进行设计代码仿真,这里引用书中的仿真设计,并将滤波器参数系数量化。确定滤波器系数的方法有很多,可以使用MATLAB中丰富的函数实现,或者使用相关滤波器设计的软件工具,定制满足当前需求的窗函数的滤波器系数。具体量化系数确定可参考上文《数字信号处理-09-串行FIR滤波器MATLAB与FPGA实现》中的相关内容,或者参考杜勇老师的书中的内容。

硬件架构

        下图为杜勇老师的《数字滤波器的MATLAB与FPGA实现》实现的并行FIR滤波器的结构图。因为FIR滤波器参数对称,所以同时计算相应的对称结构的值,将对称系数的X(n)相加后,可调用8个乘法器,完成对滤波器的乘法运算,所以针对并行滤波器的架构数据的输入速率和时钟可以相同,每一个时钟周期流水输出一个滤波后的信号值。图中的8输入的加法器,可以替换成N/2;这样就得到了一个通用化的并行FIR滤波器结构图。

并行FIR滤波器

        并行实现FIR滤波器,虽然浪费了加法器和乘法器的资源,但是提升了整个滤波器实现的性能,当滤波器的系数长度N增大时,数据的吞吐速率不变(暂且不考虑面积增大对性能的影响),但带来的坏处就是会用掉相应倍数的逻辑资源和运算资源,速度和面积本来就是鱼和熊掌的关系,在实际应用中应当做相应的权衡和割舍。

根据架构描述电路

        根据杜勇老师书中提供的架构,对电路进行描述,同样沿用了前文的通用化的模板,后期可根据参数输入来适配不同滤波器长度的设计。

实现模块框图

        接口描述如下:

接口描述

        参数描述如下:

参数描述

代码如下:

`timescale 1ns / 1ps module Fir_Parallel(         input clk,//!系统时钟         input rst,//!复位信号         input signed [SIGN_IN_WIDTH-1:0] signal_in,//!信号输入         output signed [SIGN_OUT_WIDTH-1:0] signal_out//!信号输出,信号输出速度和输入速度相同     );     //     parameter  integer SIGN_IN_WIDTH    = 12   ;//!信号输入位宽     parameter  integer SIGN_OUT_WIDTH = 29   ;//!信号输出位宽     parameter  integer FIR_COE_WIDTH = 12   ;//!滤波器系数位宽     parameter  integer FIR_COE_NUM = 16   ;//!滤波器长度     localparam integer FIR_WIDTH_DIV_2 = FIR_COE_NUM/2 ;     function [FIR_COE_WIDTH-1:0] coe_data;     input [FIR_WIDTH_DIV_2-1:0] index;     begin         case(index)         'd0:coe_data='h000;         'd1:coe_data='hffd;         'd2:coe_data='h00f;         'd3:coe_data='h02e;         'd4:coe_data='hf8b;         'd5:coe_data='hef9;         'd6:coe_data='h24e;         'd7:coe_data='h7ff;         endcase     end     endfunction     integer i;     genvar j;     //!滤波器系数加载     wire signed [FIR_COE_WIDTH-1:0] coe[FIR_WIDTH_DIV_2-1:0];      generate         for (j=0; j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3