基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录

  • 1.前言
  • 2.原理
  • 3.举例说明
  • 4.Matlab实现
  • 5.FPGA实现滑动平均

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1.前言

对于一维信号,我们可以使用类似移动平均滤波(Moving Average Filtering)实现denoising。Moving Average Filtering 是一种简单的信号滤波算法,用于减小信号中的噪声或去除高频成分,从而平滑信号。它基于对信号中一定窗口内数据的平均值进行计算。移动平均滤波可以平滑信号,但对快速变化的信号可能响应较慢。

2.原理

给定一个包含 N 个样本的信号序列$ x [ n ] $,其中 n 是样本的索引(从 0 到 N-1)。移动平均滤波通过在信号序列上滑动一个固定长度为 M 的窗口,并计算窗口内样本的平均值来进行滤波。

对于滑动窗口的每个位置 k,滤波后的输出 y[k] 可以通过以下公式计算:
y [ k ] = x [ k ] + x [ k − 1 ] + x [ k − 2 ] + . . . + x [ k − M + 1 ] M y[k]= x[k]+x[k−1]+x[k−2]+...+x[k−M+1] \over M My[k]=x[k]+x[k1]+x[k2]+...+x[kM+1]

其中,$x [ k ] $表示信号序列中索引为 k 的样本值。公式中的 $1 / M $ 是归一化因子,用于平均化窗口内的样本值。

移动平均滤波的核心思想是利用窗口内多个样本的平均值来代表当前样本的值,从而减小随机噪声或高频成分对信号的影响。滑动窗口的大小 M 决定了平滑的程度,较大的窗口可以更有效地平滑信号,但可能会导致滞后响应;较小的窗口可以更快地响应信号的变化,但平滑效果可能较差。

需要注意的是,移动平均滤波是一种线性滤波方法,主要适用于平稳信号或缓慢变化的信号。对于包含快速变化的信号或脉冲信号,移动平均滤波可能导致平滑效果不佳或信号失真。在实际应用中,根据具体的信号特性和需求,可以选择不同的滤波方法以获得更好的结果。

3.举例说明

比方说,当我们有一个包含噪声的信号序列时,例如:
x = [ 2 , 4 , 3 , 7 , 6 , 5 , 10 , 8 , 9 , 12 ] x=[2,4,3,7,6,5,10,8,9,12] x=[2,4,3,7,6,5,10,8,9,12]
我们可以使用移动平均滤波来平滑信号并减小噪声的影响。假设我们选择一个窗口大小为3,即每次计算三个样本的平均值。
第一个输出样本为:
y [ 0 ] = ( 1 / 3 ) ∗ ( 2 + 4 + 3 ) = 3 y[0]=(1/3)∗(2+4+3)=3 y[0]=(1/3)(2+4+3)=3
第二个输出样本为:
y [ 1 ] = ( 1 / 3 ) ∗ ( 4 + 3 + 7 ) = 4.67 y[1]=(1/3)∗(4+3+7)=4.67 y[1]=(1/3)(4+3+7)=4.67
以此类推,我们可以继续计算后续输出样本。如果数学比较好的朋友,此刻大概能看出这其实就是卷积。
而卷机核函数,就是长度为N,元素值为 1 N \frac{1}{N} N1。所以,我们可以使用Matlab的filter函数来实现Moving Average Filtering(滑动平均)。

4.Matlab实现

网上找了一段别人采集的原始信号数据如下:

