在本文中,我们将简要介绍不同类型的过滤器,然后学习如何实现移动平均过滤器并使用CIC架构对其进行优化。

在许多设计中,过滤非常重要。它为我们提供了一个机会,可以提取埋在很多噪声下的所需信号。我们还可以通过在某些频率上过滤其输出来确定系统的非线性。

让我们首先讨论过滤器类型之间的一些差异。理论过滤器的类型

过滤器可根据通带类别划分为以下5组中的一种。每一种的能力都以他们的名字提示。例如,低通滤波器是一种通过低频输入并阻止高频输入等的滤波器。五种类型是:低通

带通

带阻

高通

全通

过滤器也有不同的形状。例如,它们的通带上可能有波纹,或者它们可能具有平坦的过渡带等。过滤器形状

过滤器通常可按形状分类如下:

贝塞尔:   与其他人相比,最平坦的群体延迟

巴特沃斯: 设计为在通带内具有最平坦的幅度响应; 也被称为“最大平坦”

切比雪夫: 设计为在理想滤波器和实际滤波器之间具有最小误差; 可以分为两种类型:通带中具有纹波的和阻带中具有纹波的。

椭圆:在通带和阻带都有波纹,但是它们在通带和阻带之间有最快的过渡

选择过滤器的形状取决于所需的规格。例如,我们可能需要输出信号幅度尽可能精确地跟随通带中的输入信号幅度。在这种情况下,我们应该使用巴特沃斯滤波器,即使它会给我们更多的过渡带。

另一方面,我们可能希望输出信号频率精确地跟随输入信号的线性相位响应,因此我们应该选择贝塞尔滤波器。如果我们需要使用尽可能少的组件并且具有与其他滤波器相同的顺序和转换速度,则椭圆或切比雪夫滤波器可以工作,但是我们在通过或阻带中会出现波纹。模拟和数字滤波器在另一方面,滤波器可以以两种方式构造:数字和模拟。

在模拟电路中,无源滤波器是电感器和电容器或电阻器的阶梯。有源模拟滤波器可以是利用放大器或谐振器的结构。只需使用已经为设计模拟滤波器创建的表或应用程序,即可确定它们的值。

可以使用IIR和FIR两种方法创建数字滤波器。IIR(无限脉冲响应)滤波器是滤波器的类型,其中输出取决于输入和先前的输出。

图1. IIR滤波器。

数字滤波器的另一种滤波器实现是FIR(有限脉冲响应)。它们不使用反馈,输出仅与当前和先前的输入相关。关于稳定性,FIR滤波器总是稳定的, 因为它们的输出仅与输入有关。另一方面,他们需要高阶以满足与IIR相同的规格。

图2. FIR滤波器

移动平均线

移动平均线是一个过滤器,它平均先前输入的N个点并使用它们输出。

如您所见,移动平均滤波器是一个FIR滤波器,其N系数为 1/N。具有不同N的一些移动平均滤波器的频率响应如图3所示。

图3.移动平均线的频率响应

移动平均(MA)滤波器的脉冲响应在不在0到N内的点中为零。

因此,MA过滤器的频率响应是:

截止频率可估算为:

根据这些公式,截止频率仅与N有关。随着N增加,截止频率降低但是时间增加。我们需要等待第N个周期才能得到正确的结果,所以N越大,我们需要更多的时间。随着滤波器越来越清晰,其输出需要达到稳定状态的时间也会增加。

所需设计的过滤和实现是FPGA设计中的广泛主题。需要学习很多东西来设计合适的滤波器,然后在FPGA上以最少的资源使用或最快的速度实现它。

在本文中,我们将尝试实现N点移动平均滤波器。我们假设N是一个参数,可以在实施之前通过Xilinx ISE等CAD工具进行更改。

正如我们在图2中看到的,FIR滤波器可以通过延迟链实现,其长度为N,即FIR阶,将系数乘以延迟线的乘法器,以及一些添加乘法器结果的加法器。这种架构需要许多乘法器和加法器,这些乘法器和加法器在FPGA中受到限制,具体取决于您使用的FPGA(尽管即使是功能最强大的FPGA也是有限的)。

