基于FPGA的FFT图像滤波设计
1.FFT滤波算法介绍
FFT滤波就是通过傅里叶运算将图像转换到频域空间,然后在频域中对图像进行处理,最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。
在频域空间中,我们能够更好的对图像的噪声进行分析,然后找出相关规律将噪声信息去除。
本文重点讲解如何在FPGA中实现FFT图像算法,对于算法原理不过多讲解。
2.FFT滤波算法系统框架设计

如上图所示,本系统程序由5个模块组成,下面对每个每模块进行详细介绍。
2.1 image_sample_switch模块说明
该模块的作用将输入的图像数据进行变化,从而满足蝶形FFT的运算形式。为什么要对图像数据进行变化呢?因为蝶形FFT数据的数据必须满足
- 1. image_sample_switch程序接口
| 名称 | 方向 | 位宽 | 说明 |
| pixel_clk | Input | 1 | 图像工作时钟 |
| clk | Input | 1 | 算法运行时钟(2Xpixel_clk) |
| reset | Input | 1 | 复位信号(active high) |
| image_vs_i | Input | 1 | 图像场信号 |
| image_hs_i | input | 1 | 图像行信号 |
| image_data_i | input | size | 图像数据 |
| image_sample_wren_o | input | 1 | AXI总线形式的写信号 |
| image_sample_last_o | input | size | AXI总线形式的last信号 |
| image_sample_wrdb_o | Output | size | 转化后的图像数据 |
仿真结果如下图所示
2.2 image_fft_control模块说明
该模块的作用是实现FFT的蝶形运算,由于蝶形运算比较复杂,我们直接调用xilinx的FFT-IP进行运算。
如下图所示,调用FFT-IP,将转换深度设置为1024(因为我们的图像是每行640个像素),资源选择pipelined streaming 模式。
将Data Format 设置为fixed point;
scaling options设置为unscaled;
rounding modes 设置为truncation
对IP的操作,首先将FFT-IP配置为FFT模式,然后按照AXI总线形式进行数据输入既可。
仿真结果如下图所示
2.3 image_fliter_cal模块说明
该模块的作用就是对频域数据进行计算,通过前面的FFT转化后的数据变成频域数值,频域数值是有实部和虚部,主要是对实部和虚部。如何对实部和虚部进行运算呢,就是分别对实部和虚部进行平方操作,然后将它们进行加法计算,将结果进行开平方操作;最近将开平方运算后的数据与设置的阈值进行比较。
2.4 image_ifft_control模块说明
该模块的作用就是将频域空间的数据转换到时域空间,该功能的实现通过调用Xilinx的FFT-IP实现。
- 1. image_ifft_contro程序接口
| 名称 | 方向 | 位宽 | 说明 |
| clk | Input | 1 | 工作时钟 |
| fft_initi_i | Input | 1 | Ip初始化信号 |
| image_fliter_wren_i | input | 1 | 图像写信号 |
| image_fliter_last_i | input | size | 图像结束信号 |
| image_fliter_db_im_i | input | size | 图像虚部数据 |
| Image_fliter_real_db_i | input | size | 图像实部数据 |
| image_ifft_wren_o | input | 1 | AXI总线形式的写信号 |
| image_ifft_last_o | input | size | AXI总线形式的last信号 |
| image_ifft_wrdb_o | Output | size | 转化后的图像数据 |

