当前位置: 首页 > news >正文

FIR滤波器简述及FPGA仿真验证

数字滤波器的设计,本项目做的数字滤波器准确来说是FIR滤波器。

FIR滤波器(有限冲激响应滤波器),与另一种基本类型的数字滤波器——IIR滤波器(无限冲击响应滤波器)相对应,其实就是将所输入的信号都看成是离散的,用离散的冲击信号代替实际的信号。对于FIR滤波器而言,就是将有限个最近输入的冲击信号进行加权平均运算得到新的输出信号,用以滤除其他不需要的信号。而IIR滤波器不仅需要对输入信号进行加权平均,对输出信号也要进行加权平均,从而得到新的输出信号,滤除其他不需要的信号。

FIR滤波器的算法就是类似卷积的算法。核心其实就是加权平均,即:

Y(n)=h(0)*x(n)+h(1)*x(n-1)+h(2)*x(n-2)+h(3)*x(n-3)+……+ h(N-1)*x(n-N+1)

X(n)是我们待滤波的信号,h(n)是滤波器系数。

在用Verilog编程之前用MATLAB计算出h(k)(k=0~N-1)权重。

对于FPGA而言,有两种方法可以实现FIR滤波器的设计,一种是通过Verilog语言编写,另一种是通过IP核实现。

用Verilog语言编写需要通过Matlab的工具箱生成h(k)(k=0~N-1)权重。而用IP核的话直接在软件里生成就行,本文是以Quartus软件为例。

本文刚开始还不想用IP核来生成的,并介绍了使用Matlab中FDATOOL工具箱的方法,然后后面改用了IP核的方式来完成FIR滤波器的设计与仿真。

Fdatool生成FIR相关的系数

打开matlab的fdatool工具箱。

bde93c13cdcf4f7d989b4c8132ff8abb.png

然后选择设计需要的滤波器,低通,FIR滤波器,窗函数设计(Window),采用布莱克曼窗(Blackman),99阶(这样有100个系数),采样频率50MHz,通带频率1.5MHz。

afa9f33ae60e4bcb82e2c3f01f598b97.png

按照上图设定参数后,在上图中Specify order是阶数,Fc是截止频率,Fs是序列的采样频率。点击Design Filter。

82a5792a82dc4e9e97b46c4c7697d634.png

设计完成了,可以看到显示的频率为0~Fs/2的幅频响应,大概在2MHz左右幅度下降为原来的-60dB以下,也就是正常幅度的千分之一。

由于在FPGA中计算浮点数是一件很麻烦的事情,此处就设置成定点数,且位数越高越精确,这里设置的是16位定点数来量化。

07c795f59e824a86a8008f6bceb7b410.png

f7c253fc72a8458c953be07e2ea0a447.png

然后点击Apply。下方图片中实线是量化后的,虚线是未量化过的精准的。可以看到虽然5MHz之后的阻带衰减不如原来,但也可以衰减到-100dB,也就是原来的1/100000。这个衰减程度已经足够了。

ab2dcf42e5304849be1f35dbceeb01cb.png

最后是导出系数。直接通过file——export导出的是没有经过量化的系数,通过量化的系数要经过Targets———XILINX Coefficient file导出.coe文件就可以查看量化后的数了。

e97469835cbc463996391750e0eac1e6.png

新建Quartus工程设计FIR滤波器

首先创建好工程,这里不再赘述。

然后,生成FIR Compiler II 的IP核,随意先生成了一个,但是好像还不太对。后来才知道,应该选用FIR Complier v13.1的FIR IP核。首先进入step1,最开始要设置好滤波器系数,但是不知道为什么就是导不进去。如果可以导进去的话那么matlab中的fdatool工具箱我们就是用到了,但是问题就是导不进去。不过好在点击上面那个floating Coefficient Set可以自动生成浮点数的滤波器系数。

ee158fd3681a482781f572320408b0d2.png

于是我们简单设置以下,让IP核自动生成相应的系数。

ecce4767cf4e4f999fa33389a662c4df.png

