傅里叶分析和小波分析

news2025/1/24 2:18:44

从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路。

下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺序,讲一下为什么会出现小波这个东西、小波究竟是怎样的思路。

1. 傅里叶变换

我们都知道,傅里叶变换可以把一个信号从时域变换到频域。但是,我们必须要理解,为什么傅里叶变换可以把信号从时域转为频域呢?

傅里叶变换的形式为:

PS:傅里叶变换还存在系数,有的文章写的是 \frac{1}{2\pi } ,有的文章写的是\sqrt{\frac{1}{2\pi }} ,两个系数只要满足正变换系数乘上逆变换系数等于\frac{1}{2\pi } 即可。这是为了保证经过一次正变换和反变换之后,得到的信号与原信号幅值相同,与我们接下来的讨论关系不大。

我们知道,根据欧拉公式, e^{-j\omega t}=cos(\omega t)-jsin(\omega t)。也就是说,傅里叶变换的本质就是:将原始信号乘上一组三角函数(正余弦),之后在整个时间域上积分。就这么简单!傅里叶变换(FT)的正交性可以参考知乎文章从傅里叶变换进阶到小波变换(一) - 知乎

关于离散傅里叶变换(DFT)本质都是一样的,抓住离散性有限性两个特点即可。离散性是指积分变成了累加,有限性是指积分/累加区间不是 (−∞,+∞) 了,而是一个有限区间了。

我们知道傅里叶变化可以分析信号的频谱,那么为什么还要提出小波变换?答案就是“对非平稳过程,傅里叶变换有局限性”。看如下一个简单的信号:

做完FFT(快速傅里叶变换)后,可以在频谱上看到清晰的四条线,信号包含四个频率成分。

一切没有问题。但是,如果是频率随着时间变化的非平稳信号呢?

如上图,最上边的是频率始终不变的平稳信号。而下边两个则是频率随着时间改变的非平稳信号,它们同样包含和最上信号相同频率的四个成分。
做FFT后,我们发现这三个时域上有巨大差异的信号,频谱(幅值谱)却非常一致。尤其是下边两个非平稳信号,我们从频谱上无法区分它们,因为它们包含的四个频率的信号的成分确实是一样的,只是出现的先后顺序不同。

可见,傅里叶变换处理非平稳信号有天生缺陷。它只能获取一段信号总体上包含哪些频率的成分,但是对各成分出现的时刻并无所知。因此时域相差很大的两个信号,可能频谱图一样。

然而平稳信号大多是人为制造出来的,自然界的大量信号几乎都是非平稳的,所以在比如生物医学信号分析等领域的论文中,基本看不到单纯傅里叶变换这样naive的方法。

上图所示的是一个正常人的事件相关电位。对于这样的非平稳信号,只知道包含哪些频率成分是不够的,我们还想知道各个成分出现的时间。知道信号频率随时间变化的情况,各个时刻的瞬时频率及其幅值——这也就是时频分析。

2. 短时傅里叶变换(Short-time Fourier Transform, STFT)

一个简单可行的方法就是——加窗。“把整个时域过程分解成无数个等长的小过程,每个小过程近似平稳,再傅里叶变换,就知道在哪个时间点上出现了什么频率了。”这就是短时傅里叶变换。
看图:

时域上分成一段一段做FFT,不就知道频率成分随着时间的变化情况了吗!
用这样的方法,可以得到一个信号的时频图了:

图上既能看到10Hz, 25 Hz, 50 Hz, 100 Hz四个频域成分,还能看到出现的时间。两排峰是对称的,所以大家只用看一排就行了。

是不是棒棒的?时频分析结果到手。但是STFT依然有缺陷。

使用STFT存在一个问题,我们应该用多宽的窗函数?
窗太宽太窄都有问题:

窗太窄,窗内的信号太短,会导致频率分析不够精准,频率分辨率差。窗太宽,时域上又不够精细,时间分辨率低。
(这里插一句,这个道理可以用海森堡不确定性原理来解释。类似于我们不能同时获取一个粒子的动量和位置,我们也不能同时获取信号绝对精准的时刻和频率。这也是一对不可兼得的矛盾体。我们不知道在某个瞬间哪个频率分量存在,我们知道的只能是在一个时间段内某个频带的分量存在。 所以绝对意义的瞬时频率是不存在的。)

看看实例效果吧:

上图对同一个信号(4个频率成分)采用不同宽度的窗做STFT,结果如右图。用窄窗,时频图在时间轴上分辨率很高,几个峰基本成矩形,而用宽窗则变成了绵延的矮山。但是频率轴上,窄窗明显不如下边两个宽窗精确。

所以窄窗口时间分辨率高、频率分辨率低,宽窗口时间分辨率低、频率分辨率高。对于时变的非稳态信号,高频适合小窗口,低频适合大窗口。然而STFT的窗口是固定的,在一次STFT中宽度不会变化,所以STFT还是无法满足非稳态信号变化的频率的需求。

3. 连续小波变换(CWT)

那么你可能会想到,让窗口大小变起来,多做几次STFT不就可以了吗?!没错,小波变换就有着这样的思路。
但事实上小波并不是这么做的,不能认为“小波变换就是根据算法,加不等长的窗,对每一小部分进行傅里叶变换”。小波变换并没有采用窗的思想,更没有做傅里叶变换。
至于为什么不采用可变窗的STFT呢,我认为是因为这样做冗余会太严重,STFT做不到正交化,这也是它的一大缺陷。

于是小波变换的出发点和STFT还是不同的。STFT是给信号加窗,分段做FFT;而小波直接把傅里叶变换的基给换了——将无限长的三角函数基换成了有限长的会衰减的小波基。这样不仅能够获取频率,还可以定位到时间了~

【解释】
来我们再回顾一下傅里叶变换吧,没弄清傅里叶变换为什么能得到信号各个频率成分的同学也可以再借我的图理解一下。
傅里叶变换把无限长的三角函数作为基函数:

这个基函数会伸缩、会平移(其实本质并非平移,而是两个正交基的分解)。缩得窄,对应高频;伸得宽,对应低频。然后这个基函数不断和信号做相乘。某一个尺度(宽窄)下乘出来的结果,就可以理解成信号所包含的当前尺度对应频率成分有多少。于是,基函数会在某些尺度下,与信号相乘得到一个很大的值,因为此时二者有一种重合关系。那么我们就知道信号包含该频率的成分的多少。

仔细体会可以发现,这一步其实是在计算信号和三角函数的相关性。

看,这两种尺度能乘出一个大的值(相关度高),所以信号包含较多的这两个频率成分,在频谱上这两个频率会出现两个峰。
以上,就是粗浅意义上傅里叶变换的原理。

如前边所说,小波做的改变就在于,将无限长的三角函数基换成了有限长的会衰减的小波基。

这就是为什么它叫“小波”,因为是很小的一个波嘛~

从公式可以看出,不同于傅里叶变换,变量只有频率ω,小波变换有两个变量:尺度a(scale)和平移量 τ(translation)。尺度a控制小波函数的伸缩,平移量 τ控制小波函数的平移。尺度就对应于频率(反比),平移量 τ就对应于时间。

当伸缩、平移到这么一种重合情况时,也会相乘得到一个大的值。这时候和傅里叶变换不同的是,这不仅可以知道信号有这样频率的成分,而且知道它在时域上存在的具体位置。

而当我们在每个尺度下都平移着和信号乘过一遍后,我们就知道信号在每个位置都包含哪些频率成分。

看到了吗?有了小波,我们从此再也不害怕非稳定信号啦!从此可以做时频分析啦!

做傅里叶变换只能得到一个频谱,做小波变换却可以得到一个时频谱!

时域信号

傅里叶变换结果

小波变换结果