,所以对图像每行数据进行扩充,从而满足需求,一般补充的数据都是0,这样不会影响计算结果。
相关文章:
基于FPGA的FFT图像滤波设计
1.FFT滤波算法介绍 FFT滤波就是通过傅里叶运算将图像转换到频域空间,然后在频域中对图像进行处理,最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。 在频域空间中,我们能够更好的对图像的噪声进行分析,然后找出相关规律…...
WPF 立体Border
WPF 立体Border ,用来划分各个功能区块 在资源文件中,添加如下样式代码: <Style x:Key"BaseBorder" TargetType"Border"><Setter Property"Background" Value"White" /><Setter Prop…...
java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
今天在使用springBoot连接influxdb报错 java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 详细报错如下,提出我们缺少一个依赖 原因是由于创建influxdb客户端缺少Kotlin运行时库 解决办法就是 1.显示的添加okhttp的依赖 <dependency>…...
代码随想录(day8)——字符串
Leetcode.344 反转字符串: 344. 反转字符串 - 力扣(LeetCode) 原理过于简单,没什么好说的,直接给出代码: class Solution { public:void reverseString(vector<char>& s) {int end s.size()-1…...
JavaScript 权威指南第七版(GPT 重译)(二)
第四章:表达式和运算符 本章记录了 JavaScript 表达式以及构建许多这些表达式的运算符。表达式 是 JavaScript 的短语,可以 评估 以产生一个值。在程序中直接嵌入的常量是一种非常简单的表达式。变量名也是一个简单表达式,它评估为分配给该变…...
【python_往企业微信群中发送文件】
python_往企业微信群中发送文件 这个是用企业微信群机器人的功能,没有用到后台应用。群机器人 #-*- coding:utf-8-* import requests#类型:voice,file file_type"file" file_path"D:\desktop\不过.jpg" webhookkey"xxxx"#…...
华为校招机试 - 循环依赖(20240320)
题目描述 给定一组元素,及其依赖关系,一个元素可以依赖于多个元素(不包括自己,被依赖元素不会重复),一个元素也可被多个元素依赖。 假定总是存在唯一的循环依赖,请输出该循环依赖。 输入描述 第一行是个正整数 N (1 < N < 100),表示依赖关系的个数。 下面每…...
基于Spring Boot技术的幼儿园管理系统
摘 要 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种活动信息、课程信息、菜谱信息、通知公…...
查找众数及中位数 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那…...
bash命令执行.sh文件 windows python环境
报错: bash : 无法将“bash”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 ’ bash fetch_data.sh ‘ ~~~~ CategoryInfo : Object…...
refreactive vue3
ref 可以定义:基本类型、对象类型的响应式数据 reactive 只能定义:对象类型的响应式数据 <template><div class"person"><h2>Name: {{ name }}</h2><h2>Age: {{ age }}</h2><h2>Tel: {{ tel }}</h2><button cl…...
【项目实践Day06】异步请求与同步请求+Ajax+微信小程序上实现发送异步请求
什么是同步和异步 同步 在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。也就是一旦调用开始,就必须等待其返回结果,程序的执行顺序和任务排列顺序一致。客户端必须等待服务器端的响应。在等待的期间客…...
Elasticsearch面试系列-01
1. 什么是 Elasticsearch? ES是一种开源、RESTful、可扩展的基于文档的搜索引擎,它构建在Lucene库上。 用户使用Kibana就可以可视化使用数据,同时Kibana也提供交互式的数据状态呈现和数据分析。 Apache Lucene搜索引擎基于JSON文档来进行搜索管理和快速搜索。 Elasticse…...
QT tableWidget横向纵向设置
横向控件 要设置QTabWidget选项卡的字体方向,可以使用QTabWidget的setTabPosition()方法。通过传递Qt枚举值QTabWidget.east或QTabWidget.west作为参数,可以设置选项卡的字体方向为从左到右或从右到左。 myTabWidget QTabWidget() myTabWidget.setTabP…...
Unity Mesh简化为Cube mesh
Mesh简化为Cube mesh 🍳食用🥙子物体独立生成CubeMesh🥪合并成一个CubeMesh🌭Demo 🍳食用 下载并导入插件👈即可在代码中调用。 🥙子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…...
openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint
文章目录 openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint249.1 功能描述249.2 语法格式249.3 参数说明249.4 示例 openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint 249.1 功能描述 指明join的顺序࿰…...
大规模预训练语言模型的可解释性研究与实践
1. 背景介绍 随着深度学习技术的发展,大规模预训练语言模型(Large-scale Pre-trained Language Models, LPLMs)在自然语言处理领域取得了显著的成果。这些模型通常通过在大规模文本语料库上进行无监督预训练,然后微调到特定任务上…...
Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)
文章目录 Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)什么是serde库设计使用 Serde 处理jsonr# 的使用 参考 Rust常用库之序列化和反序列化库serde(使用 Serde 处理json) 什么是serde库 官网:https:/…...
java设计模式(2)---六大原则
设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓。 先列出六大原则:单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开闭原则。 一、单一职…...
数学建模(层次分析法 python代码 案例)
目录 介绍: 模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地 准则重要性矩阵: 每个准则的方案矩阵: 一致性检验: 特征值法求权值: 完整代码: 运行结果: 介绍:...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