然后设置一下数据位宽

f7a092eb076b465082bdb7b0ca5f5415.png

Step2的内容就全部勾选即可,然后进入step3自动生成IP核。

仿真

采用IP核的方式产生的FIR滤波器仿真的话直接通过编辑textbench仿真文件的方式仿真;采用Verilog语言编写方式产生的FIR滤波器在编辑textbench仿真文件之前还需对顶层.v文件进行编辑。

首先介绍采用IP核的方式仿真,一开始遇到的问题是关于FIR Compliter的IP核没有破解,后来需要改一下Licence文件才能使用。如下图所示,原来红框中是00A2,后来改成FIR Compliter的IP核的ID号,然后重启就能正常编译使用了。

49cf9f8950984a88b7ccbc7b8d81ae30.png

64604b519fec47699d27ec250fd7ccea.png

然后遇到的问题是待滤波的数据和滤波后的数据分别是怎样输入进去以及怎样输出保存起来的。先做一种尝试,待滤波的数据通过Matlab生成并存放在.txt文档中,然后在仿真文件里调用该文档的数据,不过要注意采样周期和采样数据点的问题,也就是时序的问题。输出的数据的话先不用管,直接通过仿真看滤波后输出数据的变化即可。

编写Matlab程序产生待滤波信号,产生两个信号0.5MHz和5MHz,采样频率50MHz,采样5个周期,进行16-bit量化,并把量化后的数据写到.txt文件中。目前的问题在于怎么转换成16位二进制数。最后还是选择一种比较好的方法。首先判断读取的一个数是否大于零,如果大于零,直接采用dec2bin函数转换成16位的二进制数;如果小于零,则用216e6d082af578d47f7b6508a01a67adef0.png减去该数的绝对值,再用dec2bin函数将其转换成16位的二进制数。主要卡在如何分别读取每一个数上面,还是对matlab的操作不太熟悉。不过好在最后还是弄出来了。Matlab相关程序如下图所示。

2be0c13300904812bfbced6ada833411.png

最终生成的十进制数和二进制数的txt文件内容如下图所示。

b8b2b76f7a7749588404afefb5d3c702.png0c40aed2ff264864b2b428692edaf2c6.png

然后再学习一下FFT算法,利用matlab先对输入的数据进行频谱分析。有两种方法,一种是编写程序的方法,在MATLAB中,FFT的调用函数主要有两个,即:Y=FFT(X)和Y=FFT(X,N)。网上的例子:

clf;
fs=100;N=128;   %采样频率和数据点数
n=0:N-1;t=n/fs;   %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号
y=fft(x,N);    %对信号进行快速Fourier变换
mag=abs(y);     %求得Fourier变换后的振幅
f=n*fs/N;    %频率序列
subplot(2,2,1),plot(f,mag);   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;

一种是利用Simulink仿真模型的方法。首先导入数据,然后进入Simulink。利用Powergui模块进行FFT分析,加上一个Form warkspace和一个示波器就可以了,具体就不介绍。

905f05e37ff4412c91f78b34a4cb4bfa.png

我们只需要知道FFT输入的是按时间来划分的采样点数据,经过FFT运算之后得出的是按频率来划分的同样数据长度的数据。

    之后我们进入最关键的阶段,即仿真阶段。我们只需要导入Matlab生成的待滤波信号,然后在仿真软件中观察滤波后的信号即可。

我们先编写好仿真文件。

f0720594272c4aed90a2ebd54ac12d02.png

然后联合Modelsim仿真。右键data_in和data_out设置radix为decimal十进制,format为analog。

b7f71364ce5e4058896a8b41fed61112.png

得到仿真结果,可以看到其周期为2000ns,即0.5MHz,表示5MHz干扰滤除干净了。

523ccb64df0340e49f5d76d830cafa7f.png

本文大部分内容都属于原创,如需转载,请附上本文网站,

如果需要相关的仿真图、程序代码等资料可以直接私信我,我会及时回复。

 

 

相关文章:

FIR滤波器简述及FPGA仿真验证

