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

news2024/11/26 5:58:37

目录

  • 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 至 16

    0.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 至 48

    0.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 至 112

    1.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 至 160

    0.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 至 240

    1.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 至 272

    0.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 / 1ps

module 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 begin
    rst_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)begin
		din = test_data[i];
		#T;
	end
	din_vaild = 1'b0;
end

//数据存储,由于从第N个点开始有效,输出会少N-1个数据
always@(posedge clk)
begin
  if(dout_vaild)
    begin
      $fdisplay(data_out,"%d",dout);
    end
end

//输入为连续累加1数据的测试
/* always @(posedge clk or negedge rst_n)
    if (!rst_n)
        din <= 8'b0;
    else
        din <= din + 1'b1; */

endmodule

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

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

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

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

相关文章

超速解读多模态InternVL-Chat1.5 ,如何做到开源SOTA——非官方首发核心技巧版(待修订)

解读InternVL-chat1.5系列 最近并行是事情太杂乱了&#xff0c;静下心来看一看优秀的开源项目,但是AI技术迭代这么快&#xff0c;现在基本是同时看五、六个方向的技术架构和代码&#xff0c;哪个我都不想放&#xff0c;都想知道原理和代码细节&#xff0c;还要自己训练起来&am…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…

【嵌入式DIY实例】-OLED显示天气数据

OLED显示天气数据 文章目录 OLED显示天气数据1、硬件准备与接线2、天气数据获取准备3、代码实现在这个物联网项目中,本文将展示如何使用 ESP8266 NodeMCU (ESP-12E) Wi-Fi 开发板和 SSD1306 OLED 显示屏(12864 像素)制作一个简单的互联网气象站。 NodeMCU 从天气网站 openwe…

JavaWeb3 Ajax+Axios+Element+Nginx部署

Ajax 异步JS和XML 1.数据交换&#xff1a;给服务器发送请求&#xff0c;并获取服务器相应的数据 2.异步交互&#xff1a;在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页 同步与异步 原生Ajax <!DOCTYPE html> <html> <body><…

kafka-消费者-消费异常处理(SpringBoot整合Kafka)

文章目录 1、消费异常处理1.1、application.yml配置1.2、注册异常处理器1.3、消费者使用异常处理器1.4、创建生产者发送消息1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、消费者控制台&#xff1a;1.8.1、第一次启动SpringK…

【WP】猿人学_17_天杀的Http2.0

https://match.yuanrenxue.cn/match/17 抓包分析 居然对Fiddler有检测&#xff0c;不允许使用 那就使用浏览器抓包&#xff0c;好像没发现什么加密参数&#xff0c;然后重放也可以成功&#xff0c;时间长了也无需刷新页面&#xff0c;尝试Python复现。 Python复现 import …

在线标注流程

文章目录 在线标注流程标注方法 在线标注流程 登录地址&#xff1a;http://7a27c5e078f644a2a9b734603913c65e.login.bce.baidu.com 出现页面&#xff1a; 登录名&#xff1a; 三个中任意一个 密码&#xff1a;ZNSJ123a 登录之后叉掉。再打开这个网站&#xff1a;https://…

CAD 文件(DXF / DWG)转换为(DXF / PDF / PNG / SVG)

方法一Github 这个是ezdxf出品的&#xff0c;可以使用命令行的方式进行转换 ezdxf draw -o file.<png|svg|pdf> <file.dxf>也可以自己改动代码 examples/addons/drawing/pdf_export.py 但是直接运行会有误&#xff0c;以下是我改动后的代码&#xff1a; from ez…

ArrayList——简单洗牌算法

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

【Linux取经路】网络套接字编程——初识篇

文章目录 一、端口号1.1 认识端口号1.2 端口号 VS 进程 PID 二、认识 TCP 协议三、认识 UDP四、网络字节序列五、socket 编程接口5.1 常用 API5.2 sockaddr 结构 六、结语 一、端口号 网络通信的本质是应用层软件进行数据的发送和接受&#xff0c;软件在启动之后&#xff0c;本…

快速自定义表单开发的优势介绍

进行高效率的办公是很多职场人的梦想。借助什么样的软件平台可以提质增效&#xff1f;低代码技术平台是当前较为流行的办公软件平台产品&#xff0c;具有灵活性、易操作、好维护等多个优势特点&#xff0c;操作人员只需要像搭积木似地操作&#xff0c;就可以搭建属于客户的个性…

[element-ui]el-form自定义校验-图片上传验证(手动触发部分验证方法)

背景&#xff1a; 在做导入文件功能的时候&#xff0c;需要校验表单&#xff0c;如图所示 店铺字段绑定在表单数据对象上&#xff0c;在点击确定的时候正常按照表单验证规则去校验&#xff0c;就不再赘述。 文件上传是个异步过程&#xff0c;属性值改变后不会去触发验证规则…

一.网络基础——OSI七层模型

一.OSI七层模型 OSI&#xff08;Open System Interconnection&#xff0c;开放系统互连&#xff09;七层网络模型被称为开放式系统互联参考模型&#xff0c;它是一个逻辑上的定义和规范; 它把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备&#xff0c;比如路由器&…

[数据集][目标检测]焊接处缺陷检测数据集VOC+YOLO格式3400张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3400 标注数量(xml文件个数)&#xff1a;3400 标注数量(txt文件个数)&#xff1a;3400 标注…

FFmpeg播放器的相关概念【1】

播放器框架 相关术语 •容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。 • 媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、一段…

6.6学习总结

一.算法练习(Codeforces Round 949 (Div. 2)和) B. Turtle and an Infinite Sequence 思路&#xff1a;对于数字而言&#xff0c;轮之后的结果是所有数的或。因此只需要求区间或就行了。(其实就是找区间左边界,二进制中的特殊位置,将后面的所有位都变成1,最后输出结果) 代码实…

关于计算机是如何工作的

计算机的发展历程 世界上的第一个计算机 冯诺依曼机构体系 1.存储器 (包括内存(存储空间小,访问速度快,成本高,掉电后数据丢失) 外存(硬盘,软盘,U盘,光盘)),存储空间小,访问速度慢,成本低,掉电后数据仍在 2.CPU(中央处理单元,计算机最核心的部分,用于算术运算和逻辑判断),…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加速数据访…

算法金 | 再见!!!KNN

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 KNN算法的工作原理简单直观&#xff0c;易于理解和实现&#xff0c;这使得它在各种应用场景中备受青睐。 我们将深入探讨KNN算法&…

带你了解消防安全与应急救援,2024北京消防展6月盛大开启

带你了解消防安全与应急救援&#xff0c;2024北京国际消防展6.26盛大开启 在日益关注安全问题的今天&#xff0c;消防安全与应急救援已经成为社会发展的重要一环。为了提高全民消防安全意识&#xff0c;推动应急救援技术的发展&#xff0c;2024年北京国际消防展将于6月26日盛大…