y0 =列 1 至 160.0300   -1.4600   -0.2600   -0.4700   -1.4600   -0.0600   -0.4700   -1.2700    0.1500   -0.4700   -1.4700   -0.0100   -0.4700   -1.2700    0.1700   -0.6300列 17 至 32-1.3700    0.1500   -0.8800   -1.0700    0.2500   -0.8800   -1.2700    0.2500   -0.8800   -1.0700    0.4000   -1.0800   -1.0700    0.1100   -1.2800   -0.8700列 33 至 480.2100   -1.2800   -0.9400    0.3600   -1.2800   -0.4600    0.2500   -1.2800   -0.4600    0.2300   -1.2300   -0.4600   -0.0700   -1.3100   -0.4600    0.2300列 49 至 64-1.3100   -0.4600    0.1300   -1.4900   -0.4600   -0.4700   -1.3900   -0.4600   -0.4700   -1.4400   -0.3600    0.0300   -1.4400   -0.2600    0.0300   -1.5600列 65 至 80-0.2600   -0.4700   -1.4100   -0.2600   -0.4700   -1.6000   -0.2600   -0.4700   -1.2700    0.0700   -0.4700   -1.4200    0.1500   -0.8800   -1.2700    0.3000列 81 至 96-1.0800   -1.0700    0.1800   -1.3400   -0.4600    1.8600    6.6500    9.0600    8.0300    7.1400    7.7900    4.7900    2.8800    3.0800    1.5500    1.2600列 97 至 1121.9600    0.4400    0.9600    1.4500   -0.0900    1.1600    0.9400   -0.2600    1.1600   -0.4700   -1.2700    0.1000   -1.2800   -0.4600    0.1800   -1.3100列 113 至 128-0.4600   -0.1200   -1.4900   -0.0100   -0.6800   -1.2700    0.0400   -1.0800   -0.4600    0.2300   -1.2800   -0.4600   -0.4700   -1.4600   -0.3100   -0.4700列 129 至 144-1.4500    0.1500   -0.5800   -1.4700    0.1500   -0.8800   -1.2700    0.2500   -0.8800   -1.2700    0.3500   -1.0800   -1.1700    0.2200   -1.0800   -1.0700列 145 至 1600.1100   -1.2800   -1.0700    0.4000   -1.2800   -2.4900   -7.3600  -11.0100   -9.9800   -7.3900   -9.1900   -6.9400   -4.0700   -4.6000   -3.7000   -1.9800列 161 至 176-3.3100   -2.6900   -1.3000   -2.7000   -2.4900   -1.1300   -2.5000   -2.0800   -0.6800   -1.6900   -0.4600    0.0300   -1.3900   -0.4600    0.2100   -1.3100列 177 至 192-0.4600    0.0800   -1.3900   -0.7700    0.1300   -1.4900   -0.4600    0.2300   -1.4900   -0.4600   -0.0200   -1.4900   -0.4100    0.1800   -1.4600   -0.4600列 193 至 208-0.4700   -1.4200   -0.2600   -0.4700   -1.4400   -0.2600   -0.4700   -1.5500   -0.0100   -0.5800   -1.4200   -0.4600   -0.4700   -1.4500   -0.0600   -0.5000列 209 至 224-1.2700    0.1500   -0.8800   -1.2700    0.3500   -1.2800    0.5500    7.4800    8.3300    8.7600    7.8300    6.8300    5.7200    3.4800    1.9700    2.5400列 225 至 2401.0200    1.3600    1.8600    0.3400    0.9600    0.9400   -0.0600    1.1600    0.3400   -0.0600    0.5100   -1.2800   -0.4600    0.1300   -1.4400   -0.2600列 241 至 256-0.4700   -1.4500    0.0600   -0.7000   -1.2200    0.3200   -1.1800   -0.4600    0.0700   -1.5400   -0.3100   -0.4700   -1.2700    0.1500   -0.9800   -1.1700列 257 至 2720.2600   -1.2300   -0.4600   -0.0700   -1.3400   -0.4600   -0.0700   -1.3000   -0.1600   -0.4700   -1.4900   -0.2600   -0.4700   -1.4500   -0.0600   -0.4700列 273 至 288-1.4700    0.0400   -0.6800   -1.4200    0.0700   -0.8800   -2.6100   -7.1500  -10.3000  -10.3400   -7.3000   -8.5800   -7.7500   -4.1100   -4.3200   -3.9100列 289 至 304-1.6300   -3.0100   -3.1000   -1.2100   -2.6000   -2.4900   -1.0600   -2.3000   -2.0800   -0.6600   -1.4900   -1.1700    0.1200   -1.2800   -0.4600    0.3100列 305 至 320-1.3400   -0.4600    0.0600   -1.4900   -0.4600   -0.0700   -1.3900   -0.4100   -0.4700   -1.4900   -0.4600   -0.4700   -1.4400   -0.3600   -0.1200   -1.4600列 321 至 331-0.0600   -0.4700   -1.4200   -0.2100   -0.4700   -1.4700   -0.0600   -0.5300   -1.2700    0.1700   -0.6800

为了直观,下面简单的画一下他的图:

y0=[0.03	-1.46	-0.26	-0.47	-1.46	-0.06	-0.47	-1.27	0.15	-0.47	-1.47	-0.01	-0.47	-1.27	0.17	-0.63	-1.37	0.15	-0.88	-1.07	0.25	-0.88	-1.27	0.25	-0.88	-1.07	0.4	-1.08	-1.07	0.11	-1.28	-0.87	0.21	-1.28	-0.94	0.36	-1.28	-0.46	0.25	-1.28	-0.46	0.23	-1.23	-0.46	-0.07	-1.31	-0.46	0.23	-1.31	-0.46	0.13	-1.49	-0.46	-0.47	-1.39	-0.46	-0.47	-1.44	-0.36	0.03	-1.44	-0.26	0.03	-1.56	-0.26	-0.47	-1.41	-0.26	-0.47	-1.6	-0.26	-0.47	-1.27	0.07	-0.47	-1.42	0.15	-0.88	-1.27	0.3	-1.08	-1.07	0.18	-1.34	-0.46	1.86	6.65	9.06	8.03	7.14	7.79	4.79	2.88	3.08	1.55	1.26	1.96	0.44	0.96	1.45	-0.09	1.16	0.94	-0.26	1.16	-0.47	-1.27	0.1	-1.28	-0.46	0.18	-1.31	-0.46	-0.12	-1.49	-0.01	-0.68	-1.27	0.04	-1.08	-0.46	0.23	-1.28	-0.46	-0.47	-1.46	-0.31	-0.47	-1.45	0.15	-0.58	-1.47	0.15	-0.88	-1.27	0.25	-0.88	-1.27	0.35	-1.08	-1.17	0.22	-1.08	-1.07	0.11	-1.28	-1.07	0.4	-1.28	-2.49	-7.36	-11.01	-9.98	-7.39	-9.19	-6.94	-4.07	-4.6	-3.7	-1.98	-3.31	-2.69	-1.3	-2.7	-2.49	-1.13	-2.5	-2.08	-0.68	-1.69	-0.46	0.03	-1.39	-0.46	0.21	-1.31	-0.46	0.08	-1.39	-0.77	0.13	-1.49	-0.46	0.23	-1.49	-0.46	-0.02	-1.49	-0.41	0.18	-1.46	-0.46	-0.47	-1.42	-0.26	-0.47	-1.44	-0.26	-0.47	-1.55	-0.01	-0.58	-1.42	-0.46	-0.47	-1.45	-0.06	-0.5	-1.27	0.15	-0.88	-1.27	0.35	-1.28	0.55	7.48	8.33	8.76	7.83	6.83	5.72	3.48	1.97	2.54	1.02	1.36	1.86	0.34	0.96	0.94	-0.06	1.16	0.34	-0.06	0.51	-1.28	-0.46	0.13	-1.44	-0.26	-0.47	-1.45	0.06	-0.7	-1.22	0.32	-1.18	-0.46	0.07	-1.54	-0.31	-0.47	-1.27	0.15	-0.98	-1.17	0.26	-1.23	-0.46	-0.07	-1.34	-0.46	-0.07	-1.3	-0.16	-0.47	-1.49	-0.26	-0.47	-1.45	-0.06	-0.47	-1.47	0.04	-0.68	-1.42	0.07	-0.88	-2.61	-7.15	-10.3	-10.34	-7.3	-8.58	-7.75	-4.11	-4.32	-3.91	-1.63	-3.01	-3.1	-1.21	-2.6	-2.49	-1.06	-2.3	-2.08	-0.66	-1.49	-1.17	0.12	-1.28	-0.46	0.31	-1.34	-0.46	0.06	-1.49	-0.46	-0.07	-1.39	-0.41	-0.47	-1.49	-0.46	-0.47	-1.44	-0.36	-0.12	-1.46	-0.06	-0.47	-1.42	-0.21	-0.47	-1.47	-0.06	-0.53	-1.27	0.17	-0.68];
figure
plot(y0)
title("原始信号")

采集的原始信号

使用Matlab的filter函数进行4点的滑动平均:

%% Matlab仿真
windowSize = 3; %滑动窗点数
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y1 = filter(b,a,y0);figure
subplot(3,1,1)
plot(y0)
title("原始信号")subplot(3,1,2)
plot(y1)
title("滑动平均滤波后")subplot(3,1,3)
plot(y0)
hold on
plot(y1)
title("对比")

Matlab仿真的滑动平均

