当前位置: 首页 > news >正文

音频进阶学习十一——离散傅里叶级数DFS

文章目录


前言

按照傅里叶发展的历史,最先出现的傅里叶公式是傅里叶级数,只不过由于通用性以及核心理论先介绍了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],rZ
如下图, 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=0N1ej(N2π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=0N1ej(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(N2π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=0N1ej(N2π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[N1],也就是序列的长度为 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πkk[0,1,2,....,N1]

  • 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,...,ωN1,从这里也能看出,对于离散傅里叶级数,频域也是离散的。

e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N2π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) ejω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=0N1ej(N2π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=0N1ej(ω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} ejωn解释的图像,所以对于累加和 ∑ n = 0 N − 1 e j ( ω m − ω l ) n \sum_{n=0}^{N-1}e^{j(\omega_m-\omega_l)n} n=0N1ej(ωmωl)n为0。

也就是说对于 e j ( − 2 π k n N ) × x ~ [ n ] e^{j(\frac{-2\pi kn}{N})} \times \tilde{x}[n] ej(N2πkn)×x~[n],如果 x ~ [ n ] \tilde{x}[n] x~[n]中间不包含特定的 − 2 π k n N \frac{-2\pi kn}{N} N2π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=0N1ej(N2π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=0N1ej(N2πkn)x~[n]X~[k]=Re(X~[k]) n=0N1x~[n]cos(N2πk)Ie(X~[k]) n=0N1jx~[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])=tan1Re(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=0N1ej(N2π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=0N1ej(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=0N1(m=0N1ej(N2π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=0N1x~[m]k=0N1ejN2πk(nm)
  • 内层求和
    ∑ 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=0N1ejN2πk(nm)={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=0N1x~[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=0N1x~[m]δ(nm)

于是我们有一次得到了冲激分解公式,使用单位冲激序列表示的加权和。

三、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~[nnd]DFSX~[k]ejN2π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]ejN2πklDFSX~[kl]
在这里插入图片描述

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=0N1X~[l]W~[kl]
在这里插入图片描述


总结

本篇文章中对于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…...

ssm的心得

spring是一个轻量级的ioc(控制反转)和aop(面向切面编程)容器框架,它可以管理和配置应用中的各种bean(对象),实现bean之间的依赖注入,以及提供事务管理、缓存、测试等功能…...

14vue3实战-----获取用户信息和用户的菜单树信息

14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口,前端需要把该接口封装一下: service/login/login.ts: import hyRequest from…...

shell脚本学习笔记

Shell脚本学习笔记 参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...

Java中的线程池及其应用场景有哪些?

Java中的线程池是一种高效的并发编程机制,通过复用线程来管理任务的执行,从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例,帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...

13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍

LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...

构建基于 SSE 协议通信的 MCP Server 和 Client

在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出&a…...

Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践

在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...

第3章 使用 Vue 脚手架

第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...

MySQL第五次作业

根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...

pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题

目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习: 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...

ai智能DeepSeek 在 Cursor 中的配置与应用实践

DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…...

登录到docker里

在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

10.单例模式 (Singleton Pattern)

单例模式的定义 单例模式(Singleton Pattern) 是一种创建型设计模式,确保一个类在整个程序生命周期中只能有一个实例,并提供一个全局访问点。 特点: 唯一性:保证系统中某个类只能有一个实例。全局访问点…...

Docker 常见问题解决方法

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…...

QT-面试

1. C(特别是 Qt)开发中,内存优化的方法 1. 合理管理对象生命周期,使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期,避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...

使用java代码操作rabbitMQ收发消息

SpringAMQP 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与RabbitMQ交互。并且RabbitMQ官方也…...

LeetCode 128: 最长连续序列

LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums […...

Shapefile格式文件解析和显示

Java实现GIS SHP文件格式的解析和显示,JDK19下编译,awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中,解析见:DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码: public static Shap…...

华为昇腾Altas产品查询——常用命令汇总记录

参考链接: 【2024第一期CANN训练营】Altas产品查询CANN软件包版本等信息npu-smi Atlas 中心训练服务器 6.0.0 NPU驱动和固件安装指南 06 Ascend Extension for PyTorch插件软件版本配套表 以下操作适用于查询npu设备的基本信息。 #查询所有设备的基本信息 npu-smi…...

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系 在当今这个科技日新月异的时代,企业之间的竞争早已超越了单纯的产品质量比拼,**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”(split-apply-combine)策略。此策略是指将一个问题分割成更容易操作的部分,再对每一部分进行独立的操作,最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...

开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。

一、明确游戏定位与核心玩法 游戏类型 MOBA(Multiplayer Online Battle Arena):强调团队合作、策略性和即时战斗。确定游戏模式(如5v5、3v3等)和地图设计。 核心玩法 角色设计:英雄技能、属性、成长曲线。…...

harmonyOS生命周期详述

harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型,您可以按照以下步骤进行操作: 步骤 1:安装 Ollama 安装 Ollama: 使用以下命令安装 Ollama: curl -sSfL https://ollama.com/download.…...

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言:在开发过程中,几乎踩便了所有大坑小坑总结出的文章,我是把坑踩满了,帮助更过小白快速上手,如有错误之处,还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能: 模组启动模…...

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 将4个按键的引脚设置为input,并将初始状态设置为Pull-up(上拉输入) 为解决按键抖动的问题,我们…...

TCP队头阻塞问题以及QUIC解决方案

TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...

如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例

在当今数据驱动的商业环境中,获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而,像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序,获取eBay商品的销量详情&#xf…...

激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归:Sigmoid函数在分类问题中的应用 整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元&a…...

算法基础之八大排序

文章目录 概要1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希尔排序(Shell Sort)5. 归并排序(Merge Sort)6. 快速排…...

通达OA /mysql/index.php 未授权访问漏洞

通达OA /mysql/index.php 未授权访问漏洞 漏洞描述 通达OA 未授权访问phpmyadmin漏洞,攻击者无需帐号密码可直接访问phpmyadmin,造成数据库泄漏。攻击者可操作数据库执行sql语句,执行恶意操作,进行一步攻击。 威胁等级: 高危 …...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

C++类和对象

目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统,能够理解、推理和生成信息。它的核心作用包括: 1.1 语义理解 自然语言处理(NLP):AI知识库能够理解用户查询的语义,而不仅仅是关键词匹配。 …...

docker常用命令及案例

以下是 Docker 的所有常用命令及其案例说明&#xff0c;按功能分类整理&#xff1a; 1. 镜像管理 1.1 拉取镜像 命令: docker pull <镜像名>:<标签>案例: 拉取官方的 nginx 镜像docker pull nginx:latest1.2 列出本地镜像 命令: docker images案例: 查看本地所有…...

webpack【初体验】使用 webpack 打包一个程序

打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...

初始数据结构☞复杂度与泛式

一.时间复杂度 定义&#xff1a; 算法的时间复杂度是一个数学函数&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度。 O渐进表示方法&#xff1a; 原因&#xff1a; 计算时间复杂度时&#xff0c;我们其实并不一定要计算精确的执行次数&#xff0c;而…...

理解UML中的四种关系:依赖、关联、泛化和实现

在软件工程中&#xff0c;统一建模语言&#xff08;UML&#xff09;是一种广泛使用的工具&#xff0c;用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型&#xff0c;如类图、用例图、序列图等&#xff0c;帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…...

【前端】打造自己的hexo博客_hexo一本通

今日更新完毕&#xff0c;建议关注收藏点赞&#xff01; 目录 打造自己的hexo blog挂载到自己的github主页设计自己的theme 打造自己的hexo blog #需要安装git node.js 这里略#安装hexo npm install -g hexo-cli npm install hexo hexo help#<folder>必须是空的 hexo in…...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...

储能系统-系统架构

已更新系列文章包括104、61850、modbus 、单片机等&#xff0c;欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统&#xff08;BESS&#xff09; 架构 电池储能系统主要包括、电池、pcs、本地控制…...

程序员也可以这样赚钱

最近有朋友和我交流了关于程序员副业的想法&#xff0c;我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐&#xff0c;结合政策合规性、平台口碑及实际操作性整理&#xff0c;覆盖国内外主流选择&#xff1a; 一、国内综合型平台 程序…...

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...

Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗

Elasticsearch 本身并不直接收集目标服务器的日志&#xff0c;它主要用于存储、搜索和分析数据。要收集目标服务器的日志&#xff0c;通常会借助其他工具&#xff0c;并且一般不需要在目标服务器上安装 Elasticsearch 软件&#xff0c;常见的日志收集方案&#xff1a; Filebeat…...