我们来看,绿色的小峰,对应小的 s(scale) ,也就是高的频率。他们的时间分辨率很好, s 的区间很小,根据s,f 的倒数关系,对应的 f 的区间就很大,因此频率分辨率不好

粉色的高峰,对应高的s(scale)  ,也就是低的频率, s的区间很大,根据s,f 的倒数关系,对应的 f 的区间就很小,因此频率分辨率很好,时间分辨率不好(有混叠)。

这也就再一次说明了CWT是动态分辨率的,这也是CWT相对于STFT的优势所在。

小波还有一些好处,比如,我们知道对于突变信号,傅里叶变换存在吉布斯效应,我们用无限长的三角函数怎么也拟合不好突变信号:

然而衰减的小波就不一样了:

4. 离散小波变换(DWT)

4.1 连续小波变换的确点

实际采样信号往往具有两个特点:1、离散性,就是采集数据不连续,很容易理解,采集信号肯定是一个一个数据采集的;2、有限性,虽然理想的CWT是从 (−∞,+∞) 进行积分的,但是实际信号往往是在一个区间内 (a,b) 的。如下图所示。

所以,由于CWT需要一个连续信号,但是实际采样信号往往是离散的,我们无法直接对实际信号进行CWT。

或许你想,我们对实际采样信号进行插值连续化不就可以使得其连续了吗?

是的。将实际采样信号插值连续化之后,是可对它进行CWT的。

但是,我们也都知道,我们的帮手——计算机,是无法处理连续问题的。计算机只能处理离散问题。如果计算机要进行CWT,就意味着需要计算机做无穷次运算,计算机计算能力再强也是做不到的。

因此,为了使得计算机可以进行小波变换,我们需要引入离散小波变换(DWT)。

4.2 离散小波变换(DWT)的Mallet算法

DWT有很多种实现方式,我们在这里介绍Mallet算法,它是DWT的以一种经典的快速算法,也比较易懂。

动态分辨率图:高频部分,窄窗,高的时域分辨率,低的频域分辨率;低频部分,宽窗,低的时域分辨率,高的频域分辨率。

我们是利用小波母函数的挤压和拉伸来实现动态分辨率的:

当小波母函数被挤压的时候,频率就高,此时窗子窄,时域分辨率就好,根据海森堡测不准原理,频域分辨率就差;

当小波母函数被拉伸的时候,频率就低,此时窗子宽,时域分辨率就差,根据海森堡测不准原理,频域分辨率就好。

也就是说,我们控制的是不同频率对应的窗长(即时域分辨率),频率分辨率是通过海森堡测不准原理得到的,从而达到了动态分辨率

那么,如果我们这次不控制窗长(即时域分辨率),转而控制频域分辨率,能否达到动态分辨率呢?答案是可以,这就是Mallet算法要解决的问题。

半子带滤波

我们知道,小波母函数本质上是一种带通滤波器。那么,假设可以通过小波母函数构造得到两个滤波器(至于怎么得到后续会介绍一下),包括一个高通滤波器和一个低通滤波器

假设信号中的最高频率为F_{s} 。那么,高通滤波器的作用就是得到 (\frac{F_{s}}{2},F_{s}) 的部分,低通滤波器的作用就是得到 (0,\frac{F_{s}}{2}) 的部分。如下图所示:

我们将这个过程称为一次半子带滤波

下采样与上采样

我们定义一个N倍下采样过程:将采样点N倍稀释。如下,就是一个2倍下采样过程,将采样点稀释2倍,即:每2个点采样数据点,就去除一个点。

N倍上采样过程:将采样点数量增加N倍。一般通过补0,或者插值的方法实现上采样。

离散小波分解

我们将一次半子带滤波+一次2倍下采样称为一层小波分解。如下图所示,图中的“箭头+2”表示一次2倍下采样。

假设原采样信号有 N 个点,信号最高频率为 F_{s} (根据采样定律, F_{s} 为采样频率的一半)。

