音频进阶学习十一——离散傅里叶级数DFS
文章目录
- 前言
- 一、傅里叶级数
- 1.定义
- 2.周期信号序列
- 3.表达式
- DFS
- IDFS
- 参数含义
- 4.DFS公式解析
- 二、IDFS推导
- 三、DFS的性质
- 1. 周期性性质
- 2.线性性质
- 3.时域移位
- 4.频域移位
- 5.时间翻转
- 6.时域卷积
- 7.频域卷积
- 总结
前言
按照傅里叶发展的历史,最先出现的傅里叶公式是傅里叶级数,只不过由于通用性以及核心理论先介绍了DTFT,它描述的是一个连续的频谱,描述了信号在整个频率范围内的频率成分。
对于本章内容离散傅里叶级数DFS,它描述的是离散的频谱,频率成分在周期上重复,本文将深入解析DFS的公式,并对IDFS进行推导,最后会对DFS的性质结合图像进行介绍。
|版本声明:山河君,未经博主允许,禁止转载
一、傅里叶级数
1.定义
傅里叶级数简称为FS,是由法国数学家傅里叶为了进行热解析提出来的——周期信号表示为不同频率的正弦和余弦波的和。它能够将一个复杂的周期函数分解为一系列简单的正弦和余弦函数,从而实现信号的频域分析。
2.周期信号序列
离散周期序列指的是时间域上以固定周期重复出现的离散信号,使用 x ~ [ n ] \tilde{x}[n] x~[n]表示,即:
x ~ [ n ] = x ~ [ n + r T ] , r ∈ Z \tilde{x}[n]=\tilde{x}[n+rT],\quad r\in Z x~[n]=x~[n+rT],r∈Z
如下图, T = 10 T=10 T=10的周期序列
3.表达式
DFS
X ~ [ k ] = ∑ n = 0 N − 1 e j ( − 2 π k n N ) x ~ [ n ] \tilde{X}[k]=\sum_{n=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[n] X~[k]=n=0∑N−1ej(N−2πkn)x~[n]
IDFS
x ~ [ n ] = 1 N ∑ k = 0 N − 1 e j ( 2 π k n N ) X ~ [ k ] \tilde{x}[n]=\frac{1}{N}\sum_{k=0}^{N-1}e^{j(\frac{2\pi kn}{N})}\tilde{X}[k] x~[n]=N1k=0∑N−1ej(N2πkn)X~[k]
参数含义
~
:表示为周期序列- X ~ [ k ] \tilde{X}[k] X~[k]: 是信号在频域中的分量(傅里叶系数)
- x ~ [ n ] \tilde{x}[n] x~[n]:是时间域中的周期离散信号
- N N N:是序列周期
- k k k:表示频率索引
- e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn):复指数,表示信号的频率分量
4.DFS公式解析
1)右边解析
和上一篇解析DTFT一样,我们先解析DFS右边,在此之前,如果对于复指数序列和正交不太理解的同学,还是需要先看音频进阶学习九——离散时间傅里叶变换DTFT这篇文章,里面有对于为什么需要把序列转换成复指数序列的详细解释。
∑ n = 0 N − 1 e j ( − 2 π k n N ) x ~ [ n ] \sum_{n=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[n] n=0∑N−1ej(N−2πkn)x~[n]
T T T、 f f f、 ω \omega ω的关系
我们来梳理一下周期、频率和角频率的关系
- 频率:指的是某个周期性事件在单位时间内发生的次数, f = 1 T f=\frac{1}{T} f=T1
- 周期:是一个周期性信号或事件完成一次完整波动所需的时间, T = 1 f T=\frac{1}{f} T=f1
- 角频率:表示波动或振动的“速率”,即信号的变化速度, ω = 2 π f = 2 π T \omega = 2\pi f=\frac{2\pi}{T} ω=2πf=T2π
求和公式N的释义
上文中提到 N N N是序列周期,并且根据DFS公式也很容易看出来,对于序列的求和范围 n ∈ [ N − 1 ] n \in [N-1] n∈[N−1],也就是序列的长度为 N N N。
从 T T T、 f f f、 ω \omega ω的关系,我们得到 ω = 2 π f = 2 π T = 2 π N \omega = 2\pi f=\frac{2\pi}{T} = \frac{2\pi}{N} ω=2πf=T2π=N2π,也就是该周期序列的基波(一个波形的最低频率,是波形的基本振动频率)为 2 π N \frac{2\pi}{N} N2π。
求和公式K的释义
对于DFS来说,一个周期序列分解为不同频率的正弦和余弦波的和,从上文中 N N N的作用我们首先得到了基波的频率,那么其他频率怎么来表示呢? 我们知道对于谐波是基频的整数倍频率,例如2倍频(第二谐波)、3倍频(第三谐波)等,而谐波和基波组成了周期序列。
对于 k k k代表了频率索引,即:
2 π N k , k ∈ [ 0 , 1 , 2 , . . . . , N − 1 ] \frac{2\pi}{N}k,k\in[0,1,2,....,N-1] N2πk,k∈[0,1,2,....,N−1]
- 当 k = 0 k=0 k=0时,表示的是直波
- 当 k = 1 k=1 k=1时,表示的是基波(第一谐波)
- 当 k = 2 k=2 k=2时,表示的是第二谐波
- 当 k = N / 2 k=N/2 k=N/2时,对应奈奎斯特频率(即采样定理)
此时我们得到了不同的 ω 0 , ω 1 , ω 2 , . . . , ω N − 1 \omega_0,\omega_1,\omega_2,...,\omega_N-1 ω0,ω1,ω2,...,ωN−1,从这里也能看出,对于离散傅里叶级数,频域也是离散的。
e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义
其实在音频进阶学习九——离散时间傅里叶变换DTFT文章中已经解释过了,这里再简单解释一遍:
对于欧拉公式将极坐标表示为复指数形式:
e j θ = cos ( θ ) + j sin ( θ ) e^{j\theta}=\cos(\theta)+j\sin(\theta) ejθ=cos(θ)+jsin(θ)
由此可以得到
e − j ω n = > cos ( j ω n ) − j s i n ( ω n ) e^{-j\omega n}=>\cos(j\omega n)-jsin(\omega n) e−jωn=>cos(jωn)−jsin(ωn)
它表示的是随着 n n n的增长,以频率 ω \omega ω在一个单位圆上以顺时针方式进行周期震荡,可以根据之前文章中的图片进行理解。
∑ n = 0 N − 1 e j ( − 2 π k n N ) x ~ [ n ] \sum_{n=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[n] ∑n=0N−1ej(N−2πkn)x~[n]的释义
而对于序列与复指数相乘,我们可以看作是序列 x ~ [ n ] \tilde{x}[n] x~[n]对于不同谐波上的正交,即求投影。根据欧拉公式的特性,我们可以看到公式
∑ n = 0 N − 1 e j ( ω m − ω l ) n \sum_{n=0}^{N-1}e^{j(\omega_m-\omega_l)n} n=0∑N−1ej(ωm−ωl)n
当 ω m ≠ ω l \omega_m\neq \omega_l ωm=ωl时, e j ( ω m − ω l ) n e^{j(\omega_m-\omega_l)n} ej(ωm−ωl)n表示的是一个周期性复数,几何上表示在复平面上绕原点画圆,如同上文中对于 e − j ω n e^{-j\omega n} e−jωn解释的图像,所以对于累加和 ∑ n = 0 N − 1 e j ( ω m − ω l ) n \sum_{n=0}^{N-1}e^{j(\omega_m-\omega_l)n} ∑n=0N−1ej(ωm−ωl)n为0。
也就是说对于 e j ( − 2 π k n N ) × x ~ [ n ] e^{j(\frac{-2\pi kn}{N})} \times \tilde{x}[n] ej(N−2πkn)×x~[n],如果 x ~ [ n ] \tilde{x}[n] x~[n]中间不包含特定的 − 2 π k n N \frac{-2\pi kn}{N} N−2πkn(当 N , k N,k N,k确定时)的频率,那么对于 ∑ n = 0 N − 1 e j ( − 2 π k n N ) x ~ [ n ] \sum_{n=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[n] ∑n=0N−1ej(N−2πkn)x~[n],求和为零。
2)左边解释
与DTFT相同,对于 X ~ [ k ] \tilde{X}[k] X~[k]同样包含了幅度与相位,这里也简单回顾一下之前的文章。
实部与虚部
我们知道对于欧拉公式:
e j θ = cos ( θ ) + j sin ( θ ) e^{j\theta}=\cos(\theta)+j\sin(\theta) ejθ=cos(θ)+jsin(θ)
它的实部表示了相位(两波之间的时间或空间偏移),虚部表示了幅度,对于DFS中:
X ~ [ k ] = ∑ n = 0 N − 1 e j ( − 2 π k n N ) x ~ [ n ] X ~ [ k ] = ∑ n = 0 N − 1 x ~ [ n ] cos ( 2 π N k ) ⏟ R e ( X ~ [ k ] ) − ∑ n = 0 N − 1 j x ~ [ n ] sin ( 2 π N k ) ⏟ I e ( X ~ [ k ] ) \tilde{X}[k]=\sum_{n=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[n]\\ \tilde{X}[k]=\underbrace{\sum_{n=0}^{N-1}\tilde{x}[n]\cos(\frac{2\pi}{N}k)}_{Re(\tilde{X}[k])} - \underbrace{\sum_{n=0}^{N-1}j\tilde{x}[n]\sin(\frac{2\pi}{N}k)}_{Ie(\tilde{X}[k])} X~[k]=n=0∑N−1ej(N−2πkn)x~[n]X~[k]=Re(X~[k]) n=0∑N−1x~[n]cos(N2πk)−Ie(X~[k]) n=0∑N−1jx~[n]sin(N2πk)
- R e ( X ~ [ k ] ) Re(\tilde{X}[k]) Re(X~[k])是实部
- I m ( X ~ [ k ] ) Im(\tilde{X}[k]) Im(X~[k])是虚部
幅度与相位
- 幅度:幅度是频谱中每个频率分量的强度或大小,实部和虚部的模长,可以得出该频率分量的幅度。使用 ∣ X ~ [ k ] ∣ |\tilde{X}[k]| ∣X~[k]∣表示信号在频率 ω \omega ω处的能量强度或振幅
∣ X ~ [ k ] ∣ = R e ( X ~ [ k ] ) 2 + I m ( X ~ [ k ] ) 2 |\tilde{X}[k]|=\sqrt{Re(\tilde{X}[k])^2+Im(\tilde{X}[k])^2} ∣X~[k]∣=Re(X~[k])2+Im(X~[k])2 - 相位:相位是频谱中每个频率分量相对于其他频率分量的相位偏移,通过实部和虚部的比值,可以计算相位。使用 arg ( X ~ [ k ] ) 或 ∠ ( X ~ [ k ] ) \arg(\tilde{X}[k])或\angle(\tilde{X}[k]) arg(X~[k])或∠(X~[k])表示:
∠ ( X ~ [ k ] ) = tan − 1 I m ( X ~ [ k ] ) R e ( X ~ [ k ] ) \angle(\tilde{X}[k])=\tan^{-1}\frac{Im(\tilde{X}[k])}{Re(\tilde{X}[k])} ∠(X~[k])=tan−1Re(X~[k])Im(X~[k])
二、IDFS推导
离散傅里叶级数的逆公式(Inverse Discrete Fourier Series, IDFS)是将频域信息转换回时间域信号的过程。其推导过程是基于傅里叶变换的性质。其验证如下:
- DFS
X ~ [ k ] = ∑ m = 0 N − 1 e j ( − 2 π k n N ) x ~ [ m ] \tilde{X}[k]=\sum_{m=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[m] X~[k]=m=0∑N−1ej(N−2πkn)x~[m] - IDFS
x ~ [ n ] = 1 N ∑ k = 0 N − 1 e j ( 2 π k n N ) X ~ [ k ] \tilde{x}[n]=\frac{1}{N}\sum_{k=0}^{N-1}e^{j(\frac{2\pi kn}{N})}\tilde{X}[k] x~[n]=N1k=0∑N−1ej(N2πkn)X~[k] - 将DFS代入IDFS
x ~ [ n ] = 1 N ∑ k = 0 N − 1 ( ∑ m = 0 N − 1 e j ( − 2 π k n N ) x ~ [ m ] ) e j ( 2 π k n N ) \tilde{x}[n] =\frac{1}{N}\sum_{k=0}^{N-1}\Big(\sum_{m=0}^{N-1}e^{j(\frac{-2\pi kn}{N})}\tilde{x}[m]\Big)e^{j(\frac{2\pi kn}{N})} x~[n]=N1k=0∑N−1(m=0∑N−1ej(N−2πkn)x~[m])ej(N2πkn) - 根据交换求和
x ~ [ n ] = 1 N ∑ m = 0 N − 1 x ~ [ m ] ∑ k = 0 N − 1 e j 2 π k N ( n − m ) \tilde{x}[n] =\frac{1}{N}\sum_{m=0}^{N-1}\tilde{x}[m]\sum_{k=0}^{N-1}e^{j\frac{2\pi k}{N}(n-m)} x~[n]=N1m=0∑N−1x~[m]k=0∑N−1ejN2πk(n−m) - 内层求和
∑ k = 0 N − 1 e j 2 π k N ( n − m ) = { N , n = m 0 , n ≠ m \sum_{k=0}^{N-1}e^{j\frac{2\pi k}{N}(n-m)}=\begin{cases} N, \quad n=m\\ 0,\quad n\neq m\end{cases} k=0∑N−1ejN2πk(n−m)={N,n=m0,n=m - 将内层求和替换进入
x ~ [ n ] = 1 N ∑ m = 0 N − 1 x ~ [ m ] × N × δ n , m \tilde{x}[n]=\frac{1}{N}\sum_{m=0}^{N-1}\tilde{x}[m]\times N \times \delta_{n,m} x~[n]=N1m=0∑N−1x~[m]×N×δn,m - 简化
x ~ [ n ] = ∑ m = 0 N − 1 x ~ [ m ] δ ( n − m ) \tilde{x}[n]=\sum_{m=0}^{N-1}\tilde{x}[m]\delta(n-m) x~[n]=m=0∑N−1x~[m]δ(n−m)
于是我们有一次得到了冲激分解公式,使用单位冲激序列表示的加权和。
三、DFS的性质
由于DFS和DTFT的相似性,在上一篇文章中音频进阶学习十——DTFT的条件、性质与举例,已经对于各种性质做了详细介绍,并且其推导公式很简单(如果感兴趣推导过程,可以看看北京航空航天大学王俊老师的课程),这里只做简单介绍。
1. 周期性性质
- 离散傅里叶级数的信号 x [ n ] x[n] x[n] 是周期性的,周期为 N N N
- 其频域表示 X [ k ] X[k] X[k] 也是周期性的,周期为 N N N,即:
X ~ [ k ] = X ~ [ k + N ] \tilde X[k]=\tilde X[k+N] X~[k]=X~[k+N]
2.线性性质
离散傅里叶级数具有线性性质,即如果信号 x 1 [ n ] x_1[n] x1[n]和 x 2 [ n ] x_2[n] x2[n] 的傅里叶系数分别是 X 1 [ k ] X_1[k] X1[k]和 X 2 [ k ] X_2[k] X2[k],那么任意常数倍的线性组合也满足傅里叶级数的线性性:
x ~ [ n ] = a x ~ 1 [ n ] + b x ~ 2 [ n ] ⟷ D F S X ~ [ k ] = a X ~ 1 [ k ] + b X ~ 2 [ k ] \tilde x[n]=a\tilde x_1[n]+b\tilde x_2[n]\stackrel{DFS}{\longleftrightarrow}\tilde X[k]=a\tilde X_1[k]+b\tilde X_2[k] x~[n]=ax~1[n]+bx~2[n]⟷DFSX~[k]=aX~1[k]+bX~2[k]
3.时域移位
幅度频不变,相位成线性变化
x ~ [ n − n d ] ⟷ D F S X ~ [ k ] e − j 2 π k N n d \tilde x[n-n_d]\stackrel{DFS}{\longleftrightarrow}\tilde X[k]e^{-j\frac{2\pi k}{N}n_d} x~[n−nd]⟷DFSX~[k]e−jN2πknd
4.频域移位
频域的移位相当于时域乘上一个复指数序列
x ~ [ n ] e − j 2 π k N l ⟷ D F S X ~ [ k − l ] \tilde x[n]e^{-j\frac{2\pi k}{N}l}\stackrel{DFS}{\longleftrightarrow}\tilde X[k-l] x~[n]e−jN2πkl⟷DFSX~[k−l]
5.时间翻转
时域翻转,频域也会相应翻转,即幅度和相位也会翻转
x ~ [ − n ] ⟷ D F S X ~ [ − k ] \tilde x[-n]\stackrel{DFS}{\longleftrightarrow}\tilde X[-k] x~[−n]⟷DFSX~[−k]
6.时域卷积
时域卷积等于频域相乘,即 ∗ * ∗代表卷积运算
x ~ [ n ] ∗ h ~ [ n ] ⟷ D F S X ~ [ k ] × H ~ [ k ] \tilde x[n] *\tilde h[n]\stackrel{DFS}{\longleftrightarrow}\tilde X[k]\times \tilde H[k] x~[n]∗h~[n]⟷DFSX~[k]×H~[k]
7.频域卷积
频域卷积等于时域相乘,即 ∗ * ∗代表卷积运算
x ~ [ n ] × w ~ [ n ] ⟷ D F S 1 N ∑ l = 0 N − 1 X ~ [ l ] ∗ W ~ [ k − l ] \tilde x[n] \times \tilde w[n]\stackrel{DFS}{\longleftrightarrow} \frac{1}{N}\sum_{l=0}^{N-1}\tilde X[l]*\tilde W[k-l] x~[n]×w~[n]⟷DFSN1l=0∑N−1X~[l]∗W~[k−l]
总结
本篇文章中对于DFS的公式做了详细的介绍,相信对于DFS和IDFS公式的推导和使用有了一定的理解。同时本篇文章也将DFS的性质做了介绍。
DFS和DTFT有着一定的联系和区:对于DFS,它主要用于表示周期性离散时间信号,在频域上是离散的且为周期的,而对于DTFT,它表示非周期性离散时间信号的频谱,在频域上是连续的。也就是说DFS可以看作为 DTFT 在一个周期内的采样。
反正收藏也不会看,请帮忙点个赞吧!
相关文章:

音频进阶学习十一——离散傅里叶级数DFS
文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义 ∑ n 0 N − 1 e…...

20.<Spring图书管理系统①(登录+添加图书)>
PS:关于接口定义 接口定义,通常由服务器提供方来定义。 1.路径:自己定义 2.参数:根据需求考虑,我们这个接口功能完成需要哪些信息。 3.返回结果:考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…...

关于图像锐化的一份介绍
在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…...

Django开发入门 – 0.Django基本介绍
Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...

多智能体协作架构模式:驱动传统公司向AI智能公司转型
前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…...

CentOS服务器部署Docker+Jenkins持续集成环境
一、准备工作 一台运行 CentOS 的服务器,确保有足够的磁盘空间、内存资源,并且网络连接稳定。建议使用 CentOS 7 或更高版本,本文以 CentOS 7 为例进行讲解。 拥有服务器的 root 权限,因为后续安装软件包、配置环境等操作需要较…...

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…...

【Android】Android开发应用如何开启任务栏消息通知
Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置,如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...

上传文件报错:the request was rejected because no multipart boundary was found
后端使用的springboot的MultipartFile上传文件,接口使用apifox调试过没有问题,但前端调接口报错。前端使用了fetch发送formData数据。 the request was rejected because no multipart boundary was found 前端使用的请求头是 multipart/form-data 没有…...

大模型—Dify本地化部署实战
Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...

功能架构元模型
功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…...

常用工具类——Collections集合框架
常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类,提供了一系列静态方法,分类来复习! 1.排序操作 reverse(List list) :反转顺序shuffle(List list) : 洗牌,将顺序打乱sort(List list) &…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获
e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆
雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂,其末端执行器的位置可以表示为: 其中: L1 和 L2 是机器人臂的长度。θ1 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…...

网络爬虫js逆向之异步栈跟栈案例
【注意!!!】 前言: 1. 本章主要讲解js逆向之异步栈跟栈的知识(通过单步执行调试) 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...

使用Ollama本地部署deepseek
1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…...

Rust错误处理:从灭火器到核按钮的生存指南
开篇:错误处理的生存哲学 在Rust的平行宇宙里,错误分为两种人格: panic! → 核按钮💣(不可恢复,全系统警报)Result → 灭火器🧯(可控制,局部处理࿰…...

Golang:Go 1.23 版本新特性介绍
流行的编程语言Go已经发布了1.23版本,带来了许多改进、优化和新特性。在Go 1.22发布六个月后,这次更新增强了工具链、运行时和库,同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面,以下…...

电脑运行黑屏是什么原因?原因及解决方法
电脑运行黑屏是指电脑在正常开机或使用过程中,突然出现屏幕变黑,无法显示任何内容的现象。这种现象可能会给用户带来很多不便,甚至造成数据丢失或硬件损坏。那么,电脑运行黑屏是什么原因呢?下面我们将分析几种可能的原…...

redis之AOF持久化过程
流程图 在redis.conf文件中配置appendonly为yes则开启aof持久化机制 #开启aof持久化,默认关闭为no appendonly no也可以在命令行开启 aof刷盘策略 #每个写操作都会同步刷盘。 appendfsync always #执行命令后先放入aof缓冲区,每秒钟将缓冲区数据刷盘…...

Elasticsearch:向量搜索的快速介绍
作者:来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇,将深入探讨向量搜索(也称为语义搜索)的复杂性,以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇,将深入探讨向量搜…...

Docker在安装时遇到的问题(第一部分)
一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件:fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…...

使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现
使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现 在 iOS 开发中,OpenGL ES 是一个强大的工具,用于实现高性能的 2D 和 3D 图形渲染。本文将详细分析一段完整的代码,展示如何使用 OpenGL ES 在 iOS 上渲染一个简单的四边形。我们将从代码的结构、关键模块、着色器的实…...
Spring Boot 2 快速教程:WebFlux处理流程(五)
WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…...

Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)
鼠标事件使用 mousedown"canvasDown($event)"按下事件合集 click 点击某个对象时触发 mousedown 鼠标按钮被按下时触发 mouseup 鼠标按钮被松开时触发 mouseleave 当鼠标指针移出元素时触发 dblclick 双击时触发 mousemove 鼠标移动时触发,…...

两种交换排序算法--冒泡,快速
目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序(Bubble Sort)是一种简单的排序算法,基本思想是通过反复交换相邻的元素,直到整个序列有序。它的名字来源于较大的元素像气泡…...

语音交友app系统源码功能及技术研发流程剖析
语音交友App的核心功能包括语音聊天、语音房间、社交互动等,开发流程涵盖需求分析、技术选型、前后端开发、实时通信集成、测试优化、部署上线及运营维护。 一、语音交友App的大概功能 1. 语音聊天 一对一聊天:用户可与好友进行私密语音通话。 群组语音…...

零基础Vue入门7——状态管理Pinia
本节重点: pinia是什么pinia怎么用 pinia是什么 vue中组件间的数据传递: app.config.globalProperties:能够被应用内所有组件实例访问到的全局属性的对象props:父传子用provide:父传后代用 想象下有咩有哪些数据存储…...

Bash (Bourne-Again Shell)、Zsh (Z Shell)
文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别,列成表格方便对比: 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…...

Android studio 创建aar包给Unity使用
1、aar 是什么? 和 Jar有什么区别 aar 和 jar包 都是压缩包,可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 ,可以包含Android的专有内容,比如AndroidManifest.xml 文件 &#…...