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

FPGA离群值剔除算法

讲解视频:

https://www.bilibili.com/video/BV1mubWzvEsA/?spm_id_from=333.1387.homepage.video_card.click&vd_source=69fb997b62efa60ae1add8b53b6a5923

采用中位数MAD离群值剔除算法,即对于一组源源不断输入的离散数据,采用一个窗口进行动态存储,并每来一个数据就检验窗口内的中位数median,然后用所有数据减去median取绝对值得到绝对偏差,然后找出偏差的中位数median absult deviation(MAD),然后通过判断即将被移出窗口的那个数据是否超过k倍MAD,超过则将其视作离群值进行剔除并用当前窗口中位数median替代输出。

//中位数法剔除离群值
module outlier_removal(input				i_clk	,input				i_rst	,input		[15:0]	i_data	,input				i_dvld	,output	reg	[15:0]	o_data	,output	reg			o_dvld	);localparam	WIN = 16;	genvar i;//寄存reg		signed	[15:0]	r_data_shreg	[0:WIN - 1];reg						r_dvld_shreg	[0:WIN - 1];reg		signed	[15:0]	r_median	;//中位数wire		[16 * WIN - 1:0]	w_sorti_data	;wire		[16 * WIN - 1:0]	w_sorto_data	;//排完序的数据wire signed	[15:0]		w_data_sorted	[0:WIN - 1];generatefor(i = 0; i < WIN; i = i + 1) beginassign	w_sorti_data[16 * i + 15:16 * i] = r_data_shreg[i];assign	w_data_sorted[i] = w_sorto_data[16 * i + 15:16 * i];endendgenerate//求数据中位数always@(posedge i_clk or posedge i_rst) beginif(i_rst)r_median <= 'd0;else r_median <= (w_data_sorted[WIN / 2] + w_data_sorted[WIN / 2 - 1]) / 2;end//中位数偏差缓存reg	signed	[15:0]	r_dev_buff	[0:WIN - 1]	;wire		[15:0]	w_adev_buff	[0:WIN - 1]	;generatefor(i = 0; i < WIN; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst)r_dev_buff[i] <= 'd0;elser_dev_buff[i] <= r_data_shreg[i] - r_median;endassign	w_adev_buff[i] = r_dev_buff[i][15] ? $signed(-1) * r_dev_buff[i] : r_dev_buff[i];//取绝对值endendgeneratewire		[16 * WIN - 1:0]	w_sorti_adev	;wire		[16 * WIN - 1:0]	w_sorto_adev	;wire		[15:0]	w_adev_sorted	[0:WIN - 1]	;generatefor(i = 0; i < WIN; i = i + 1) beginassign 	w_sorti_adev[i * 16 + 15:i * 16] = w_adev_buff[i];assign	w_adev_sorted[i] = w_sorto_adev[i * 16 + 15:i * 16];endendgeneratereg		[15:0]	r_data_mad	;//绝对偏差中位数always@(posedge i_clk or posedge i_rst)beginif(i_rst)r_data_mad <= 'd0;else r_data_mad <= (w_adev_sorted[WIN / 2] + w_adev_sorted[WIN / 2 - 1]) / 2;end
//排序数据求中位值
bitonic_sort
sort_data_u	(.i_clk	(i_clk		 ),.i_rst	(i_rst		 ),.i_buff	(w_sorti_data),.o_buff (w_sorto_data)
);
//排序绝对偏差求MAD
bitonic_sort
sort_adev_u	(.i_clk	(i_clk		 ),.i_rst	(i_rst		 ),.i_buff	(w_sorti_adev),.o_buff (w_sorto_adev)
);wire	w_outlier_judge;assign 	w_outlier_judge = (w_adev_buff[WIN - 1] >> 2) >= r_data_mad;//系数为4//移位寄存数据always@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_dvld_shreg[0] <= 'd0;r_data_shreg[0] <= 'd0;endelse if(i_dvld) beginr_dvld_shreg[0] <= 'd1;r_data_shreg[0] <= i_data;endelse beginr_dvld_shreg[0] <= r_dvld_shreg[0];r_data_shreg[0] <= r_data_shreg[0];endendgeneratefor(i = 1; i < WIN; i = i + 1) beginalways@(posedge i_clk or posedge i_rst) beginif(i_rst) beginr_dvld_shreg[i] <= 'd0;r_data_shreg[i] <= 'd0;endelse if(i_dvld) beginr_dvld_shreg[i] <= r_dvld_shreg[i - 1];r_data_shreg[i] <= r_data_shreg[i - 1];endelse beginr_dvld_shreg[i] <= r_dvld_shreg[i];r_data_shreg[i] <= r_data_shreg[i];endendendendgenerate//新到一个数据就排出一个数据always@(posedge i_clk or posedge i_rst) beginif(i_rst) begino_data <= 'd0;o_dvld <= 'd0;endelse if(i_dvld) begino_data <= w_outlier_judge ? r_median : r_data_shreg[WIN - 1];//如果是离群值则使用中位数替代o_dvld <= r_dvld_shreg[WIN - 1];endelse begino_data <= o_data;o_dvld <= 'd0;endendendmodule

