当前位置:文档之家› 明德扬-基于FPGA的插值滤波器设计

明德扬-基于FPGA的插值滤波器设计

插值滤波器设计1项目背景1.1多采样率数字滤波器多采样率就是有多个采样率的意思。

前面所说的FIR,IIR滤波器都是只有一个采样频率,是固定不变的采样率,然而有些情况下需要不同采样频率下的信号。

按照传统的速率转换理论,我们要实现采样速率的转换,可以这样做,假如有一个有用的正弦波模拟信号,AD采样速率是f1,现在我需要用到的是采样频率是f2的信号,传统做法是将这个经过f 1采样后的信号进行DA转换,再将转换后的模拟信号进行以f2采样频率的抽样,得到采样率为f2的数字信号,至此完成采样频率的转换但是这样的做法不仅麻烦,而且处理不好的话会使信号受到损伤,所以这种思想就被淘汰了,现在我们用到的采样率转换的方法就是抽取与内插的思想。

1.2抽取先来总体来解释一下抽取的含义:前面不是说,一个有用的正弦波模拟信号经采样频率为f1的抽样信号抽样后得到了数字信号,很明显这个数字信号序列是在f1频率下得到的,现在,假如我隔几个点抽取一个信号,比如就是5吧,我隔5个点抽取一个信号,是不是就是相当于我采用了1/5倍f1的采样频率对模拟信号进行采样了?所以,抽取的过程就是降低抽样率的过程,但是我们知道,这是在时域的抽样,时域的抽样等于信号在频域波形的周期延拓,周期就是采样频率,所以,为了避免在频域发生频谱混叠,抽样定理也是我们要考虑的因素下面来具体来介绍图561如上图所示,假如上面就是某一有用信号经采样频率f1抽样得到的频谱,假设这时候的采样频率为8Khz,可以通过数格子得到,从0到F1处有8个空格,每个空格代表1Khz,有些朋友可能会问,这不是在数字频域吗,单位不是π吗,哪来的hz?是的,这里是数字频域,采样频率F1处对应的是2π,这里只是为了好解释,我们用模拟频率来对应数字频率。

图562上面是采样频率为8K的数字信号频域图,现在我要对这个数字信号进行时域抽取,从而来降低信号的采样率,我们知道,一旦我们对数字信号进行时域抽取,那么采样率下降,而采样率就是数字信号频域的波形周期,那么也就是周期下降,所以,我们对信号进行抽取要有个度,要在满足抽样定理的条件下对信号进行抽取,否则就会发生频谱混叠。

上图就是对信号进行了1/5倍的F1采样频率抽取,可见,由于发生了频谱混叠现象,因为1/5倍的F1是1600hz,而信号的频带是1000hz,不满足抽样定理,导致发生了频谱混叠,所以,为了避免发生这种情况,除了要满足抽样定理之外,即抽样倍数不能太高,我们还需要把信号的频带设置在F1/2以下,才能确保信号不发生频谱混叠,因此,我们需要在抽取之前加一个低通滤波器,书上叫做抗混叠低通滤波器,用来限制信号的频带,然后再进行抽取,这样的话我们来算一下低通滤波器的截止频率就是1/2倍的经抽取后的采样速率,即fc=1/2*(F1/M),M是抽取倍数。

而1/2*F1对应的数域频率是π,因此我们得出,抗混叠低通滤波器的截止频率是π/M1.3内插抽取的过程是降低采样率的过程,那么插值的过程当然就是提高采样率的过程。

大体的思路可以这么理解,我们将经f1抽样下得到的数字信号的每两个点之间进行插值,插入的值是0,插值之后,信号在单位时间内的采样点数增多,当然也就是采样速率的提升,采样速率提升后我们知道,那么信号的频谱的周期就会增加图563需要注意的一点就是,插值前后,我们只是在时域信号中间插入了D-1个零值,仅仅是改变了采样率,并没有改变信号的信息,因此,在频域,信号频谱的形状是不会改变的,改变的仅仅是周期,如上图,F1是插值之前信号的周期,插值之后,信号频谱的形状不变,周期成了F1*D,D是插值倍数。

如果我们直接用F1*D倍的采样率采信号,得到的频谱会发现,就不会有中间两个波形,因此,这两个波形是多余的,书上叫做是镜像频谱。

既然是多余的,我们就可以将它用一个低通滤波器滤掉,这样的低通滤波器,就叫做镜像低通滤波器。

这样我们来计算一下镜像低通滤波器的截止频率图564根据上面这张图我们可以求出镜像低通滤波器的截止频率,可以看到,fc=1/2*F1,这里我们假设,内插之后的采样频率为F2=F1*D,那么,fc=1/2*(F2/D),而1/2*F2对应的是π,注意,这里是1/2*F2对应π,不是1/2*F1了,因为这已经是插值之后采样率增加之后的频谱了,所以我们得出:镜像低通滤波器的截止频率为:π/D2设计目标本次案例将使用到采样率大于100M的双通道的示波器。

将示波器的两个通道,分别与FPGA 的DA通道1和DA通道2相连,观察两路DA的输出。