经过一次高通滤波后,得到了  (\frac{F_{s}}{2},F_{s})的部分,也是 N 个点,再经过一次2倍下采样,变成了 N/2 个点,我们将这N/2个点称为小波分解的高频系数(为什么叫作系数会在后面解释)。

经过一次低通滤波后,得到了 (0,\frac{F_{s}}{2}) 的部分,也是  N 个点,再经过一次2倍下采样,变成了 N/2 个点,我们将这N/2个点称为小波分解的低频系数

也就是说,经过一层小波分解的信号,它的总长度加起来,还是 N ,是不变的

现在,我们已经对 (0,F_{s}),N 个点的原信号进行了第一层小波分解,得到了(\frac{F_{s}}{2},F_{s}),N/2 个点的高频系数和(0,\frac{F_{s}}{2}),N/2 个点的低频系数。

那么,我们保持 (\frac{F_{s}}{2},F_{s}),N/2 个点的高频系数不变,把(0,\frac{F_{s}}{2}),N/2 个点的低频系数作为信号,再进行一次小波分解。于是可以得到 (\frac{F_{s}}{4},\frac{F_{s}}{2}),N/4 个点的高频系数和 (0,\frac{F_{s}}{4}),N/4 个点的低频系数。

这个过程被称为第2层小波分解。我们验证一下,经过2层小波分解的信号,它的总长度加起来,还是N ,是不变的。

依此类推,我们可以进行第三层,第四层小波分解,如图所示,直到第 log_{2}N 层小波分解。在第 log_{2}N 层小波分解,由于不断的下采样,低频系数和高频系数都只剩1个数了,小波分解无法进行下去了。

因此,小波分解的原始信号个数一般也需要是2的幂次。不过,在各种数学计算软件里,如果输入不是2的幂次,它会自动帮你补零到2的幂次。

我们取4层小波分解的结果来看一下。
在频域上,我们得到的是 (\frac{F_{s}}{2},F_{s}) ,(\frac{F_{s}}{4},\frac{F_{s}}{2}),(\frac{F_{s}}{8},\frac{F_{s}}{4}),(\frac{F_{s}}{16},\frac{F_{s}}{8}),(0,\frac{F_{s}}{16})频域区间的系数。

在时域上,由于不断的2倍下采样,不断地丢弃数据,所以最后一层分解得到的(\frac{F_{s}}{16},\frac{F_{s}}{8}),(0,\frac{F_{s}}{16})的时域分辨率最差,第一层分解保留的(\frac{F_{s}}{2},F_{s}) 时域分辨率最好。

那么,我们得到的分辨率就是这样子的:

这,不就是上一篇文章我们讲过的小波变换得到的动态分辨率吗?

是的!这就是离散小波变换的快速算法之一——Mallet算法,通过不断的半子带滤波和下采样,控制不同频率成分的频域分辨率,进而达到动态分辨率。

最后,用一张比较经典的图,再来演示一下小波分解的过程。 \pi 为采样信号的最高频率。g(n) 代表高通滤波器, ℎ(n) 代表低通滤波器,“箭头+2”表示2倍下采样。

再来举个例子形象地说明一下DWT的使用吧。

希望对于一个采样率为1000HZ的非稳态信号进行小波分解,下图为包含了256个采样点(即256ms)的原始采样信号。

1、首先,选择小波分解的层次。

可以根据对最低频率区间的要求来选择小波分解的层数。比如,我之前做项目的时候,采样率为1000HZ,那么信号的最高频率为 Fs=500Hz 。我认为对于频率低于20HZ的成分,不需要再进一步区分了。因此,我选择5层小波分解,得到的最低一层的频率区间为 (0,F_{s}/2^{5}) ,即为 (0,16)Hz ,这就够用了。

2、接下来,进行5层小波分解,得到小波分解系数。