数字滤波器的设计,本项目做的数字滤波器准确来说是FIR滤波器。 FIR滤波器(有限冲激响应滤波器),与另一种基本类型的数字滤波器——IIR滤波器(无限冲击响应滤波器)相对应,其实就是将所输入的信号…...

高速信号处理板资料保存:383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡设计原理图

基于kintex UltraScale XCKU060的双路QSFP光纤PCIe 卡 一、板卡概述 本板卡系我司自主研发,基于Xilinx UltraScale Kintex系列FPGA XCKU060-FFVA1156-2-I架构,支持PCIE Gen3 x8模式的高速信号处理板卡,搭配两路40G QSFP接口&#xf…...

QT:使用分组框、单选按钮、普通按钮、标签、行编辑器、垂直分布、水平分布做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QRadioButton> //单选按钮 #include <QGroupBox> //分组框 #include <QHBoxLayout> //水平布局 #include <QVBoxLayout> //垂直布局 #include <QPushButton>…...

封装微信小程序隐私信息授权

隐私 代码 html &#xff08;modal 组件再后面封装有提供&#xff09; <modal isShow"{{show}}"><view class"privacy-auth-dialog"><view class"title">温馨提示</view><view class"content"><vi…...

【C#】FileInfo类 对文件进行操作

提示&#xff1a;使用FileInfo类时&#xff0c;要引用System.IO命名空间。 using System.IO; FileInfo类 生成文件删除文件移动文件复制文件获取文件名判断文件是否存在属性列表其它常用方法 生成文件 Create()&#xff1a;在指定路径上创建文件。 FileInfo myFile new FileIn…...

python中的字符串也是可迭代对象吗?

python中的字符串也是可迭代对象吗&#xff1f; ━━━━━━━━━━━━━━━━━━━━━━   是的&#xff0c;Python中的字符串是可迭代对象。这意味着你可以像处理列表或元组那样处理字符串。例如&#xff0c;你可以使用for循环遍历字符串中的每个字符&#xff0c;或…...

C++ 图像线特征提取【HoughLinesP算法】