其连接示意如下图所示。

图565本案例是FPGA内部产生正弦信号,这个正弦信号一路输出给DA通道A,另一路经过插值滤波器后,输出给DA通道B。

图566正弦信号产生电路产生频率为62.5KHz的正弦信号,该正弦信号由8个点组成。

插值滤波器是4倍的插值,也就是说进来是8个点的正弦波,输出将是32个的正弦波。

仿真效果,上面的波形为插值前,下面的为插值后可以明显看出下面的波形更为圆滑。

图567下面是示波器的显示效果图568上面黄色是通道1输出的信号,下面蓝色是通道2的输出信号。

3设计实现3.1顶层信号新建目录:D:\mdy_book\cic_prj。

在该目录中,新建一个名为cic_prj.v的文件,并用GVIM打开,开始编写代码。

我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A未滤波的正弦信号,让通道B输出滤波后的正弦信号。

为了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管脚;为了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管脚;为了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管脚。

根据设计目标的要求,整个工程需要以下信号:1.使用clk连接到晶振,表示50M时钟的输入。

2.使用rst_n连接到按键,表示复位信号。

3.使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。

4.使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。

5.使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。

6.使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。

7.使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。

8.使用dac_clkb号连接到AD9709的CLK2脚,用来控制通道B时钟。

9.使用dac_wrb 号连接到AD9709的WRT2脚,用来控制通道B 使能。

10.使用8位信号dac_db 接到AD9709的DB7~0P2脚,用来控制通道B 写数据。

综上所述,我们这个工程需要10个信号,时钟clk ,复位rst_n ,dac_mode 、dac_sleep 、dac _clka 、dac_wra 、dac_da 、dac_clkb 、dac_wrb 和dac_db 信号,其中dac_da 和dac_db 是8位信号,其他都是1位信号。

下面表格表示了硬件电路图的连接关系。

器件AD9709管脚原理图信号FPGA 管脚FPGA 工程信号U8MODE DAC_MODE Y4dac_mode SLEEP DAC_SLEEP H2dac_sleep CLK1DA_CLKA R2dac_clka WRT1DA_WRA U1dac_wra DB7P1DAC_DA7AA1dac_da[7]DB6P1DAC_DA6Y2dac_da[6]DB5P1DAC_DA5Y1dac_da[5]DB4P1DAC_DA4W2dac_da[4]DB3P1DAC_DA3W1dac_da[3]DB2P1DAC_DA2V2dac_da[2]DB1P1DAC_DA1V1dac_da[1]DB0P1DAC_DA0U2dac_da[0]CLK2DA_CLKB R1dac_clkb WRT2DA_WRB P2dac_wrb DB7P2DAC_DB7P1dac_db[7]DB6P2DAC_DB6N2dac_db[6]DB5P2DAC_DB5N1dac_db[5]DB4P2DAC_DB4M2dac_db[4]DB3P2DAC_DB3M1dac_db[3]DB2P2DAC_DB2J1dac_db[2]DB1P2DAC_DB1J2dac_db[1]DB0P2DAC_DB0H1dac_db[0]X1SYS_CLK G1clk K1SYS_RSTAB12rst_n将module 的名称定义为cic_prj ,代码如下:其中clk 、rst_n 是1位的输入信号,dac_da 和dac_db 是8位的输出信号,dac_mode ,dac_c lka ,dac_wra ,dac_sleep ,dac_clkb ,dac_wrb 是一位输出信号。

3.2正弦信号设计假设产生的正弦信号命名为sin_data 信号。

sin_data 一共有8个值,是从一个正弦信号中,按(2*pi/8)的间隔采样到的,可列出下表。

采样点i sin_data (16进制)采样点i sin_data (16进制)采样点i sin_data (16进制)采样点i sin_data (16进制)07F 2FE 47D 611DA3D852372A很自然地定义一个7位的选择信号addr 。

我们只要控制好addr ,就能方便得到sin_data 。

因此可以写出下面代码。

接下来是设计信号addr。

addr是用来控制选择数据的地址,通过控制addr的增加值,就能产生所需要的正弦波。

本案例要求产生62.5KHz的正弦信号。

该正弦信号的周期是16000ns。

本工程的工作时钟是20 ns,也就是16000/20=800个时钟输出一个正弦信号,也就是800个时钟将上表的8个值输出一遍,即每100个时钟输出addr加1。

每100个时钟输出一个值,那意味着我们需要一个计数器cnt0,该计数器用来对这100进行计数。

计数器的加1条件是“1”,结束条件是“数到100个”。

因此可写出cnt0的代码。

每100个时钟后,addr就加1。

说明这个addr也是一个计数器,该计数器的加1条件是“数到3.3CIC滤波器设计3.3.1新建FPGA工程图5691.)打开quartus,点击File在File菜单中选择New Project Wizard....。

2.弹出Introduction界面选择Next。

图571(3)设置工程目录,工程名,顶层模块名工程目录设置为:D:\mdy_book\cic_prj工程名:cic_prj顶层模块名:cic_prj填写完毕后,点击next之后进入下一界面。

相关主题