如下图中,图1依然是原始采样信号 ,图2到图6为第1层到第5层小波分解的高频系数,图7为第5层小波分解的低频系数。如图所示,这些小波分解系数对应着不同的频率区间。

这就是DWT了,又称为小波分解。

这里提一下,小波分解是可逆的,即可以通过不同频率区间的小波分解系数进行重构,得到不同频率区间的重构信号

3、所以,最后,进行小波重构,得到重构信号。

如下图中,图1依然是原始采样信号,图2到图7为通过不同频率区间的小波系数进行重构,得到的重构信号。将图2到图7加起来就可以得到重构原始信号,其和原始采样信号的误差称为重构误差。

4.3 尺度函数和小波函数

如果我们需要对一段信号进行小波分析,那么就要明确2个问题:

1.用于检波的小波长什么样?
2.小波应该如何进行缩放(以检测更高的频率信号)?

因此,基于上面两点,我们就需要明确2个函数,它们分别叫:
小波函数---->顾名思义,用于描述小波长什么样,同时它有时也叫母小波函数。
尺度函数---->顾名思义,用于描述小波应该如何进行缩放,当然有母就有父,它也叫父尺度函数。

离散小波变换的父小波 (scaling function)

尺度函数被定义为:

其中, j,k 都是整数,其中这个 j,表示这个尺度函数宽度,j 越大,尺度函数越窄,对应的小波频率越高, k可以视作尺度函数平移的位置,越大表示移动的越到后面,为了更直观的说明,笔者使用了 Haar 尺度函数生成以下几张图:

我们先来看看\varphi _{0,0}(x) ,它长这样

我们再来看看 \varphi _{0,1}(x),可以看到,k变成了1,因此它是 \varphi _{0,0}(x)平移后的结果,长这样:

接下来就是 \varphi _{1,0}(x) 根据公式,他应该是: \varphi _{1,0}(x)=2^{1/2}\varphi ({2^{1}x-0})也就是

\varphi _{1,0}(x)=\sqrt{2}\varphi(2x)

而 \varphi _{1,1}(x)是 \varphi _{1,0}(x) 平移后的结果,因此是这样:

当然还有 \varphi _{1,2}(x),\varphi _{1,3}(x),\varphi _{1,4}(x).... 依次类推,你可能已经注意到了,低级的尺度函数可以是高级尺度函数的组合,例如:

如果我们用一个递归的思想来表示这个尺度函数,那么,函数可以写成:

就是尺度函数可以表示为高一级尺度的线性组合,其中,这个 h_{\varphi }(k)又称作展开系数。

尺度函数应该满足以下条件:

1.尺度函数对于其整数平移是正交的。(说人话:就是小波就那么一小段,分析时一段一段平移,相乘积分后是0)。
2.尺度函数以低尺度张成的函数控件嵌套在以高尺度张成的函数空间中,即

说人话就是看下图, f(x) 函数比 g(x) 函数要更宽(刚好一倍),我们可以说 g(x) 可以用来组合表示 f(x) 也就是说, g(x) 的尺度空间比 f(x) 的空间更高,也就是说高尺度空间可以用来表示低尺度空间,在几何中就是这样一个包含关系。

3.在每个尺度上唯一可表示的函数是f(x)=0
4.所有可度量的,平方可积的函数都可以表示为尺度函数在 j−>∞ 时的线性组合,即 V_{\infty }=L^{2}(R)
(说人话:还记得傅里叶变换么,用无穷多不同频率去叠加拟合原信号,把正弦波换成小波,不还是一个意思,就像你用一个积木去组个拼接一个形状,大的轮廓用大积木,小的细节用小积木,如果拼不出细节,只是你的积木不够小)

 离散小波变换的母小波 (Wavelet function)

当我们确定了尺度函数以后,我们就可以开始构造小波函数了,小波函数和尺度函数同样类似,它的定义如下:

*若令 W_{j0} 表示小波函数\{\varphi _{j,k}|k\in Z\}张成的函数空间, V_{j0}表示小波函数\{\varphi _{j,k}|k\in Z\}张成的函数空间,则

说人话啥意思呢,你可以想啊,现在我们用尺度的去拟合原信号时,因为原信号中包含了当前尺度函数无法组成的成分,比如那些当前尺度空间更高阶的细节成分,因此,细节的信息没了,这个时候怎么办呢,当然是要把它找回来啊,那么在哪找呢,诶,小波函数的张成函数空间,就是用来干这个的,可以这么说,尺度函数和小波函数各为互补,尺度函数用来表示原信号的大致轮廓(低频信息),而小波函数则用来表示原信号的细节信息(高频信息),当它们组合在一起后,就是当前尺度空间的样子了。

好的,回到正题,因为上面的这层关系,小波函数可以写作高一级尺度函数的加权和:

其中h_{\varphi }(k)又称为小波函数系数,它与尺度函数系数有如下关系:

最后,根据上述推论,我们可以将函数f(x) \in L^{2}(R) 写作其小波级数展开形式:

其中 c_{j0} 与 d_{j} 称为近似系数和细节系数(就像傅里叶级数展开式中的系数一样,是我们重点要求的系数)

其定义有:

4.4 Haar 小波

作为小波分析中最简单的小波,尽管 haar 小波在大多数的震荡信号中并不常用,但 haar小波毫无疑问是作为小波理论最经典,最亲民,最适合作为教程来进行讲解的小波。

实际上,在上文中开始讲解小波变换的范例中,已经大量引用了haar小波的内容,现在我们着重讨论 haar 小波,并用haar 小波作为例子,计算

的变换结果,首先和所有的小波分析一样,我们首先有搞懂 haar 小波的尺度函数及小波函数,haar小波的尺度函数定义如下:

Haar小波的小波函数定义如下:

现在,我们对其进行haar小波级数展开,也就是求 c_{j0} 与 d_{j} ,我们设初始尺度 j0=0 ,依据上一章给出的展开式系数,我们求以下系数(计算过程分别代入):

然后将它代入展开式中:

参考:

从傅里叶变换进阶到小波变换(一) - 知乎

如何通俗地讲解傅立叶分析和小波分析间的关系? - 知乎

https://feihu.eng.ua.edu/NSF_TUES/w7_2.pdf

小波导论(二)(introduction to wavelet transform) - 知乎

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

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

相关文章

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现计算原理解析 前言 损失函数无疑是机器学习和深度学习效果验证的核心检验功能,用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数,但…

SuperMap iServer 11i(2023)安全性提升汇总

作者:lisong 目录 账户信息合规度校验规则扩展功能图片验证码登录功能Web服务提供者密码加密数据库密码加密漏洞修复 SuperMap iServer 11i(2023)产品安全性相关的提升众多,涵盖账户安全、服务安全以及漏洞修复等方面,…

2023杭州·云栖大会:我在云栖看数智中国

目录 模型即服务(MaaS,Model as a Service)全球首个李白数字展我在云栖看数智中国 云栖之眼、视频云3D渲染、数字人…… 10月31日到11月2日,2023云栖大会在杭州市西湖区云栖小镇火热进行,本次的主题为“ 计算&#xff…

YOLO目标检测——红外多目标检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:自动驾驶、安防监控等数据集说明:红外多目标检测数据集,真实场景的高质量图片数据,数据场景丰富,含有行人、汽车、自行车、摩托、消防栓、指示牌、狗等图片标签说明:使用lableimg标注软件标注…

题解数量上三百了

题解数量上三百了 持之以恒,不断进步。

近独立粒子的最概然分布

近独立粒子:粒子之间相互作用微弱基本粒子中,自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中,全同粒子可以分辨量子力学,全同粒子不可以分辨微…

JMeter接口测试性能测试

