【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
目录
- 一、信号采样条件
- 采样定理
- ADC的SPS设置
- 二、常用滤波算法对比
- A.滑动平均滤波
- B.陷波滤波
- 陷波滤波器简介
- FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器
- 基于IIR实现陷波滤波
- 滤波原理讲解
- 双二阶滤波器计算过程
- 陷波滤波优势
在上一篇中,介绍了信号时域到频域的转化以及傅里叶变换的原理,以及滤波算法的简单实现,本篇作为补充,介绍基于傅里叶变换的其他几种滤波方法。
一、信号采样条件
采样定理
为什么采样定理要求ADC采样频率要是噪声频率的两倍以上?参考这篇文章:
为什么采样率需要时被测信号最高频率的两倍
仅仅达到采样定理的最低要求,噪声信号会显示成三角波,要较为清晰的还原噪声波形,看出到底是正弦波还是其他波形,需要十倍,参考这篇文章:
采样频率到底多高才不会使信号幅值明显失真?
也就是如果你的噪声频率是100Hz,采样频率要大于200Hz(也就是ADC读取间隔5ms),你才能看出噪声频率,如果要还原波形需要1000Hz(也就是ADC读取间隔1ms)。
ADC的SPS设置
SPS (sample per second,每秒采样次数),是衡量ADC时采样速率的单位。采样频率不仅表示ADC的转换速度,同时也决定了系统可处理信号的带宽范围。
以单片机STM32F103C8T6为例,ADC的采样频率是可以配置的,ADC的时钟是通过APB2总线(PCLK2)分频得到的,最高可以达到14MHz。采样时间越长,转换结果相对越准确,但是转换速度就越慢。
STM32F103C8T6的ADC的总转换时间包括采样时间和固定的12.5个ADC周期,当ADCCLK设置为14MHz,采样时间设置为1.5个ADC周期时,转换时间TCONV为1.5 + 12.5 = 14个ADC周期,约等于1μs。说明ADC的最大采样速率约为1MHz。通过调整采样时间和ADC时钟的分频系数,可以设置合适的采样频率。
在实践设计中,既要兼顾ADC转换结果的准确性,又要保证转换速度达到采样定理最低要求。
二、常用滤波算法对比
查阅资料的时候碰到 “限幅滤波算法” “中位值滤波算法” “算术平均滤波算法” “加权平均滤波算法” “滑动平均滤波算法”等,个人觉得前面这些算法用Excel设置条件筛选配合简单的公式都能做到,充其量只能说是数据处理方法,达不到算法的程度。
但上面这些“Excel数据处理方法”在某些场合也会很好用,比如对于周期性干扰,滑动平均滤波在选择合适窗口大小的时候能和陷波滤波器达到差不多的效果。
下面介绍在实践中滤除周期性干扰比较有用的算法。
A.滑动平均滤波
用Excel就可以实现的数据处理方法!代码也非常简单直观。其实就是设定一个窗口,将相邻的几个点做平均计算,用这个窗口的平均值代替对应点的值。
比如下面的图是1X500的原始数据数组data[500],由Excel绘制出来的散点图。比如设定窗口大小为11,那就把data[0]到data[10]的平均值放到原来的data[5]的位置,以此类推到data[494],data[0] ~ data[4]改成和data[5]一样,data[495] ~ data[499]改成和data[494]一样。
当滑动平均窗口选取的刚好是噪声的一个周期的整数倍时,滤波效果极好,为什么呢?
看下图sin(t)一个周期内是不是正半轴部分和负半轴部分面积是一样的,把一个周期内的所有点相加就是把面积相加,正负刚好抵消。噪声正是这样的周期信号,求平均后刚好为0,这样就把噪声滤掉了。
这个方法要注意窗口大小不能大于采样点数的一半。并且滑动平均后会变平滑,有效信号也会被变平滑,一定程度上属于失真。
还有个问题就是不知道如何设置平均窗口的大小,盲目试很费时间。
如果知道了噪声周期可以快速设置窗口大小,但想知道周期就需要知道噪声频率,要傅里叶变换时域转成频域才能看出来。但都用上傅里叶变换了,可以直接从频域层面入手解决。
所以滑动平均用在低端单片机上比较多,比如ARM Cortex-M3内核就不含浮点运算单元(FPU),滑动平均滤波只需要简单的四则运算,不需要用到矩阵变换,非常适合。
B.陷波滤波
陷波滤波器简介
陷波滤波其实是一种滤波器的分类。以滤波频率对滤波器进行划分,可以分为高通/低通/带通/带阻滤波器,而陷波滤波器是一种带阻滤波器,用于衰减非常窄的频带。当您想要消除或减少特定频率的干扰(例如电力线噪声、50Hz 或 60Hz 嗡嗡声)时,可以使用这些滤波器。
FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器
滤波器的另一种分类方法FIR和IIR。
FIR 滤波器:这些滤波器具有有限数量的抽头(系数),并且其脉冲响应在一定数量的样本后结束。FIR 滤波器本质上是非递归的,这意味着它们的输出仅取决于当前和过去的输入值(没有来自输出的反馈)。它们通常是稳定的并且可以提供线性相位响应。
IIR 滤波器:这些滤波器具有无限数量的抽头,因为它们的脉冲响应在理论上是永久的。IIR 滤波器是递归的,这意味着输出不仅取决于当前和过去的输入,还取决于过去的输出。对于相同的规格,它们通常比 FIR 滤波器更高效,但可能会引入非线性相位响应,并且如果设计不当,容易不稳定。
上面的看不懂也没关系,记住IIR速度快,工程上常用就好了。
基于IIR实现陷波滤波
陷波滤波和IIR上面都介绍过了。展开说就是用无限脉冲响应的方法实现抑制某个频段的噪声。
当然在这之前需要会用傅里叶变换查看噪声频率分量。【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
滤波原理讲解
IIR有很多实现方式,比如基于双二阶滤波器结构的滤波器,对衰减特定频率的效果显著。它的QT C++代码上一篇已经展示过:【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
为什么滤波器的代码长这样,如果学过《数字信号处理》或者《自动控制原理》等课程,会学到Z变换,将输入输出变换到Z域进行频率响应相关分析。
Z变换是拉普拉斯变换的离散形式,而拉普拉斯变换又是傅里叶变换的扩展形式。这部分原理讲清楚篇幅比较多,后续会单开一篇说明。
上面代码中配置的双二阶滤波器具有以下传递函数:
H ( z ) = b 0 + b 1 z − 1 + b 2 z − 2 1 + a 1 z − 1 + a 2 z − 2 H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} H(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2
其中 b 0 , b 1 , b 2 b_0, b_1, b_2 b0,b1,b2是分子系数(影响滤波器的零点,决定抑制频率大小)。
a 1 , a 2 a_1, a_2 a1,a2是分母系数(影响滤波器的极点,决定稳定性和频率响应)。
上面这些系数的计算方式如下:
- 陷波频率 ( f 0 f_0 f0) 是需要衰减的频率,也就是这个频率下信号衰减达到最大值。
- 品质因子 ( Q Q Q) 是滤波带宽, Q Q Q越高,滤波的带宽越窄。
- 角频率 ω 0 = 2 π f 0 / f s \omega_0 = 2 \pi f_0 / f_s ω0=2πf0/fs, 其中 f s f_s fs 是采样频率。
滤波器的零点在 Z 域的单位圆上 e j ω 0 e^{j\omega_0} ejω0和 e − j ω 0 e^{-j\omega_0} e−jω0两个位置,这两个零点可以使目标频率 ω 0 \omega_0 ω0完全衰减
滤波器的极点位于单位圆内,靠近零点,可以使滤波迅速变化,并且稳定。
滤波器的频率响应在目标频率 f 0 f_0 f0处有较大的衰减,而其他频率不受影响。
双二阶滤波器计算过程
首先计算需要滤波频率的角频率:
ω 0 = 2 π f 0 f s \omega_0 = 2 \pi \frac{f_0}{f_s} ω0=2πfsf0
然后基于 ω 0 \omega_0 ω0和品质因子 Q Q Q计算系数。
控制陷波的带宽的α
α = sin ( ω 0 ) 2 Q \alpha = \frac{\sin(\omega_0)}{2Q} α=2Qsin(ω0)
其他系数如下:
b 0 = 1 b_0 = 1 b0=1
b 1 = − 2 cos ( ω 0 ) b_1 = -2 \cos(\omega_0) b1=−2cos(ω0)
b 2 = 1 b_2 = 1 b2=1
a 0 = 1 + α a_0 = 1 + \alpha a0=1+α
a 1 = − 2 cos ( ω 0 ) a_1 = -2 \cos(\omega_0) a1=−2cos(ω0)
a 2 = 1 − α a_2 = 1 - \alpha a2=1−α
然后要归一化处理:
b 0 = b 0 a 0 , b 1 = b 1 a 0 , b 2 = b 2 a 0 b_0 = \frac{b_0}{a_0}, \quad b_1 = \frac{b_1}{a_0}, \quad b_2 = \frac{b_2}{a_0} b0=a0b0,b1=a0b1,b2=a0b2
a 1 = a 1 a 0 , a 2 = a 2 a 0 a_1 = \frac{a_1}{a_0}, \quad a_2 = \frac{a_2}{a_0} a1=a0a1,a2=a0a2
最后带入传递函数计算:
H ( z ) = b 0 + b 1 z − 1 + b 2 z − 2 1 + a 1 z − 1 + a 2 z − 2 H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} H(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2
陷波滤波优势
相比滑动平均,陷波滤波在得知噪声频率后可以直接设置双二阶滤波器的传递函数来衰减目标频率,不用一个个试过去。对于频率较高的噪声,滑动平均的窗口大小不能再小下去了,但陷波滤波可以,对于高频噪声的滤波效果显著。
相关文章:
【信号滤波 (下)】采样条件,多种滤波算法对比(Matlab/C++)
目录 一、信号采样条件采样定理ADC的SPS设置 二、常用滤波算法对比A.滑动平均滤波B.陷波滤波陷波滤波器简介FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器 基于IIR实现陷波滤波滤波原理讲解双二阶滤波器计算过程陷波滤波优势 在上一篇中,介绍了信号时域到频域的…...
将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。
1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实验。 接受端 #include<myhead.h> #define handel_err(res,val) if(val-1){perror(res);return-1;} int main(int argc, const char *argv[]) {int rfdsocket(AF_…...
Nginx 负载均衡详解
一、Nginx 简介 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,以其轻量级、高并发、低内存消耗等特点著称。Nginx 不仅适用于静态资源的快速分发,还广泛应用于负载均衡、反向代理等场景。通过Nginx,可以轻松地构建一个高效、可靠且…...
自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭
目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…...
FFmpeg 编码和解码
文章目录 音频格式AACADIF音频数据交换格式ADTS音频数据传输流 音频解码音频编码 视频格式H264GOP图像组I帧,P帧,B帧H264压缩技术H264压缩级别H264视频级别H264码流结构SPSPPS 解码视频编码视频 音频格式 AAC AAC全称 Advanced Audio Coding࿰…...
【Ubuntu】Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS)
Ubuntu server 18.04 搭建Slurm并行计算环境(包含NFS) 一、Munge 认证模块 1.1、安装 munge 主节点和子节点都安装munge #安装 sudo apt update && sudo apt install munge libmunge-dev#设置开机启动 sudo systemctl enable munge sudo syste…...
WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)
在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…...
Spring 的不同事务传播行为
目录 Spring 的不同事务传播行为 PROPAGATION_REQUIRES_NEW事务传播行为什么情况下会使用? 一、PROPAGATION_REQUIRES_NEW的含义 二、使用场景 三、注意事项 PROPAGATION_NESTED事务传播行为什么情况下会使用? 一、PROPAGATION_NESTED的含义 二、使用场景 三、嵌套事…...
PlantUML 时序图 基本例子
基本的例子 序列-> 用于绘制两个参与者之间的信息。参与者不必明确声明。 要有一个点状的箭头,就用--> 也可以用<- 和<-- 。这不会改变绘图,但可能提高可读性。注意,这只适用于顺序图,其他图的规则不同。 plantum…...
QILSTE H8-C414SY高亮黄光LED灯珠 发光二极管LED
在电子组件的复杂世界中,H8-C414SY型号的LED以其精确的技术参数和卓越的性能,成为了工程师和技术人员不可忽视的选择。本文将通过对这款高亮黄光LED的技术参数进行深入分析,增加文本的复杂性和突发性,以提供一份详尽的技术参考。 …...
git clone 和 conda 换源
文章目录 git clone 通过 sshconda 创建虚拟环境通过 env.yml 文件conda 换源 git clone 通过 ssh git clone ssh://用户名IP地址:/仓库名字.gitconda 创建虚拟环境通过 env.yml 文件 conda env create -f environment.ymlconda 换源 Step 1 生成 .bashrc 文件在家目录下。…...
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(下)
在上一篇博客《Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘》介绍了dynamic-datasource-spring-boot-starter的自动配置类和配置属性类之后,本文继续来剖析多数据源是如何切换的,什么时候切换的。 前文中提…...
移动 APP 设计规范参考
一、界面设计规范 布局原则: 内容优先:以内容为核心进行布局,突出用户需要的信息,简化页面导航,提升屏幕空间利用率.一致性:保持界面元素风格一致,包括颜色、字体、图标等,使用户在…...
yolov6算法及其改进
yolov6算法及其改进 1、YOLOV6简介2、RepVGG重参思想3、YOLOv6架构改进3.1、Backbone方面3.2、SPP改进3.3、Neck改进3.4、Head改进 4、正负样本匹配与损失函数4.1、TaskAligned样本匹配4.2、VFL Loss分类损失函数4.3、SIOU损失函数4.4、DFL损失函数 1、YOLOV6简介 YOLOv6设计主…...
java自定义注解对枚举类型参数的校验
目录 1.前提准备条件 1.1 pom.xml文件依赖: 1.2 枚举类: 1.3 controller接口: 1.4 实体参数: 1.5 knife4j的配置 2.实现要求 3.实现步骤 3.1 自定义注解类: 3.2 使用注解: 3.3 添加注解校验类: …...
K8S-LLM:用自然语言轻松操作 Kubernetes
在 Kubernetes (K8s) 的日常管理中,复杂的命令行操作常常让开发者感到头疼。无论是部署应用、管理资源还是调试问题,都需要记住大量的命令和参数。Kubernetes 作为容器编排的行业标准,其强大的功能伴随着陡峭的学习曲线和复杂的命令行操作。这…...
【GO基础学习】gin的使用
文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则,执行的函数// gin.Context&#x…...
【PCIe 总线及设备入门学习专栏 4.5 -- PCIe Message and PCIe MSI】
文章目录 PCIe Message 与 MSIPCIe Message 和 MSI 的作用与关系MSI 的配置与寄存器MSI 和 ARM GIC 的关系示例:MSI 在 ARM GIC 的实际应用总结 PCIe Message 与 MSI 本文将介绍 PCIe message 的作用以及message 与 MSI 的关系,再介绍 MSI 如何配置以及…...
sklearn_pandas.DataFrameMapper的用法
文章目录 介绍主要作用基本用法示例对不同列应用不同的转换器对多列应用相同的转换器输出为 Pandas DataFrame 注意事项转换器的适用性:输出格式:与 scikit-learn 的兼容性: 介绍 DataFrameMapper 是 sklearn-pandas 库中的一个工具…...
【2024年-7月-27日-开源社区openEuler实践记录】剖析 elease - management:优化软件发布流程的开源方案
开篇介绍 大家好,我是 fzr123,在软件开发流程管控领域探索许久,今天要给大家详细说说release - management这个极具价值的开源项目。在软件开发的生命周期里,发布管理至关重要,它关乎着软件能否稳定、高效且按时交付&…...
CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)
文章目录 1.Introduction1.1 What software engineering is and why it is important(什么是软件工程,为什么它很重要)1.1 We can’t run the modern world without software(我们的世界离不开软件)1.1.1 What is Soft…...
Mysql数据库Redo日志和Undo日志的理解
数据库redo日志和undo日志 1、redo日志1.1 redo日志的作用1.1.1 不使用redo日志的问题1.1.2 使用redo日志的好处 1.2 redo日志刷盘策略 2、undo日志2.1 undo日志的作用2.2 undo日志的简要生成过程 1、redo日志 事务的4大特性(ACID):原子性、…...
大厂高频总线协议面试题及参考答案(几百家面试题挑选最高频精华)
目录 请介绍一下 SPI 总线协议及其工作原理,包括 SPI 有哪四种模式以及四根线的电气特性是什么? SPI 通信的波特率是多少,时钟来源是什么?SPI 的帧长度和数据格式是怎样的? 请简述 IIC 协议及其工作原理,包括 IIC 协议最多能挂载多少个从设备? IIC 总线上挂不同的设备…...
使用策略模式时的一个生效问题
策略模式的替换场景: 1:产品有默认策略A,B,项目扩展策略C,此为正常扩展。 2:产品有默认策略A,B,项目需要改写策略B,此为项目替换默认策略。 3:产品有默认策略A,B,项目扩展策略C,产品需要反向扩展…...
活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载
课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动,了解 Azure 如何为将工作负载…...
关于 PCB线路板细节锣槽问题 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
机器学习特征选择
一、特征选择概述 在实际的数据集中,往往包含了大量的特征,但并非所有特征都对我们要预测的目标变量(如分类任务中的类别标签,回归任务中的数值目标)有积极作用。有些特征可能携带的信息量极少,甚至会引入…...
第R5周:天气预测
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 任务说明:该数据集提供了来自澳大利亚许多地点的大约 10 年的每日天气观测数据。你需要做的是根据这些数据对RainTomorrow进行一个预测,…...
【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色
1、HarmonyOS ets不支持匿名类吗? 不支持,需要显式标注对象字面量的类型,可以参考以下文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5#%E9%9C%80%E8%A6%81%E6%…...
【Vim Masterclass 笔记02】第3章:Vim 核心知识 + L08:Vim 核心浏览命令 + L09:Vim 核心浏览命令同步练习
文章目录 Section 3:Vim Essentials(Vim 核心知识)S03L08 Essential Navigation Commands1 光标的上下左右移动2 上 / 下翻页3 基于单词前移4 基于单词后移5 重新定位视图中的文本(页面重绘)6 定位到所在行的行首7 光标…...
Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码
如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中,我们将学习如何加密 Spring Boot 应用程序配置文件(如 application.properties 或 application.yml)中的数据。在这些文件中,我们可以加密用户名、密码等。 您经常会遇到…...
unity 按钮发送数据到服务器端
1. canvas 明显大于 main camera显示范围 按钮设置 reset 2 设置场景背景图片 2. 如何设置 sense 与背景图大小一致 stretch 没有生效 手动拖拽到 camera 大小 3 将button 按钮拖拽到背景image 中...
【TG\SE二次开发】天工CAD二次开发-c++模板介绍
VS的安装的环境: 1. Visual Studio EnterPrise 2022版本 2. 涉及到的工作负荷: 使用C的桌面开发、通用Windows平台开发 3. 特别要求的单个组件: 适用于最新的v143生成工具的CATL(x86和x64)组件、适用于最新的v143生…...
C语言预处理
预处理 C语言的编译步骤 预处理编译汇编链接 C语言的预处理 预处理就是在源文件编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动完成;当源文件在编译时,编译器会自动调用预处理程序来完成预处理操作执行的解析…...
DPIN基金会在曼谷发布全球去中心化GPU算力网络计划
12月12日,DPIN基金会在泰国曼谷举行的“DPIN—AIDePIN全球共识发布会”上,展示了其构建全球去中心化GPU算力网络的宏伟蓝图与愿景。DPIN基金会致力于开发一个基于人工智能与去中心化物理基础设施网络(DePIN)的高性能计算平台&…...
ONNX Runtime gpu版本安装
ONNX Runtime版本与cudatoolkit版本对应关系:NVIDIA - CUDA | onnxruntime onnx runtime发的版本:Releases microsoft/onnxruntime onnx runtime 官网:ONNX Runtime | Home onnx和onnx runtime版本对应关系:Compatibility | o…...
深入理解 MVCC 与 BufferPool 缓存机制
深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中,MVCC(Multi-Version Concurrency Control)多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念,它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…...
RockyLinux介绍及初始化
文章目录 一、背景二、下载 RockyLinux9 镜像三、环境初始化四、安装 Docker 环境 一、背景 这里讲一个小故事: 我们都知道Linux 内核是由芬兰计算机科学家林纳斯托瓦兹 (Linus Torvalds) 于 1991 年首次开发的,随后有一个非常重要的公司RetHat成立&am…...
Python中切片操作符
在Python中,切片是一种操作符,允许你获取序列(如列表、元组、字符串)的一部分。切片操作返回序列的一个子集,这个子集是一个新的对象,与原始序列是独立的。切片操作通常用于列表、元组、字符串等。 切片语…...
python -【es】基本使用
一. 前言 在Python中使用Elasticsearch(ES)通常涉及安装Elasticsearch的Python客户端库,然后通过该库与Elasticsearch集群进行交互。 二. 基本使用 1. 安装Elasticsearch Python客户端库 首先,你需要安装elasticsearch库。你可…...
JVM实战—5.G1垃圾回收器的原理和调优
大纲 1.G1垃圾回收器的工作原理 2.G1分代回收原理—性能为何比传统GC好 3.使用G1垃圾回收器时应如何设置参数 4.如何基于G1垃圾回收器优化性能 5.问题汇总 1.G1垃圾回收器的工作原理 (1)ParNew CMS的组合有哪些痛点 (2)G1垃圾回收器 (3)G1如何实现垃圾回收的停顿时间是…...
Python爬虫(selenium)从网站获取信息并存入数据库(mysql)
简介: 在本篇博客中,我们将介绍如何使用Python编写一个简单的网络爬虫,从指定网站上获取图书信息,并将这些信息存入数据库。这个项目涉及到Python编程、selenium爬虫技术以及数据库操作等内容,适合对这些领域感兴趣的初…...
spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验
文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303?1.2 为什么使用 JSR 303? 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…...
RabbitMQ中的异步Confirm模式:提升消息可靠性的利器
在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件,提供了多种机制来确保消息的可靠传递。其中ÿ…...
C++ 设计模式:代理模式(Proxy Pattern)
链接:C 设计模式 链接:C 设计模式 - 门面模式 链接:C 设计模式 - 中介者 链接:C 设计模式 - 适配器 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制(…...
41.1 预聚合提速实战项目之需求分析和架构设计
本节重点介绍 : 需求分析架构设计 需求分析 使用预聚合提速查询并且降低高基数查询对后端的压力用户无需变更grafana上的查询语句,后端自动替换效果图 架构设计 架构图 解决方案说明 heavy_query对用户侧表现为查询速度慢在服务端会导致资源占用过多甚至打挂…...
学习路之VScode--自定义按键写注释(插件)
1. 安装 "KoroFileHeader" 插件 首先,在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标,然后选择 "设置&q…...
Web安全 - “Referrer Policy“ Security 头值不安全
文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …...
Milvus×EasyAi:如何用java从零搭建人脸识别应用
如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…...
CGAL windows 安装教程
1.下载源代码 CGAL官网下载https://github.com/CGAL/cgal/releases 2.下载boost库 BOOST官网下载https://www.boost.org/ 3.下载 GMP and MPFR 4.配置VS2022 头文件: 库路径 做完以上步骤,可以使用CGAL了!...