设计FIR滤波器需要进行一些研究以减少这些资源,因为在任何FPGA设计的每个阶段都需要进行缩减。但是,我们不会涉及这个主题 - 相反,我们将使用另一种技巧设计我们的移动平均滤波器。在移动平均滤波器中,所有系数都是1/N。如果我们想要实现如图2所示的滤波器,我们应该制作一个抽头延迟线并存储N个最后输入,然后将它们相乘1/N 并累加结果。但是,我们可以在FIFO中存储N个最后输入并累加它们,然后在每个周期中将它们乘以1 / N。通过这种方法,我们只需要一个N乘数。

代码说明首先,我们有N,它是输入点的数量,作为可以调整的参数。我们将添加这N个点以产生输出。

我们还假设我们的输入是28位格式,我们希望输出格式相同。在处理添加N点时,我们可能会面临一点点增长。添加两个28位点会产生28位输出和一个溢出位。因此,为了增加N个28位点,我们需要一个(log2(N)+28)位输出。

假设所有N个点都相同并且添加它们就像将N乘以其中一个。这就是为什么我们实现一个“log2”函数,它只是简单地计算其输入的对数。通过N的对数知道,我们可以设置输出长度。请注意,log2不是可综合的方法,只能用于Xilinx ISE(即,Xilinx ISE计算log2,然后将结果用于其余的实现)。

“log2”函数如下代码所示:

functionintegerlog2(inputintegerv);

beginlog2=0;

while(v>>log2) log2=log2+1;

endendfunction

现在我们设置输入和输出长度,我们需要创建一个抽头线存储N个之前和当前输入。以下代码将解决这个问题:

genvari;generatefor(i =0; i < N-1; i = i +1)begin: gdalways@(posedgeclock_in)beginif(reset==1'b1)begindata[i+1]<=0;endelsebegindata[i+1] <= data[i];endendendendgenerate

最后,我们需要一个加法器来汇总存储在FIFO中的所有数据。这个阶段有点棘手。如果我们想在每个时钟周期都有输出,我们需要制作一个组合电路,逐步将数据添加到FIFO中。下面显示的代码将执行此操作:

genvarc;generateassignsummation_steps[0] = data[0] + data[1];for(c =0; c < N-2; c = c +1)begin: gdzassignsummation_steps[c+1] = summation_steps[c] + data[c+2];endendgenerate

但是,我们的目标FPGA(XC3S400)没有这么多资源,在这个FPGA上合成这个模块是不可行的。所以,我要让问题变得更简单些。假设我们希望输出每N个时钟周期更新一次。有了这个技巧,我们不再需要存储所有收到的数据了。我们可以简单地存储总和并将其添加到每个周期的当前输入中。以下代码将起到作用:

always@(posedgeclock_in)beginif(reset)beginsignal_out_tmp<=0;

count<=0;

signal_out<=0;endelsebeginif(down_sample_clk==N_down_sample)beginif(countbegincount<=count+1'b1;

signal_out_tmp<=signal_out_tmp+signal_in;endelsebegincount<=0;

signal_out<=signal_out_tmp[27+N2:N2];

signal_out_tmp<=0;endendendend

在此代码中,总和保存为signal_out_tmp,并将在每个周期添加到输入。在N个点之后,输出将变为signal_out_tmp,并且该变量将被设置为零并开始再次存储总和。

此方法使用非常低的资源,但其输出将每N个周期更新一次。

模拟

考虑到速度,我们将使用Modelsim进行模拟。我们需要将Modelsim集成到Xilinx ISE。要执行此操作,请转到编辑>首选项>集成工具。在Model Tech Simulator部分,我们输入Modelsim位置,我们就完成了,如图4所示。

图4.设置模型技术模拟器

Modelsim需要使用XILINX ISE库才能模拟电路。为此,我们需要单击项目上的FPGA模型,然后选择Compile HDL Simulation Libraries,如图5所示。

图5.编译HDL仿真库

测试平台包含在项目代码中,您可以下载。在测试平台中,我们假设输入为步骤并保存输出。在测试平台上读写非常简单,如下面的代码所示。我们可以在测试平台中使用fopen函数打开一个文件,然后使用fwrite函数写入它。

f =$fopen("output.txt","w");

f2 =$fopen("time.txt","w");$fwrite(f,"%d %d\n",signal_in,signal_out);$fwrite(f2,"%d\n",cur_time);

fwrite中的格式很像C语言中的简单printf函数。我们还将在测试平台中使用$ time变量。使用$ time变量给出了可以写入文本文件的当前时间。在模拟我们的项目之后,我们可以使用MATLAB中的书写文件来确保它们是正确的。用MATLAB编写的代码首先读取文件并绘制它们。

A = importdata('D:\low_test\output.txt');

B = importdata('D:\low_test\time.txt');

M2=A(:,2);

M1=A(:,1);

T=B(:,1)*10e-9;

M1=M1/(2^24);

M2=M2/(2^24);

plot(M1);

hold on;

plot(M2);

s=size(M1);

val=0;

t=0:s(1,1)-1;

t=t*50e-9;fori=405:s(1,1)if(abs(M1(i,1)-M2(i,1))<1*.1)

val=i;break;endendstepp=stepinfo(M2,t);

pp=stepp.RiseTime;

fc=.35/pp

cycles=val-405time=((cycles)*50)/1000

出于测试目的,我们首先使用输入步骤模拟我们的工作台,然后将输入更改为正弦。图显示在图6和图7中。

图6.步骤响应

图 7.Sin(x)* sin(x)响应

从图6中可以看出,在0.2ms之后,滤波器输出变得与输入幅度一样高。图6显示了每N个周期的响应,因为输出不会平滑变化。相反,它在第N个周期后发生变化。

在图7中,因为输入是6 * sin(x)* sin(x),我们知道这个输入的DC偏移是3,因为我们的低通滤波器输出是3。

CIC过滤器

级联积分梳状滤波器是一种硬件高效的FIR数字滤波器。

CIC滤波器由相同数量级的理想积分滤波器和抽取器组成。CIC滤波器架构如图8所示。

图8. CIC过滤器图像

我们可以通过使用CIC滤波器和重写移动平均方程来优化我们的移动平均低通滤波器,如下所示:

该架构由梳状部分(c [n] = x [n] -x [nN])和积分器(y [n] = y [n-1] + c [n])组成,因此我们可以在这里使用CIC架构。在这种架构中,我们将加法器减少到只有三个部分,这样我们就可以在每个周期都有输出,这是CIC滤波器的神奇之处。

使用CIC过滤器拓扑优化移动平均值。我们可以使用以下Verilog代码在硬件中实现上述等式:wiresigned[27+N2:0]   signal_out_tmp_2=signal_out_tmp_3+signal_in-data[N-1];

具有sin(x)* sin(x)输入的新结构的输出如图9所示。

图9. CIC输出

结论

数字和模拟路由都可用于过滤。每个都有自己的优势,但数字过滤允许重新编程和较小的实现区域。在本文中,我们首先研究了构建过滤器的方法,然后以最简单的方式实现了移动平均过滤器。最后,我们使用CIC架构对其进行了优化。

c语言 截止频率6低通滤波器,用Verilog在FPGA上实现低通滤波器相关推荐

  1. 一起学习用Verilog在FPGA上实现CNN----(三)激活层设计

    1 激活层设计 LeNet-5网络的激活函数是双曲正切函数(TanH),项目中tanh函数模块由完整的层UsingTheTanh构成,该层由较小的处理单元HyperBolicTangent组成 1.1 ...

  2. verilog语言中的@什么意思 verilog语言中的@什么意思

    verilog语言中的@什么意思 verilog语言中的@什么意思 2012-05-27 22:47 在英语中@ 读at,也就是在--的时候,这个小学应该学过,对吧.verilog中@ 的含义就是触发 ...

  3. R语言ggplot2可视化:自定义设置X轴上的时间间隔(中断、以年为单位),使用scale_x_date()自定义设置坐标轴间隔和标签、添加标题、副标题、题注信息

    R语言ggplot2可视化:自定义设置X轴上的时间间隔(中断.以年为单位),使用scale_x_date()自定义设置坐标轴间隔和标签(Time Series Plot For a Yearly Ti ...

  4. R语言在直方图条(柱形)上添加计数(count)或者百分比(percent)标签

    R语言在直方图条(柱形)上添加计数(count)或者百分比(percent)标签 目录

  5. Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略

    Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...

  6. fpga在线升级 linux_仅5000行Verilog代码、可在FPGA上跑轻量级Linux系统的RISC-V内核

    本文发布于www.hackster.io,由东京理工大学的计算机学院开发,专用于教学与加速用(苏老师也一直认为这是RISC-V当前的主要方向). 目前市场上开源的RISC-V内核已经很多,但很少有公开 ...

  7. 【Verilog】FPGA控制RGB灯WS2812B

    [Verilog]FPGA控制RGB灯WS2812B 最近学业繁忙,因此好久没有更新博客,今日闲来无事,准备开始整理一下最近写的东西 今天先更新一下短学期做的东西吧--FPGA控制RGB灯WS2812 ...

  8. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

  9. 《Java语言程序设计》 课程分析与总结(上)---我为什么这样设计考试试卷?

    <Java语言程序设计>课程分析与总结(上) 我为什么这样设计考试试卷? 自2003年以来,我承担了北京理工大学计算机学院<Java语言程序设计>这门课的教学任务,从2000级 ...

  10. 手写Verilog用FPGA实现实时图像卷积,用Block Ram缓存图像

    手写Verilog用FPGA实现实时图像卷积,用Block Ram缓存图像_哔哩哔哩_bilibili可用于神经网络卷积加速.Vivado里生成本代码所需Block Ram IP时要把Output R ...

最新文章

  1. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
  2. linux查看文件和文件夹大小
  3. 异常通知(After Throwing Advice)
  4. kafka高可用集群搭建
  5. CF1237F Balanced Domino Placements(dp+组合计数)
  6. MYSQL ERROR 1045 错误的解决办法 (转)
  7. Git学习系列(八)标签的管理及配置别名详解
  8. SpringBoot→整合数据层、@Valid参数校验、事务propagation属性、动态SQL、AOP监控执行时间
  9. 用ES6 Generator替代回调函数
  10. Excel多表头导出(.net)
  11. Java--UI--弹出对话框
  12. linux 查看tomcat启动_一次tomcat启动特别慢的排查
  13. 数据分析项目-大选献金数据分析
  14. 推荐一个免费的论文查重检测软件PaperRight
  15. mindspore| lenet模型 推理过程记录
  16. CSDN云IDE怎样克隆代码
  17. 《蜘蛛侠3》5月2日中国提前上映
  18. Keras的BN你真的冻结对了吗
  19. 做SEO优化必须掌握的10大技能
  20. 《找对英语学习方法的第一本书》

热门文章

  1. Matlab画直线、圆、球
  2. dcp9020cdn硒鼓!错误_打印机出现硒鼓错误怎么办?打印机显示硒鼓错误分析解决...
  3. vue导出excel文件下载
  4. 数值计算(一):引论
  5. RTC 技术的试金石:火山引擎视频会议场景技术实践
  6. python 实现将RGBA 转换为RGB
  7. npm安装github包
  8. 惠普台式计算机耳机插口,hp电脑耳机插孔没声音的解决方法
  9. c / c++ 整数除法 保留小数及浮点型的比较
  10. 采用计算机对酒店客房进行管理,酒店客房部计算机管理.doc