目前最新版本发展到5.0版本,需要Java7以上版本环境,下载解压目录后,进入\apache-jmeter-5.0\bin\,双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组,右击测试计划,在快捷菜单单击添加-…

【腾讯云 HAI域探秘】基于ChatGLM和StableDiffusion的小学一年级语文教学方案创作实践与经验分享

前言 目前腾讯云HAI正在内测中,腾讯云HAI为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在 HAI 中,根据应用智能匹配并推选出最适合的GPU算力资源,以确保您在数据科学、LLM、AI作画等高性能应用…

Java 算法篇-深入了解二分查找法

🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 目录 1.0 二分查找法的说明 2.0 二分查找实现的多种版本 2.1 二分查找的基础版本 2.2 二分查找的改动版本 2.3 二分查找的平衡版本 2.4 二分查找的官方版本 3.0 二分查找的应用 1…

OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介【C++的OpenCV 第十五课】

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入…

项目管理之如何分配项目工作任务

项目资源配置技术是项目管理中至关重要的环节,它直接影响到项目的效率、质量以及最终的成果。本文将介绍项目资源配置技术,包括小组团队主管配置、保持团队规模小型化、保持团队人员能力均衡、为保证团队速度及质量,团队资源复用数量限制以及…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

Leetcode—2103.环和杆【简单】

2023每日刷题&#xff08;十六&#xff09; Leetcode—2103.环和杆 实现代码 struct ring{int r;int g;int b; }sticks[10]{0};int countPoints(char * rings){char *p rings;int i;for(i 0; i < 10; i) {sticks[i].r 0;sticks[i].g 0;sticks[i].b 0;}while(*p ! \0)…

大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍

目录 1、分析原因 2、如何衡量性能指标 3、总结与使用建议 1、分析原因 我们都知道使用多线程的本质是为了提升程序的性能&#xff0c;总体来说有两个最核心的指标&#xff0c;一个延迟&#xff0c;一个吞吐量。延迟指的是发出请求到收到响应的时间&#xff0c;吞吐量指的是…

【golang】Reflect反射整理、值修改、反射结构体、应用

Reflect 整理 反射是用程序检查其所拥有的结构&#xff0c;尤其是类型的一种能力&#xff1b;这是元编程的一种形式。反射可以在运行时检查类型和变量&#xff0c;例如&#xff1a;它的大小、它的方法以及它能“动态地”调用这些方法。这对于没有源代码的包尤其有用。这是一个强…

C++引用概述

变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号(门牌号)&#xff0c;程序中通过变量来申请并命 名内存空间&#xff0c;通过变量的名字可以使用存储空间。引用是 C中新增加的概念&#xff0c;引用可以看作 一个已定义变量的别名。 引用的语法&#xff1a; Type&…

第二章 探究活动Activity

一、Activity的用法 1. Activity 任何活动都应该重写Activity的onCreate()方法 项目中在res添加任何资源都会在R文件生成一个相应的资源id 所有的活动都要在AndroidManifest.xml中进行注册才能生效 <activityandroid:name".FirstActivity"android:label"T…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中&#xff0c;名称为jmeter.log。我们可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起 另外&#xff0c;Jmeter可以很方便地设置日志输出级别&#xff1a; 通过这种方式修…

MySQL-----事务

事务的概念 事务是一种机制&#xff0c;一个操作序列。包含了一组数据库的操作命令&#xff0c;所有的命令都是一个整体&#xff0c;向系统提交或者撤销的操作&#xff0c;要么都执行&#xff0c;要么都不执行。 是一个不可分割的单位 事务的ACID特点 ACID&#xff0c;是指在可…

【Spring】配置文件-properties和xml

文章目录 1. 前言2. properties配置文件3. xml配置文件4. 总结 1. 前言 在Spring中,配置文件有两种,properties配置文件和xml配置文件 properties配置文件&#xff0c;在Java编程中是一种常见的配置文件形式&#xff0c;文件后缀为“.properties”&#xff0c;属于文本文件。它…