目录 一、函数介绍二、实现步骤三、代码示例一、函数介绍 HoughLinesP:是一种基于Hough变换的直线检测算法。它可以识别图像中的直线,并返回它们的端点坐标。其函数接口如下: cv::HoughLinesP(   InputArray src,   // 输入图像,必须 8-bit 的灰度图像   OutputArray…...

Stable Diffusion WebUI内存不够爆CUDA Out of memory怎么办?

在我们运行SD的时候,我们经常会爆CUDA Out of memory。 我们应该怎么办呢? 这是因为我们的显存或者内存不够了。 如果你是用cpu来跑图的则表示内存不够,这个时候就需要换个大点的内存了。 如果你是用gpu来跑图的就说明你显存不够用咯,这时候咋办呢? 下面我将一一述说…...

模板学堂|数据可视化仪表板大屏设计流程梳理

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https&#xff1a;//dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&a…...

基于Xml方式Bean的配置-Bean的延时加载

SpringBean的配置详解 Bean的延时加载 当lazy-init设置为true时为延时加载&#xff0c;也就是当Spring容器创建的时候&#xff0c;不会立即创建Bean实例&#xff0c;等待用到时再创建Bean实例并储存到单例池中&#xff0c;后续使用该Bean时直接从单例池中获取即可&#xff0c;…...

python之pyQt5实例:Matplotlib的应用

1、显示逻辑 1.1MatplotlibWidget.py import sys import random import matplotlibmatplotlib.use("Qt5Agg") from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget from numpy import arange, si…...

智囊AI-基于 ChatGPT 的 AI 工具产品 你的私人AI助手

智囊AI是一款基于 ChatGPT 的 AI 工具产品&#xff0c;主打免费、智能、方便&#xff0c;可以在此雇佣各种各样的免费智囊进行对话、自己创造和分享智囊、共享有趣有用的对话等。不过使用需要注册登录&#xff0c;可以使用自己的openai key或者使用网站提供的api key&#xff0…...

nginx配置vue前端代理

背景&#xff1a;做一个前后端分离的项目&#xff0c;我这里是vue3 view ts创建的前端项目&#xff0c;在前端配置跨域请求。 一、开发阶段 在vue.config.js中配置devserver的proxy进行代理请求配置&#xff0c;然后将所有请求改为/api开头的即可。但是这样配置只在开发阶段…...

【C语言】【数据存储】用%u打印char类型?用char存128?

1.题目一&#xff1a; #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }%u 是打印无符号整型 解题逻辑&#xff1a; 1. 原反补互换&#xff0c;截断 -128 原码&#xff1a;10000000…10000000 补码&#xff1a;11111111…10000000…...

git-git命令汇总

1.git 存储永久凭据 git config --global credential.helper store 2.git 查询分支或标签的引用 git show-ref 【标签名|分支名】 3.git 搜索关键分支和tag git tag -l *branch* --sortcommitterdate 4.git 删除标签 git tag -d v1.32 删除标签v1.32&#xff0c;参数d…...

自定义实现简易版ArrayList

文章目录 1.了解什么是顺序表2.实现哪些功能3.初始化ArrayList4.实现功能接口遍历顺序表判断顺序表是否已满添加元素指定下标添加元素自定义下标不合法异常判断顺序表是否为空查找指定元素是否存在查找指定元素返回下标获取指定下标的元素顺序表为空异常修改指定下标元素的值删…...

React中的Hooks--useReducer()

首先&#xff0c;useReducer是React提供的一个钩子函数&#xff0c;用于管理组件内部的状态。它可以接收一个reducer函数和初始状态&#xff0c;并返回一个包含状态和更新状态的函数的数组。 与之相反&#xff0c;Redux是一个独立的状态管理库&#xff0c;它可以在整个应用程序…...

DM@数理逻辑@命题公式及其赋值@真值表@公式分类

文章目录 abstract命题公式及其赋值命题常项命题变项 命题公式合式公式(命题公式)限定基本联结词的合适公式的定义合式公式中的0和1子公式 **公式的层次定义**分层加括号 命题公式的赋值和解释成真赋值成假赋值公式的书写规范括号的省略 真值表赋值方法数量构造真值表 公式分类…...

HTTP协议(超级详细)

HTTP协议介绍 基本介绍&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议&#xff0c;是基于TCP/IP通信协议来传送数据的&#xff0c;其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…...

leetcode做题笔记135. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回需要准备的…...

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式&#xff0c;即在数据库管理系统的层面中如何组织和管理数据&#xff0c;与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现&#xff0c;是不可见的&#xff0c;可以通过查询数据库数据字典了解逻…...

在 Python 中计算两个 GPS 点之间的距离

计算两个 GPS 点之间的距离是我们可以在 Python 框架内操作的地理和数学练习。 现在让我们看看如何使用 Python 执行此操作。 在 Python 中使用 Haversine 公式计算两个 GPS 点之间的距离 haversine 公式是用 Python 计算两个 GPS 点之间距离的一种简化方法,但它的计算是基于…...

影刀RPA解决WPS不存在的问题

问题阐述 明明电脑上已经安装了WPS&#xff0c;但影刀程序还是提示没有安装的问题 解决办法 1.打开WPS并关闭所有其他网页 2. 配置与修复 3.开始修复 出现这个框&#xff0c;就要关闭WPS&#xff0c;否则无法执行&#xff0c;关闭WPS不影响其修复 4.等待修复完成即可...

vue动态路由切换刷新保留历史路由搜索条件数据

最近有客户反映我们系统按条件查询完列表进入详情页后再返回列表页时页面没有展示他查询的那条数据&#xff0c;而是进入页面一贯会展示按无条件查询的数据&#xff0c;希望我们能对列表做查询缓存&#xff0c;那咱们就用keep-alive来实现一下 AppMain.vue include 属性绑定一个…...

免费:CAD批量转PDF工具,附下载地址

分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点&#xff01;重点&#xff01;重点&#xff01;自动将CAD的多张图纸一次性地、批量地转为PDF&#xff0c;或者打印。效果看下图&#xff1a; 适用环境&#xff1a; 32位系统 Auto…...

无涯教程-JavaScript - FACT函数

描述 The FACT function returns the factorial of a number. The factorial of a number is equal to 1&ast;2&ast;3&ast;...&ast; number. 语法 FACT (number)争论 Argument描述Required/OptionalNumberThe nonnegative number for which you want the f…...

UART 协议

文章目录 电气层硬件拓扑基本原理协议空闲位起始位数据位奇偶校验位无校验奇校验偶校验mark parityparity 停止位 波特率优缺点优点缺点 参考 UART(universal asynchronous receiver-transmitter) 通用异步收发器 分类特点导线2速度9600&#xff0c; 19200&#xff0c; 38400&…...

MySql中分割字符串

MySql中分割字符串 在MySql中分割字符串可以用到SUBSTRING_INDEX&#xff08;str, delim, count&#xff09; 参数解说       解释 str         需要拆分的字符串 delim         分隔符&#xff0c;通过某字符进行拆分 count          当 count 为正数&…...

Ubuntu 22.04安装过程

iso下载地址 Ubuntu Releases 1.进入引导菜单 选择Try or Install Ubuntu Server安装 2.选择安装语言 默认选择English 3.选择键盘布局 默认即可 4.选择安装服务器版本 最小化安装 5.配置网络 选择ipv4 选择自定义 DHCP也可 6.配置代理 有需要可以配置 这里跳过 7.软件源 …...

【算法|虚拟头节点|链表】移除链表元素

Leetcode203 移除链表元素 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xf…...

网站建设布吉/安年软文网

文章目录 引言I 实现显示隐藏按钮II 控制按钮是否可响应事件see also引言 应用场景:登录界面、密码修改界面 效果: I 实现显示隐藏按钮 声明显示隐藏按钮 @property (weak...

网站上的办公网站怎么做/全网营销培训

HTML5中提供了跨域加载数据的方法&#xff0c;让我们得以从JSONP或者Flash中介等各种绕行方案中解脱出来&#xff0c;更加顺畅地与服务器交流。另一方面&#xff0c;因为PHP是最好的语言……所以在它与Node.js之间&#xff0c;我选择前者作为后端语言开发内容服务。这篇文章记录…...

网站建设找云尚网络/谷歌搜索入口手机版

JavaCV介绍JavaCV首先提供了计算机视觉领域研究人员常用的函数库的封装&#xff1a;OpenCV, FFmpeg, libdc1394, PGRFlyCapture, OpenKinect, videoInput,和ARToolKitPlus。可以通过其中的utility类方便的在包括Android在内的Java平台上调用这些接口。另外JavaCV还带有硬件加速…...

天津国际工程建设监理公司网站/品牌营销推广方案

发了vue2.0之axios使用详解(一)后&#xff0c;有朋友问如何在实际项目中使用&#xff0c;下面把我平常用的两种方法分享下&#xff0c;自己在实际项目中总结的方法&#xff0c;有不好的地方还请指正&#xff0c;共同提高&#xff0c;谢谢&#xff01; [javascript] view plainc…...

专门做实习计算机项目的网站平台/西安网站建设比较好的公司

问题&#xff1a;如何在一张图上面绘制多组散点图和折线图&#xff1f;例如在下面的评分数据中&#xff0c;每轮数据绘制散点图&#xff0c;平均值绘制折线图。 数据&#xff08;excel&#xff09;&#xff1a;营业厅评分数据 做法&#xff1a;R语言ggplot函数 1 library(readx…...

睿艺美开封做网站/互联网舆情监控系统

定义&#xff1a; jquery > js的dom操作进行封装&#xff0c;简化了js操作  //jquery就是把js封装成一个更简便的方法 jquery和js区别&#xff1a;找到元素&#xff0c;操作元素 只要看见 $ 符号就代表jquery&#xff0c;除非是自己定义了个方法 注意&#xff1a;想要用jq…...