5.FPGA实现滑动平均

模块的输入输出框图如下所示:

输入输出框图

模块功能:对输入信号取滑动平均值。例化调用格式如下:

MovAvg 
#(  .N(N),//滑动平均点数,2的n次方.WIDTH(WIDTH))数据位宽
u1(.clk     	(clk)           ,.rst_n   	(rst_n)         ,.din_vaild	(din_vaild)		,	.din     	(din)           ,.dout  		(dout)			,.dout_vaild	(dout_vaild)
);

参数N表示求N个点的平均值,参数WIDTH控制输入信号位宽,可以在例化调用的时候配置参数。

配置参数为16点滑动平均,位宽为8,使用依次递增1的数据进行测试:

16点滑动平均

配置参数为4点滑动平均,位宽为8,使用上面的数据输入进行测试,按照如下代码将数据存储到txt文件里面:

q = quantizer('fixed','round','saturate',[8,3]);%复数以8位定点数形式进行输出,格式为:1位符号位,4位整数位,3位小数位,负数以补码形式表示。
y0_q = num2hex(q,y0);%量化fid= fopen([PATH,'test_data.txt'],'w');
fprintf(fid,'%c%c\r\n',y0_q');

整体仿真截图

局部仿真放大图

对上面第4小节,Matlab实现的4点滑动平均进行对比:

Matlab仿真和FPGA输出结果对比

测试激励代码(注释部分为配置参数为16点滑动平均,位宽为8,使用依次递增1的数据进行测试):

`timescale 1ns / 1psmodule MovAvg_tb;
parameter		T = 20;//仿真时钟周期
parameter		NUM  = 331			;//测试数据个数
parameter		N = 4				;//滑动平均点数,2的n次方
parameter		WIDTH = 8			;//数据位宽
parameter		PATH = "D:/FPGA/FPGA_university/gra_stu_FPGA_class/MovAvg/";//文件路径
reg             clk					;
reg             rst_n				;
reg				din_vaild			;
reg  signed[7:0]   din				;
wire signed[7:0]   dout				;
wire			dout_vaild			;
reg   	[7:0]	test_data [NUM-1:0]	;
integer			i					;
integer signed	data_out			;
MovAvg #(.N(N),.WIDTH(WIDTH))
u1(.clk     	(clk)           ,.rst_n   	(rst_n)         ,.din_vaild	(din_vaild)		,	.din     	(din)           ,.dout  		(dout)			,.dout_vaild	(dout_vaild)
);
always #(T/2) clk = ~clk;
initial beginrst_n = 1'b0;din_vaild = 1'b0;clk = 1'b1;$readmemh({PATH,"test_data.txt"},test_data,0,NUM-1);data_out  =  $fopen({PATH,"data_out.txt"});#(T*5)rst_n = 1'b1;din_vaild = 1'b1;//test_data测试数据输入for(i=0;i<NUM;i=i+1)begindin = test_data[i];#T;enddin_vaild = 1'b0;
end//数据存储,由于从第N个点开始有效,输出会少N-1个数据
always@(posedge clk)
beginif(dout_vaild)begin$fdisplay(data_out,"%d",dout);end
end//输入为连续累加1数据的测试
/* always @(posedge clk or negedge rst_n)if (!rst_n)din <= 8'b0;elsedin <= din + 1'b1; */endmodule

下载工程源码链接:https://mp.weixin.qq.com/s?__biz=MzkxNjM0NDk2Nw==&mid=2247486083&idx=1&sn=e942deb7b27b2b7a3231751f803b158c&chksm=c150136bf6279a7d90128972cda2b7075a63d25fa3ce839c31b68ec66731d07478f4555dd6e4#rd
也可以选择此跳转

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

TPM 是什么?如何查看电脑的 TPM?

TPM 是什么&#xff1f; 首先我们来了解一下 TPM 是什么&#xff0c;TPM 由可信计算组织&#xff08;Trusted Computing Group&#xff0c;TCG&#xff09;开发&#xff0c;为了在提高计算机系统的安全性。随着网络安全威胁的不断增加&#xff0c;TPM 技术逐渐成为确保系统安全…

开源网关Apache APISIX启用JWT身份验证

说明&#xff1a; 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先&#xff0c;确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”&#xff0c;VS Code打开文件夹&#xff0c;打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

vite+ts设置别名

准备工作 安装 types/node 避免代码爆红 npm install types/node一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

618网购节,电商能挡住恶意网络爬虫的攻击吗?

目录 爬虫盗取电商数据的步骤 电商平台如何发现网络爬虫&#xff1f; 如何拦截违法网络爬虫 2023年&#xff0c;杭州中院审结了两起涉及“搬店软件”的不正当竞争案件。本案的原告是国内某大型知名电子商务平台的运营主体&#xff0c;而被告则是开发了一款名为“某搬家快速商品…

汽车分销商文件流转优化:实现稳定高效的文件分发处理

在汽车圈里&#xff0c;分销商可是个不可或缺的角色。他们既要跟汽车厂家紧紧绑在一起&#xff0c;还得跟下游的销售渠道或者直接跟消费者打成一片&#xff0c;文件来回传递那是家常便饭。 这文件发放的速度快不快&#xff0c;安不安全&#xff0c;直接影响到分销商做事的效率…

安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑

安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而&#xff0c;随着科技的进步&#xff0c;我们对时间管理和测量的方法已经发生了翻天覆地的变…

有哪些可以替代postman的接口测试软件?

替代Postman的接口测试软件有很多选择&#xff0c;其中一些流行的工具包括Insomnia、SoapUI、JMeter、Paw等。在本篇文章中&#xff0c;我将从0到1&#xff0c;详细介绍这些接口测试软件的使用方法和规范&#xff0c;帮助你选择适合的工具进行接口测试。 1. Insomnia Insomni…

手机怎么压缩视频?归纳了三种快速压缩方案

手机怎么压缩视频&#xff1f;在数字时代&#xff0c;手机已经成为我们记录生活的重要工具&#xff0c;而视频作为其中的一种主要形式&#xff0c;更是占据了极大的存储空间。然而&#xff0c;随着手机拍摄的视频越来越多&#xff0c;如何高效压缩视频以节省存储空间&#xff0…

⌈ 传知代码 ⌋ AI驱动食物图像识别

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Selenium时间等待_显示等待

特点&#xff1a; 针对具体元素进行时间等待 可以自定义等待时长和间隔时间 按照设定的时间&#xff0c;不断定位元素&#xff0c;定位到了直接执行下一步操作 如在设定时间内没定位到元素&#xff0c;则报错&#xff08;TimeOutException&#xff09; 显示等待概念&#x…

mysql的binlog占用大量磁盘空间的解决方法

查看当前日志保存天数&#xff1a; mysql> show variables like %expire_logs_days%; ------------------------- | Variable_name | Value | ------------------------- | expire_logs_days | 0 | ------------------------- 1 row in set (0.08 sec) 默认是0&…

基于Python的实验室管理系统的设计与实现(论文+源码)_kaic

摘 要 随着实验室设备越来越多&#xff0c;实验室及其设备管理工作变得越来越繁重&#xff0c;还存在些管理模式仍旧处于手工管理模式和一些抢占实验室的不文明现象&#xff0c;传统的手工模式已经满足不了日益增长的管理需求&#xff0c;而本系统摒弃传统模式&#xff0c;开启…

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

路由黑洞处理

今天BGP基础实验碰到了路由黑洞 BGP承载于IGP之上&#xff0c;BGP路由天生要递归&#xff0c;才能找出口 在E的BGP去A&#xff0c;下一跳只有B&#xff0c;但是流量走了两条路&#xff0c;c和d BGP路由黑洞&#xff1a; 控制层面可达&#xff0c;数据层面不可达; 路由条目在BG…

Vue-插槽 Slots

文章目录 前言什么叫插槽简单插槽指定默认值多个插槽根据父级别名称指定区域显示(具名插槽)作用域插槽 前言 本篇文章不做过多的讲解与说明&#xff0c;只记录个人实验测试案例。 详见&#xff1a;vue 官方文档 插槽 slots 什么叫插槽 之前的博客中&#xff0c;父级组件可以…

06- 数组的基础知识详细讲解

06- 数组的基础知识详细讲解 一、基本概念 一次性定义多个相同类型的变量&#xff0c;并且给它们分配一片连续的内存。 int arr[5];1.1 初始化 只有在定义的时候赋值&#xff0c;才可以称为初始化。数组只有在初始化的时候才可以统一赋值。 以下是一些示例规则&#xff1a; …