音频进阶学习九——离散时间傅里叶变换DTFT
文章目录
- 前言
- 一、DTFT的解释
- 1.DTFT公式
- 2.DTFT右边释义
- 1) 复指数 e − j ω n e^{-j\omega n} e−jωn
- 2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn
- 复指数序列
- 复数的共轭
- 正交
- 正交集
- 3)复指数序列求和
- 3.DTFT左边边释义
- 1)实部与虚部
- 2)幅度与相位
- 二、IDTFT
- 1.逆离散时间的傅里叶变换
- 2.IDTFT验证
- 总结
前言
按照傅里叶发展的历史,本应该先介绍傅里叶级数,但是由于DTFT更通用,且DTFT是属于核心理论,而DFS是DTFT的一种特列,所以该系列文章中先介绍DTFT,也就是离散时间傅里叶变换。
|版本声明:山河君,未经博主允许,禁止转载
一、DTFT的解释
1.DTFT公式
看一下DTFT和CFT也就是连续傅里叶变换的对比:
- DTFT
X ( ω ) = ∑ n = − ∞ ∞ x [ n ] e − j ω n X(\omega)=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} X(ω)=n=−∞∑∞x[n]e−jωn - CFT
F ( ω ) = ∫ − ∞ ∞ f ( t ) e − j ω t d t F(\omega)=\int^{\infty}_{-\infty}f(t)e^{-j\omega t}dt F(ω)=∫−∞∞f(t)e−jωtdt
对比CFT,我们可以看到DTFT和CFT的差别在于,一个自变量是 n n n,一个自变量是 t t t,一个是非连续一个是连续。所以二者对比:
- 连续信号:在CFT中,频率是连续变量,频谱 F ( ω ) F(\omega) F(ω)对应的是一个实数角频率 ω \omega ω,直接描述频率分量。
- 离散信号: 在 DTFT ( 包括DFT) 中,由于信号是离散的,频谱的周期性引入了单位圆上的频率表示。对于 X ( ω ) X(\omega) X(ω)写作 X ( e j ω ) X(e^{j\omega}) X(ejω),所以DTFT写作为:
X ( e j ω ) = ∑ n = − ∞ ∞ x [ n ] e − j ω n X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} X(ejω)=n=−∞∑∞x[n]e−jωn
2.DTFT右边释义
对于DTFT右边 ∑ n = − ∞ ∞ x [ n ] e − j ω n \sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} n=−∞∑∞x[n]e−jωn我们来一步步分析这个公式的作用。
1) 复指数 e − j ω n e^{-j\omega n} e−jωn
上一篇文章中,我们用欧拉公式将极坐标表示为复指数形式:
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)
- 实部: cos ( j ω n ) \cos(j\omega n) cos(jωn)是以频率 ω \omega ω的余弦震荡
- 虚部: s i n ( ω n ) sin(\omega n) sin(ωn)是以频率 ω \omega ω的正弦震荡
它表示的含义是随着 n n n的增长,以频率 ω \omega ω在一个单位圆上以顺时针方式进行周期震荡,如下图:
- n n n代表时间 t t t在 [ 0 , 5 ] [0,5] [0,5]区间上的变换
- Z Z Z的指向是极坐标
- I m Im Im是虚部比变化
- R e Re Re是实部变化
2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn
复指数序列
在上一篇文章中,我们说 z = r ∗ e i θ z=r*e^{i\theta} z=r∗eiθ表示了极坐标的旋转, r r r代表了模长,而 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn中 x [ n ] x[n] x[n]可以是实数和虚数,所以对于 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn值得注意的是,应该理解为对于 x [ n ] x[n] x[n]进行旋转 − ω n -\omega n −ωn角度,而不是理解为模长。
而对于整个 x [ n ] x[n] x[n]的旋转,我们得到的是对于以某一个频率 ω \omega ω旋转了 − ω n -\omega n −ωn角度的新的序列,这就叫做复指数序列。其中对于 e − j ω n e^{-j\omega n} e−jωn我们看作是对于复指数序列的基函数。
复数的共轭
对于一个复数 z = a + b i z=a+bi z=a+bi,它的共轭复数为 z ‾ = a − b i \overline{z}=a-bi z=a−bi
- 复数共轭的几何意义是以实轴为对称轴反射。
- 共轭复数在许多计算中很重要,例如求复数的模: ∣ z ∣ = z ∗ z ‾ |z|=\sqrt{z*\overline{z}} ∣z∣=z∗z,展开来为:
( a + b i ) ∗ a ( − b i ) = a 2 − a b i + a b i − b 2 ∗ i 2 , ( i 2 = − 1 ) = > a 2 + b 2 (a+bi)*a(-bi)=a^2-abi+abi-b^2*i^2,\quad (i^2=-1)=>a^2+b^2 (a+bi)∗a(−bi)=a2−abi+abi−b2∗i2,(i2=−1)=>a2+b2
复数空间的内积使用了共轭来确保以下性质:
- 共轭对称性
< f , g > = < g , f > ‾ <f,g>=\overline{<g,f>} <f,g>=<g,f> - 非负性
< f , f > ≥ 0 <f,f> \geq 0 <f,f>≥0
正交
正交:在数学中,正交(orthogonality)通常用于描述两个向量或函数之间的一种关系,表示它们彼此垂直或互不相关。
- 向量正交:在欧几里得空间中,两个向量 u , v u,v u,v 如果它们的内积为 0,则称它们是正交的,即: u ∗ v = 0 u*v=0 u∗v=0
- 函数正交:两个函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x)在区间 [ a , b ] [a,b] [a,b]上内积为0,表示为函数正交,即: < f , g > = ∫ a b f ( x ) g ( x ) ∗ d x = 0 <f,g>=\int_a^bf(x)g(x)^*dx =0 <f,g>=∫abf(x)g(x)∗dx=0
正交意味着在平面上,角度为90°,例如 ( 1 , i ) , ( 1 , − i ) (1,i),(1,-i) (1,i),(1,−i):
正交集
正交集是由一组两两正交的向量或函数组成的集合。在这种集合中,任意两个不同的元素的内积为 0。而对于复指数序列的基函数 e − j ω n e^{-j\omega n} e−jωn则有:
< e − j ω l n , e − j ω m n > = ∑ n = 0 N − 1 e − j ω l n ∗ ( e − j ω m n ) ∗ ( e − j ω m n ) ∗ = e j ω m n , 由于复共轭 < e − j ω l n , e − j ω m n > = ∑ n = 0 N − 1 e − j ω l n ∗ e j ω m n = > ∑ n = 0 N − 1 e j ( ω m − ω l ) n <e^{-j\omega_l n}, e^{-j\omega_m n}>=\sum_{n=0}^{N-1}e^{-j\omega_l n}* (e^{-j\omega_m n})^*\\ (e^{-j\omega_m n})^*=e^{j\omega_m n},\quad 由于复共轭 \\ <e^{-j\omega_l n}, e^{-j\omega_m n}>=\sum_{n=0}^{N-1}e^{-j\omega_l n}*e^{j\omega_m n} =>\\ \sum_{n=0}^{N-1}e^{j(\omega_m-\omega_l)n} <e−jωln,e−jωmn>=n=0∑N−1e−jωln∗(e−jωmn)∗(e−jωmn)∗=ejωmn,由于复共轭<e−jωln,e−jωmn>=n=0∑N−1e−jωln∗ejωmn=>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。
也就是说对于任意复指数序列的基函数,当 ω m ≠ ω l \omega_m\neq \omega_l ωm=ωl时,两者之间相互不影响,这也正是DTFT使用复指数来进行运算的原因!
3)复指数序列求和
DTFT右边对于复指数序列为什么要进行求和,即 ∑ n = − ∞ ∞ x [ n ] e − j ω n \sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} ∑n=−∞∞x[n]e−jωn?
上面我们说了对于任意复指数序列的基函数,当 ω m ≠ ω l \omega_m\neq \omega_l ωm=ωl时,两者之间相互不影响。所以对于 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn中,对于某一个 ω k \omega_k ωk, x [ n ] ∗ e − j ω k n x[n]*e^{-j\omega_k n} x[n]∗e−jωkn中,将不会包含其他频率的影响。
在欧几里得空间中,投影的定义是: 投影 = < v ∗ u > u 投影=<v*u>u 投影=<v∗u>u,其中
- v v v 是要投影的向量
- u u u是基向量
- ⟨ v , u ⟩ ⟨v,u⟩ ⟨v,u⟩ 是内积,量化了 v v v 与 u u u的相似程度
而对于复指数序列投影,则有:
< x [ n ] , e − j ω n > = ∑ n = − ∞ ∞ x [ n ] ∗ e − j ω n ‾ e − j ω n ‾ = e j ω n 共轭性 < x [ n ] , e − j ω n > = ∑ n = − ∞ ∞ x [ n ] e − j ω n <x[n],e^{-j\omega n}>=\sum_{n=-\infty}^{\infty}x[n]*\overline{e^{-j\omega n}} \\ \overline{e^{-j\omega n}} =e^{j\omega n} 共轭性\\ <x[n],e^{-j\omega n}> =\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} <x[n],e−jωn>=n=−∞∑∞x[n]∗e−jωne−jωn=ejωn共轭性<x[n],e−jωn>=n=−∞∑∞x[n]e−jωn
其实就是DTFT函数,它的目的就是为了不同频率之间的影响。即如果 < x [ n ] , e − j ω k n > = ∑ n = − ∞ ∞ x [ n ] e − j ω k n = 0 <x[n],e^{-j\omega_k n}> =\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega_k n}=0 <x[n],e−jωkn>=n=−∞∑∞x[n]e−jωkn=0,那么序列 x [ n ] x[n] x[n]对于频率 ω k \omega_k ωk没有影响。
3.DTFT左边边释义
1)实部与虚部
上文中解释了DTFT函数的由来,即 ∑ n = − ∞ ∞ x [ n ] e − j ω n \sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} ∑n=−∞∞x[n]e−jωn可以看作是对信号进行“投影”,找出信号与每个频率基函数的匹配程度。那么如果
< x [ n ] , e − j ω k n > = ∑ n = − ∞ ∞ x [ n ] e − j ω k n ≠ 0 <x[n],e^{-j\omega_k n}> =\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega_k n}\neq 0 <x[n],e−jωkn>=n=−∞∑∞x[n]e−jωkn=0这个值我们表示为 X ( ω k ) X(\omega_k) X(ωk)有什么含义?或者说有什么作用?
我们知道对于欧拉公式:
e j θ = cos ( θ ) + j sin ( θ ) e^{j\theta}=\cos(\theta)+j\sin(\theta) ejθ=cos(θ)+jsin(θ)
它的实部表示了相位(两波之间的时间或空间偏移),虚部表示了幅度,那么对于DTFT公式:
X ( e j ω ) = ∑ n = − ∞ ∞ x [ n ] e − j ω n X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} X(ejω)=n=−∞∑∞x[n]e−jωn
其中复指数通过欧拉公式得到
e − j ω n = cos ( ω n ) − j sin ( ω n ) e^{-j\omega n}=\cos(\omega n)-j\sin(\omega n) e−jωn=cos(ωn)−jsin(ωn)
因此DTFT可以拆解为:
X ( e j ω ) = ∑ n = − ∞ ∞ x [ n ] ( cos ( ω n ) − j sin ( ω n ) ) X ( e j ω ) = ∑ n = − ∞ ∞ x [ n ] cos ( ω n ) ⏟ R e ( X ( e j ω ) ) − ∑ n = − ∞ ∞ x [ n ] j sin ( ω n ) ⏟ I e ( X ( e j ω ) ) X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n](\cos(\omega n)-j\sin(\omega n)) \\ X(e^{j\omega})=\underbrace{\sum_{n=-\infty}^{\infty}x[n]\cos(\omega n)}_{Re(X(e^{j\omega}))}-\underbrace{\sum_{n=-\infty}^{\infty}x[n]j\sin(\omega n)}_{Ie(X(e^{j\omega}))} X(ejω)=n=−∞∑∞x[n](cos(ωn)−jsin(ωn))X(ejω)=Re(X(ejω)) n=−∞∑∞x[n]cos(ωn)−Ie(X(ejω)) n=−∞∑∞x[n]jsin(ωn)
- R e ( X ( e j ω ) Re(X(e^{j\omega}) Re(X(ejω)是实部
- I m ( X ( e j ω ) Im(X(e^{j\omega}) Im(X(ejω)是虚部
2)幅度与相位
- 幅度:幅度是频谱中每个频率分量的强度或大小,实部和虚部的模长,可以得出该频率分量的幅度。使用 ∣ X ( e j ω ) ∣ |X(e^{j\omega})| ∣X(ejω)∣表示信号在频率 ω \omega ω处的能量强度或振幅
∣ X ( e j ω ) ∣ = R e ( X ( e j ω ) 2 + I m ( X ( e j ω ) 2 |X(e^{j\omega})|=\sqrt{Re(X(e^{j\omega})^2+Im(X(e^{j\omega})^2} ∣X(ejω)∣=Re(X(ejω)2+Im(X(ejω)2 - 相位:相位是频谱中每个频率分量相对于其他频率分量的相位偏移,通过实部和虚部的比值,可以计算相位。使用 arg ( X ( e j ω ) ) 或 ∠ ( X ( e j ω ) ) \arg(X(e^{j\omega}))或\angle(X(e^{j\omega})) arg(X(ejω))或∠(X(ejω))表示:
∠ ( X ( e j ω ) ) = tan − 1 I m ( X ( e j ω ) R e ( X ( e j ω ) \angle(X(e^{j\omega}))=\tan^{-1}\frac{Im(X(e^{j\omega})}{Re(X(e^{j\omega})} ∠(X(ejω))=tan−1Re(X(ejω)Im(X(ejω)
二、IDTFT
1.逆离散时间的傅里叶变换
上文中我们使用的傅里叶变换将序列从时域转成了频域,那么从频域恢复到时域我们成为逆傅里叶变换,逆离散时间的傅里叶变换表示为IDTFT。
它的公式为:
x [ n ] = 1 2 π ∫ − π π X ( e j ω ) e j ω n d ω x[n]=\frac{1}{2\pi}\int_{-\pi}^{\pi}X(e^{j\omega})e^{j\omega n}d\omega x[n]=2π1∫−ππX(ejω)ejωndω
2.IDTFT验证
我们将 X ( e j ω ) X(e^{j\omega}) X(ejω)代入到公式中:
x [ n ] = 1 2 π ∫ − π π ( ∑ k = − ∞ ∞ x [ k ] e − j ω k ) e j ω n d ω x[n]=\frac{1}{2\pi}\int_{-\pi}^{\pi}\big(\sum_{k=-\infty}^{\infty}x[k]e^{-j\omega k}\big)e^{j\omega n}d\omega x[n]=2π1∫−ππ(k=−∞∑∞x[k]e−jωk)ejωndω
根据之前文章积分和求和的特性
x [ n ] = ∑ k = − ∞ ∞ x [ k ] ( 1 2 π ∫ − π π e − j ω ( n − k ) d w ) x[n]=\sum_{k=-\infty}^{\infty}x[k]\big(\frac{1}{2\pi}\int_{-\pi}^{\pi}e^{-j\omega (n-k)}dw\big) x[n]=k=−∞∑∞x[k](2π1∫−ππe−jω(n−k)dw)
先看积分项
1 2 π ∫ − π π e − j ω ( n − k ) d w \frac{1}{2\pi}\int_{-\pi}^{\pi}e^{-j\omega (n-k)}dw 2π1∫−ππe−jω(n−k)dw
- 当 k = n k=n k=n时:
1 2 π ∫ − π π e − j ω ( n − k ) d w = 1 2 π ∫ − π π 1 d w = 1 \frac{1}{2\pi}\int_{-\pi}^{\pi}e^{-j\omega (n-k)}dw=\frac{1}{2\pi}\int_{-\pi}^{\pi}1dw=1 2π1∫−ππe−jω(n−k)dw=2π1∫−ππ1dw=1 - 当 k ≠ n k\neq n k=n时,上文中说过,因为 e j ( ω m − ω l ) n e^{j(\omega_m-\omega_l)n} ej(ωm−ωl)n表示的是一个周期性复数,其积分结果为零:
1 2 π ∫ − π π e − j ω ( n − k ) d w = 1 2 π ∗ 0 = 0 \frac{1}{2\pi}\int_{-\pi}^{\pi}e^{-j\omega (n-k)}dw=\frac{1}{2\pi}*0=0 2π1∫−ππe−jω(n−k)dw=2π1∗0=0
因此
1 2 π ∫ − π π e − j ω ( n − k ) d w = { 1 , n = k 0 , n ≠ k \frac{1}{2\pi}\int_{-\pi}^{\pi}e^{-j\omega (n-k)}dw=\begin{cases}1,\quad n=k \\ 0,\quad n\neq k\end{cases} 2π1∫−ππe−jω(n−k)dw={1,n=k0,n=k
我们用单位脉冲 δ \delta δ表示0,1,所以可以得到
x [ n ] = ∑ k = − ∞ ∞ x [ k ] δ [ n − k ] x[n]=\sum_{k=-\infty}^{\infty}x[k]\delta[n-k] x[n]=k=−∞∑∞x[k]δ[n−k]
有没有看起来很熟悉,这不就是冲激分解,使用单位冲激序列表示的加权和
总结
本篇文章中,我们对于DTFT做了深入的了解,附带着介绍了一些使用的数学知识,同时得到了IDTFT的公式。受到篇幅限制,本章只对DTFT公式进行了展示,并没有深入了解DTFT存在的条件和性质,那么在下一篇文章中会进行进一步介绍DTFT相关性质和条件。
如果对您有所帮助,请帮忙点个赞吧!
相关文章:
音频进阶学习九——离散时间傅里叶变换DTFT
文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1) 复指数 e − j ω n e^{-j\omega n} e−jωn2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3)复指数序列求和 3.DTF…...
pytorch 计算图中的叶子节点介绍
1. 什么是叶子节点? 在 PyTorch 的自动微分机制中,叶子节点(leaf node) 是计算图中: 由用户直接创建的张量,并且它的 requires_gradTrue。这些张量是计算图的起始点,通常作为模型参数或输入变…...
CSS系列(42)-- Backdrop Filter详解
前端技术探索系列:CSS Backdrop Filter详解 🎨 致读者:探索背景滤镜的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Backdrop Filter,这个强大的视觉效果特性。 基础效果 🚀 模糊效果 /…...
【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(一)
****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 三、传统微调范式(Traditional Fine-Tuning Paradigm) 在这个范式中,首先在大量未标记的文本数据上预…...
ChatGPT 与 AGI:人工智能的当下与未来走向全解析
在人工智能的浩瀚星空中,AGI(通用人工智能)无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”,并勾勒出其发展的五个阶段,当下我们大多处于以 ChatGPT 为…...
Redis - 1 ( 11000 字 Redis 入门级教程 )
一:服务端高并发分布式结构演进之路 1.1 常见概念 概念定义生活例子类比应用(Application)/ 系统(System)为完成一整套服务的程序或一组相互配合的程序群。为完成一项任务而组成的由一个人或一群相互配合的人构成的团…...
python opencv的sift特征检测(Scale-Invariant Feature Transform)
sift 官方文档地址:https://docs.opencv.org/4.10.0/da/df5/tutorial_py_sift_intro.html 创建SIFT实例cv2.SIFT.create()特征检测sift.detect描述子sift.compute/sift.detectAndCompute画特征cv2.drawKeypoints 原图 特征点 代码 import cv2first ./12.pngsif…...
Xilinx FPGA的Bitstream比特流加密设置方法
关于Xilinx FPGA的Bitstream比特流加密设置方法更多信息可参阅应用笔记xapp1084。 使用加密bitstream分两个步骤: 将bitstream的AES密钥存储在FPGA芯片内将使用AES密钥加密的Bitstream通过SPI Flash或JTAG加载至FPGA芯片 AES密钥可以存储在两个存储区之一&#x…...
如何通过深度学习提升大分辨率图像预测准确率?
随着科技的不断进步,图像处理在各个领域的应用日益广泛,特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中,大分辨率图像的使用已经成为了一项不可或缺的技术。然而,大分辨率图像带来了巨大的计算和存储压力,同…...
Oracle SqlPlus常用命令简介
参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...
【微服务】【Sentinel】认识Sentinel
文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…...
C++并行处理支持库 之六
C并行处理支持库 之六 std::promise构造器APIs应用实例 通过使用Futures标准库,我们可以获取异步任务返回值,捕获异步任务引发的异常。异步任务就是在独立线程中启动运行的函数。 这些值以共享状态进行通信,其中异步任务可以写入其返回值&…...
Linux-frp_0.61.1内网穿透的配置和使用
下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar:一个用于压缩和解压缩的工具。-z:表示使用 gzi…...
SpringBoot集成ECDH密钥交换
简介 对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有密钥泄露的风险,为了解决这个问题ECDH密钥交换应运而生 EC:Elliptic Curve——椭圆曲线,生成密钥的方法 DH&…...
深度学习的魔法世界
技术文章:深度学习的魔法世界 引言 嘿,今天我们要一起探索一个非常酷的魔法世界——深度学习!这是一门让计算机变得超级聪明的科学。我们会用最简单的语言来解释深度学习的基本概念,让你们也能轻松理解。 一、深度学习的六大魔…...
【超级详细】Vue3项目上传文件到七牛云的详细笔记
概述 继上一篇笔记介绍如何绑定七牛云的域名之后,这篇笔记主要介绍了如何在Vue3项目中实现文件上传至七牛云的功能。我们将使用Cropper.js来处理图像裁剪,并通过自定义组件和API调用来完成整个流程。 这里直接给出关键部分js代码,上传之前要先…...
设计模式-建造者模式
在面向对象的设计中,建造者模式(Builder Pattern) 是一种常用的设计模式,它属于创建型模式,旨在将复杂对象的创建与其表示分离。通过该模式,我们可以一步一步地构造一个复杂的对象,避免构造函数…...
springboot+vue实现SSE服务器发送事件
思路 一个基于订阅发布机制的SSE事件。客户端可以请求订阅api(携带客户端id),与服务器建立SSE链接;后续服务器需要推送消息到客户端时,再根据客户端id从已建立链接的会话中找到目标客户端,将消息推送出去。…...
IDEA | SpringBoot 项目中使用 Apifox 上传接口
目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…...
SpringBoot基础二
扩展SpringBoot 扩展SpringBoot中的SpringMVC的默认配置 SpringBoot默认已经给我们做了很多SpringMVC的配置,哪些配置? 1、视图解析器ViewResolver 2、静态资料的目录 3、默认首页index.html 4、图标名字和图标所在目录,favicon.ico 5、类型转…...
力扣第129题:求根到叶子节点数字之和 - C语言解法
力扣第129题:求根到叶子节点数字之和 - C语言解法 题目描述 给定一个二叉树,求根到叶子节点的数字之和。 每条从根到叶子的路径都代表一个数字。例如,根到叶子路径 1->2->3 代表数字 123。返回所有路径数字之和。 示例 1࿱…...
图像处理-Ch7-小波函数
个人博客!无广告观看,因为这节内容太多了,有点放不下,分了三节 文章目录 多分辨率展开(Multi-resolution Expansions)序列展开(Series Expansions)尺度函数(Scaling Function)例:哈尔尺度函数(Haar scaling func)多分…...
Unity中实现转盘抽奖效果(一)
实现思路: 旋转转盘的z轴,开始以角加速度加速到角速度最大值,结束的时候,以角加速度减速使角速度减少到0,然后转盘z轴旋转的角度就是加上每秒以角速度数值大小,为了使角度不能一直增大,对360度…...
小程序基础 —— 07 创建小程序项目
创建小程序项目 打开微信开发者工具,左侧选择小程序,点击 号即可新建项目: 在弹出的新页面,填写项目信息(后端服务选择不使用云服务,开发模式为小程序,模板选择为不使用模板)&…...
Apache Commons Pool :介绍与使用
Apache Commons Pool :介绍与使用 什么是 commons-pool2? commons-pool2 是 Apache Commons 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持,方便开发者管理资源(如数据库连接、网络连接等)复…...
(二)编译原生SDK以及配置交叉编译链
文章目录 编译原生SDKLinuxSDK的安装第一步解压LinuxSDK第二步安装依赖软件第三步解压Buildroot的dl文件 Linux系统镜像编译、生成第一步 配置编译环境第二步 编译 LinuxSDK编译上面配置好的 环境配置编译 LinuxSDK配置内核选项配置 Buildroot编译 Qt 库 编译生成 Linux 系统镜…...
YK人工智能(三)——万字长文学会torch深度学习
2.1 张量 本节主要内容: 张量的简介PyTorch如何创建张量PyTorch中张量的操作PyTorch中张量的广播机制 2.1.1 简介 几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是…...
【游戏设计原理】41 - 游戏的核心
1. 如何理解? 这条原理主要在讲述“游戏核心”这一概念的重要性及其在游戏开发中的作用。游戏的核心是指决定游戏整体玩法和体验的核心元素,它通常是游戏的主要机制、目标或动作方式。理解这一原理时,我们可以从以下几个层面来考虑ÿ…...
GraalVM:云原生时代的Java虚拟机
1. 概述 GraalVM是由Oracle公司开发的一款高性能、多语言的虚拟机平台。它不仅兼容传统的JVM字节码执行,还引入了即时编译(JIT)技术的革新,以及对多种编程语言的支持。GraalVM旨在通过提供更高效的执行环境来满足云计算环境中日益…...
goView二开低代码平台1.0
官网文档地址:GoView 说明文档 | 低代码数据可视化开发平台 简介:GoView 是一个拖拽式低代码数据可视化开发平台,通过拖拽创建数据大屏,使用Vue3框架,Ts语言和NaiveUI组件库创建的开源项目。安装步骤和地址文档里都有…...
【golang】go errors 处理错误追踪打印堆栈信息
目录 背景使用参考 背景 使用原生go语言编程时,常常需要处理错误,然而golang中没有像java/python等其他语言的try-catch方式一样的方式来处理异常事件,只能通过函数返回值接收并处理错误。 在实践中,由于牛马的不熟练或随意处理错…...
【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0
从你提供的 nslookup 输出看,DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0,这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因: 可能的原因和解决方法 本地 DNS 问题: 有可能是你的本…...
【Python系列】Python 连接 PostgreSQL 数据库并查询数据
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
深度学习利用Kaggle和Colab免费GPU资源训练
这两个平台,我先用的Colab,在修改完无数bug,成功训练完一个epoch后,超时了,查阅了官网资料,之后应该还可以用,但这个限制是动态的,你可能第二天就可以用,也没准下个月。遂…...
WebAssembly 学习笔记
WASM 概述 wasm最初是为了在浏览器获得接近原生的性能体验。 支持将其他语言实现的程序编译到wasm字节码,引入到浏览器由JS交互调用。 后又有了脱离JS的wasm运行时,可以直接运行wasm。 从而促成了wasm跨平台分发的能力。 但由于运行时的安全沙箱限制&a…...
二、github基础
Github基础 备用github.com网站一、用户界面-Overview(概览)1用户信息2 导航栏3 热门仓库4 贡献设置5贡献活动6搜索和筛选7自定义收藏8贡献统计9最近活动10其他链接 二、用户界面-Repositories(仓库)1 libusb_stm322 savedata3 Fi…...
「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计
智慧文旅运营综合平台,旨在通过集成大数据、云计算、物联网、人工智能等先进技术,为景区、旅游企业及相关管理机构提供一站式的智慧化运营服务。 智慧文旅运营综合平台不仅能够提升游客的游览体验,还能帮助景区管理者实现资源的优化配置和业务…...
《探寻真正开源的大模型:开启AI创新新纪元》
《探寻真正开源的大模型:开启AI创新新纪元》 一、开源大模型崛起:AI 发展的新曙光二、开源大模型的 “庐山真面目”三、明星开源大模型闪耀登场(一)LLaMA 3:实力强劲的开源先锋(二)Phi-3&#x…...
麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本
12月26日,2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者,共同探讨云计算产业发展方向和未来机遇,展示云计算标准化工作重要成果。 会上,云建设与应用领航计划(2024)建云用…...
C#如何操作数据库
C#如何操作数据库 前言1、查询操作2、增删改操作3、需要返回id主键的sql语句执行 前言 本文主要交代如何通过引用 using MySql.Data.MySqlClient;来操作数据库 需要导入.dll文件 例如:在本地Mysql下载目录下->Connecter NET 8.0->Assemblies->net5.0->…...
c++领域展开第八幕——类和对象(下篇 初始化列表、类型转换、static成员)超详细!!!!
文章目录 前言一、初始化列表二、类型转换三、static成员总结 前言 上篇博客我们实现了一个简单的日期类,基本的类和对象是清楚了 今天我们再来学习后面的一些类和对象的语法,慢慢的完善所学的东西 fellow me 一、初始化列表 • 之前我们实现构造函数时…...
termux-boot安卓开机自动启动应用
termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口(图中app为爱玩机工具箱) 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…...
Echart实现3D饼图示例
在可视化项目中,很多地方会遇见图表;echart是最常见的;这个示例就是用Echart, echart-gl实现3D饼图效果,复制即可用 //需要安装,再引用依赖import * as echarts from "echarts"; import echar…...
【JAVA】神经网络的基本结构和前向传播算法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
设计模式-抽象工厂模式
在设计模式中,抽象工厂模式(Abstract Factory Pattern)是一个非常常见且重要的模式,它属于创建型模式,用于提供创建一组相关或相互依赖对象的接口,而无需指定具体类。它的核心思想是将“创建对象”这一功能…...
webpack
前言 在现代前端开发的浪潮中,Webpack 已经成为一个不可或缺的构建工具。它不仅能够帮助我们打包 JavaScript 代码,还能够处理各种资源(如 CSS、图片、字体等),并提供一系列优化手段,极大地提升开发效率和…...
BLIP论文笔记
论文地址 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文思想 其实Clip就相当于只用了ITC...
Java List 集合详解:基础用法、常见实现类与高频面试题解析
正文 在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。 👉点击获取2024Java学习资料 1…...
HTML5 SSE
HTML5 SSE(Server-Sent Events,服务器发送事件)是一种允许服务器实时向浏览器推送数据的技术。它是HTML5规范的一部分,主要通过HTTP协议实现。SSE的主要特点包括: 单向通信:与WebSocket不同,SSE…...
SpringBoot篇(监控)
目录 学习前言 一、什么是监控? 二、监控的意义 1. 简介 2. 总结 3. 思考 三、可视化监控平台 1. 简介 2. 实操 2.1. 服务端开发 2.2. 客户端开发 配置多个客户端 2.3. 总结 2.4. 思考 四、监控原理 1. 简介 2. 总结 五、自定义监控指标 1. 简介…...