tb文件

module out_rm_tb();reg				i_clk	;reg				i_rst	;reg		[15:0]	i_data	;reg				i_dvld	;wire	[15:0]	o_data	;wire			o_dvld	;always#10 i_clk = ~i_clk;initial begini_clk = 1;i_rst = 1;i_data = 'd0;i_dvld = 'd0;#105i_rst = 0;repeat(16) begini_data = $random()%16'hff;i_dvld = 'd1;#20;i_dvld = 'd0;#20;end#20i_data = 16'hFEBA;i_dvld = 'd1;#20i_dvld = 'd0;#20i_data = 16'h7d6e;i_dvld = 'd1;#20i_dvld = 'd0;#20i_data = 16'h78a8;i_dvld = 'd1;#20i_dvld = 'd0;#20i_data = 16'h00a0;i_dvld = 'd1;#20i_dvld = 'd0;#20repeat(32) begini_data = $random()%16'hfff;i_dvld = 'd1;#20;i_dvld = 'd0;#100;endendoutlier_removal
outlier_removal_u(i_clk	,i_rst	,i_data	,i_dvld	,o_data	,o_dvld	
);endmodule

http://www.xdnf.cn/news/1443421.html

相关文章:

  • wpf 自定义输入ip地址的文本框
  • Linux之shell-awk命令详解
  • Jenkins 可观测最佳实践
  • Jenkins和Fastlane的原理、优缺点、用法、如何选择
  • 记录一下node后端写下载https的文件报错,而浏览器却可以下载。
  • nginx配置端口转发(docker-compose方式、包括TCP转发和http转发)
  • C++ 面试高频考点 力扣 162. 寻找峰值 二分查找 题解 每日一题
  • Apache Kafka:现代数据高速公路的设计哲学
  • 嵌入式硬件 - 51单片机2
  • (11)用于无GPS导航的制图师SLAM(二)
  • AI产品经理面试宝典第84天:RAG系统架构设计与优化策略面试指南
  • C#工作流示例(WorkflowCore)
  • 基于Docker和Kubernetes的CI/CD流水线架构设计与优化实践
  • Go语言实战案例-Redis实现用户登录次数限制
  • 基于单片机车内换气温度检测空气质量检测系统Proteus仿真(含全部资料)
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • 在 Android MVVM 架构中,获取 ViewModel 的几种方式
  • 微服务的编程测评系统20-虚拟机-nginx-部署
  • 基于Java的瑜伽馆管理系统的设计与实现(代码+数据库+LW)
  • 【LeetCode】21、合并两个有序链表
  • 【设计模式】 装饰模式
  • 【机器学习深度学习】RAG边界处理策略
  • Django REST Framework Serializer 进阶教程
  • word删除指定页面
  • Ubuntu22.04中使用cmake安装abseil-cpp库
  • 【数据分享】283个地级市产业结构合理化水平和产业结构高级化指数(2006-2019)
  • Upload-Labs靶场全20关通关攻略(含原理+实操+环境配置)
  • 利用 Python 绘制环形热力图
  • SuperMap GIS基础产品FAQ集锦(20250819)
  • HTML应用指南:利用POST请求获取全国九号电动车体验店服务店位置信息