【数字信号处理】DFT

news2024/12/26 0:36:39

DFT

2023年11月18日
#elecEngeneer


文章目录

  • DFT
    • 1. 离散傅里叶变换-DFT
    • 2. 离散傅里叶反变换-IDFT
    • 3. DFT的误差
    • 下链


1. 离散傅里叶变换-DFT

离散傅里叶变换(Discrete Fourier Transform,DFT),是当有 N {N} N 个信号采样点,且采样间隔为 T {T} T 时候的傅里叶变换。
实际信号不可能无限长,所以采样点只有有限个。
傅里叶变换中,离散与周期相对应。有限个离散采样点做傅里叶变换(即DTFT,离散时间傅里叶变换)得到的是连续且有周期性(周期为 2 π {2\pi} 2π )的频谱。
如果我们把已有的采样点不断重复,就得到了时域上离散且有周期性的函数,这样傅里叶变换的频谱也是离散且有周期性的。
这种将已有采样点延拓成周期信号做傅里叶变换的方法即为DFT。
在这里插入图片描述
时域中的一个周期与频域中的一个周期相对应。时域中一个周期包含所有采样点。
显然,DFT时域与频域一个周期中离散点的个数是有限的,于是可以用计算机进行运算。
设有连续信号 f ( t ) {f(t)} f(t) ,和 N {N} N 个采样点 f [ 0 ] , f [ 1 ] , f [ 2 ] , ⋯   , f [ N − 1 ] {f[0],f[1],f[2], \cdots ,f[N-1]} f[0],f[1],f[2],,f[N1] ,连续信号的傅里叶变换为:
F ( j ω ) =  FT  ∫ − ∞ ∞ f ( t ) e − j ω t d t F(j \omega ) \stackrel{\text{ FT }}{=} \int_{ -\infty }^{ \infty } f(t) e^{-j \omega t} \mathrm dt F()= FT f(t)etdt
我们认为每个采样点 f [ n ] {f[n]} f[n] 都是一个冲激函数,相加得到采样后的 f ( t ) {f(t)} f(t) ,将采样后的 f ( t ) {f(t)} f(t) 代入上式就得到了DTFT的公式,积分仅在冲激函数处存在:
F ( j ω ) =  DTFT  ∫ 0 ( N − 1 ) T f ( t ) e − j ω t d t    ,    t = n T = f [ 0 ] e − j 0 + f [ 1 ] e − j ω T + f [ 2 ] e − j ω 2 T + ⋯ + f [ N − 1 ] e − j ω ( N − 1 ) T = ∑ n = 0 N − 1 f [ n ] e − j ω n T \begin{align*} F(j \omega ) \stackrel{\text{ DTFT }}{=} & \int_{ 0 }^{ (N-1)T } f(t) e^{-j \omega t} \mathrm dt \,\,,\,\, t=nT \\ \\ =&f[0] e^{-j0}+f[1]e^{-j \omega T}+f[2]e^{-j \omega 2T}+ \cdots +f[N-1]e^{-j \omega (N-1)T} \\ \\ =& \sum_{n=0}^{ N-1} f[n]e^{-j \omega nT} \end{align*} F()= DTFT ==0(N1)Tf(t)etdt,t=nTf[0]ej0+f[1]eT+f[2]e2T++f[N1]e(N1)Tn=0N1f[n]ejωnT
DTFT的频谱是连续的,我们将时域的离散信号延拓成周期离散信号,可以得到离散且有周期性的频谱。
由于频谱有周期性,我们只观察离散频谱的第一个周期,其中离散点为:
ω = 0 , 2 π N T , 2 π N T × 2 , ⋯   , 2 π N T × k , ⋯   , 2 π N T × ( N − 1 ) \omega =0 , \frac{2\pi}{NT} , \frac{2\pi}{NT}\times 2 , \cdots , \frac{2\pi}{NT} \times k , \cdots , \frac{2\pi}{NT}\times (N-1) ω=0,NT2π,NT2π×2,,NT2π×k,,NT2π×(N1)
于是我们得到DFT的公式:
F [ k ] =  DFT  ∑ n = 0 N − 1 f [ n ] e − j 2 π N k n    ,    k = 0 , 1 , ⋯   , N − 1 F[k] \stackrel{\text{ DFT }}{=} \sum_{n=0}^{ N-1} f[n]e^{-j \frac{\large 2\pi}{\large N} kn} \,\,,\,\, k=0,1, \cdots ,N-1 F[k]= DFT n=0N1f[n]ejN2πkn,k=0,1,,N1
N − 1 {N-1} N1 个离散采样点 f [ n ] {f[n]} f[n] ,通过DFT可以得到 N − 1 {N-1} N1 个离散点构成的频谱 F [ k ] {F[k]} F[k] 。如果令
W = e − j 2 π N W=e^{-j\frac{\large 2\pi}{\large N}} W=ejN2π
则有:
F [ k ] =  DFT  ∑ n = 0 N − 1 f [ n ] W k n    ,    k = 0 , 1 , ⋯   , N − 1 F[k] \stackrel{\text{ DFT }}{=} \sum_{n=0}^{ N-1} f[n]W^{ kn} \,\,,\,\, k=0,1, \cdots ,N-1 F[k]= DFT n=0N1f[n]Wkn,k=0,1,,N1
W N n = e − j 2 n π = cos ⁡ ( − 2 n π ) + j sin ⁡ ( − 2 n π ) = 1    ,    n = 0 , 1 , ⋯   , N − 1 W^{Nn}=e^{-j2n\pi}=\cos(-2n\pi)+j\sin(-2n\pi)=1 \,\,,\,\, n=0,1, \cdots ,N-1 WNn=ej2=cos(2)+jsin(2)=1,n=0,1,,N1
DTF可以写成矩阵形式:
[ F [ 0 ] F [ 1 ] F [ 2 ] ⋮ F [ k ] ⋮ F [ N − 1 ] ] = [ 1 1 1 1 ⋯ 1 1 W W 2 W 3 ⋯ W N − 1 1 W 2 W 4 W 6 ⋯ W 2 ( N − 1 ) 1 W 3 W 6 W 9 ⋯ W 3 ( N − 1 ) ⋮ 1 W k W 2 k W 3 k ⋯ W k ( N − 1 ) ⋮ 1 W N − 1 W 2 ( N − 1 ) W 3 ( N − 1 ) ⋯ W ( N − 1 ) ( N − 1 ) ] [ f [ 0 ] f [ 1 ] f [ 2 ] ⋮ f [ n ] ⋮ f [ N − 1 ] ] \begin{bmatrix} F[0]\\ F[1]\\ F[2]\\ \vdots \\ F[k]\\ \vdots \\ F[N-1] \end{bmatrix}= \begin{bmatrix} 1&1&1&1& \cdots &1\\ 1&W&W^2&W^3& \cdots & W^{N-1}\\ 1&W^2&W^4&W^6& \cdots & W^{2(N-1)}\\ 1&W^3&W^6&W^9& \cdots & W^{3(N-1)}\\ \vdots \\ 1&W^{k}&W^{2k}&W^{3k}& \cdots & W^{k(N-1)}\\ \vdots \\ 1&W^{N-1}&W^{2(N-1)}&W^{3(N-1)}& \cdots & W^{(N-1)(N-1)}\\ \end{bmatrix} \begin{bmatrix} f[0]\\ f[1]\\ f[2]\\ \vdots \\ f[n]\\ \vdots \\ f[N-1] \end{bmatrix} F[0]F[1]F[2]F[k]F[N1] = 1111111WW2W3WkWN11W2W4W6W2kW2(N1)1W3W6W9W3kW3(N1)1WN1W2(N1)W3(N1)Wk(N1)W(N1)(N1) f[0]f[1]f[2]f[n]f[N1]

[!example]-
f ( t ) = 5 + 2 cos ⁡ ( 2 π t − 90 ° ) + 3 cos ⁡ ( 4 π t ) {f(t)=5+2\cos(2\pi t-90°)+3\cos(4\pi t)} f(t)=5+2cos(2πt90°)+3cos(4πt)

设有4个离散的采样点,采样间隔 0.25 s {0.25s} 0.25s ,采样周期正好为 1 s {1s} 1s
f [ 0 ] = 8 , f [ 1 ] = 4 , f [ 2 ] = 8 , f [ 3 ] = 0    ,    N = 4 f[0]=8,f[1]=4,f[2]=8,f[3]=0 \,\,,\,\, N=4 f[0]=8,f[1]=4,f[2]=8,f[3]=0,N=4
则DTF矩阵可以写成:
[ F [ 0 ] F [ 1 ] F [ 2 ] F [ 3 ] ] = [ 1 1 1 1 1 − j − 1 j 1 − 1 1 − 1 1 j − 1 − j ] [ f [ 0 ] f [ 1 ] f [ 2 ] f [ 3 ] ] = [ 20 − 4 j 12 4 j ] \begin{bmatrix} F[0]\\F[1]\\F[2]\\F[3] \end{bmatrix}= \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & -j & -1 & j \\ 1 & -1 & 1 & -1\\ 1 & j & -1 & -j \end{bmatrix} \begin{bmatrix} f[0]\\f[1]\\f[2]\\f[3] \end{bmatrix}= \begin{bmatrix} 20\\-4j\\12\\4j \end{bmatrix} F[0]F[1]F[2]F[3] = 11111j1j11111j1j f[0]f[1]f[2]f[3] = 204j124j
频谱取幅值,我们可以得到4个离散的频谱
∣ F [ 0 ] ∣ = 20 , ∣ F [ 1 ] ∣ = 4 , ∣ F [ 2 ] ∣ = 12 , ∣ F [ 3 ] ∣ = 4 |F[0]|=20,|F[1]|=4,|F[2]|=12,|F[3]|=4 F[0]=20,F[1]=4,F[2]=12,F[3]=4


2. 离散傅里叶反变换-IDFT

对DFT
F [ k ] =  DFT  ∑ n = 0 N − 1 f [ n ] e − j 2 π N k n    ,    k = 0 , 1 , ⋯   , N − 1 F[k] \stackrel{\text{ DFT }}{=} \sum_{n=0}^{ N-1} f[n]e^{-j \frac{\large 2\pi}{\large N} kn} \,\,,\,\, k=0,1, \cdots ,N-1 F[k]= DFT n=0N1f[n]ejN2πkn,k=0,1,,N1
其反变换(Inverse Discrete Fourier Transform)为:
f [ n ] =  IDFT  1 N ∑ k = 0 N − 1 F [ k ] e j 2 π N k n    ,    n = 0 , 1 , ⋯   , N − 1 f[n] \stackrel{\text{ IDFT }}{=} \frac{1}{N} \sum_{k=0}^{ N-1}F[k]e^{j\frac{\large 2\pi}{\large N} kn} \,\,,\,\, n=0,1, \cdots ,N-1 f[n]= IDFT N1k=0N1F[k]ejN2πkn,n=0,1,,N1
DFT的输出为复数,IDFT的输出为实数。由于

  • DTFT的幅度频谱的周期为 2 π {2\pi} 2π,且实数信号的频谱共轭对称(幅度为偶函数)
  • DTFT的连续频谱为DFT离散频谱的包络线

所以DFT在第一个周期内的频谱( [ 0 , 2 π ] {[0,2\pi]} [0,2π] 内的离散点)关于 N / 2 {N/2} N/2 共轭对称。
对于基频比较大的离散信号点组,按理说其频谱应该是有一个幅度较大的基频,还有一些幅度较小的谐波分量。但由于DFT的结果关于 N / 2 {N/2} N/2 共轭对称,会有另一个跟基频幅值一样的角频率在第一个频谱周期中出现。显然将第一个频谱周期当作DFT的结果是不合理的,对于第一个频谱周期,从 N / 2 {N/2} N/2 往后的离散点都属于“混叠频率”,只有 0 {0} 0 N / 2 {N/2} N/2 的离散点才会被考虑为合理的频谱
从IDFT的公式来看,共轭对称的离散频谱 F [ k ] {F[k]} F[k] F [ N − k ] {F[N-k]} F[Nk] 对信号点 f [ n ] {f[n]} f[n] 的贡献为:
f k [ n ] = 1 N { F [ k ] e j 2 π N k n + F [ N − k ] e j 2 π N ( N − k ) n } f_k[n]= \frac{1}{N} \lbrace F[k]e^{j\frac{\large 2\pi}{\large N} kn}+F[N-k]e^{j\frac{\large 2\pi}{\large N} (N-k)n} \rbrace fk[n]=N1{F[k]ejN2πkn+F[Nk]ejN2π(Nk)n}
由于
F [ N − k ] = ∑ k = 0 N − 1 f [ n ] e − j 2 π N ( N − k ) n F[N-k]= \sum_{k=0}^{ N-1}f[n]e^{-j\frac{\large 2\pi}{\large N} (N-k)n} F[Nk]=k=0N1f[n]ejN2π(Nk)n
e − j 2 π N ( N − k ) n = e − j 2 π n e j 2 π N k n = e j 2 π N k n e^{-j\frac{\large 2\pi}{\large N} (N-k)n}=e^{-j2\pi n}e^{j\frac{\large 2\pi}{\large N} kn}=e^{j\frac{\large 2\pi}{\large N} kn} ejN2π(Nk)n=ej2πnejN2πkn=ejN2πkn
所以 F [ N − k ] {F[N-k]} F[Nk] F [ k ] {F[k]} F[k] 的共轭转置,记为
F [ N − k ] = F ∗ [ k ] F[N-k]=F ^{*} [k] F[Nk]=F[k]
所以
f k [ n ] = 1 N { F [ k ] e j 2 π N k n + F ∗ [ k ] e j 2 π N ( N − k ) n }    ,    e j 2 π n = 1 = 2 N { ℜ [ F [ k ] ] cos ⁡ ( 2 π N k n ) − ℑ [ F [ k ] ] sin ⁡ ( 2 π N k n ) } = 2 N ∣ F [ k ] ∣ cos ⁡ ( ( 2 π N T k ) n T + arg ⁡ ( F [ k ] ) ) \begin{align*} f_k[n]=& \frac{1}{N} \lbrace F[k]e^{j\frac{\large 2\pi}{\large N} kn}+F ^{*} [k]e^{j\frac{\large 2\pi}{\large N} (N-k)n} \rbrace \,\,,\,\, e^{j2\pi n}=1 \\ \\ =& \frac{2}{N} \lbrace \Re [F[k]] \cos(\frac{2\pi}{N}kn)-\Im [ F [k]]\sin(\frac{2\pi}{N}kn) \rbrace \\ \\ =& \frac{2}{N} |F[k]| \cos \bigg( (\frac{2\pi}{NT}k)nT +\arg(F[k]) \bigg) \end{align*} fk[n]===N1{F[k]ejN2πkn+F[k]ejN2π(Nk)n},ej2πn=1N2{[F[k]]cos(N2πkn)[F[k]]sin(N2πkn)}N2F[k]cos((NT2πk)nT+arg(F[k]))
相当于采样之后的一个角频率为 2 π k / N T {2\pi k/NT} 2πk/NT ,幅值为 2 ∣ F [ k ] ∣ / N {2|F[k]|/N} 2∣F[k]∣/N 的正弦波,在连续时间下即为 k {k} k 次谐波。
DFT的有效频谱频率范围在 [ 0 , π ] {[0,\pi]} [0,π] ,即DFT输出的各次谐波频率为
ω = 0 , 2 π N T , 2 π N T × 2 , ⋯   , 2 π N T × k , ⋯   , 2 π N T × N 2 \omega =0 , \frac{2\pi}{NT} , \frac{2\pi}{NT}\times 2 , \cdots , \frac{2\pi}{NT} \times k , \cdots , \frac{2\pi}{NT}\times \frac{N}{2} ω=0,NT2π,NT2π×2,,NT2π×k,,NT2π×2N
真实的谐波频率为
ω r e a l = ω ⋅ N T p \omega _{real}= \omega \cdot \frac{N}{T_p} ωreal=ωTpN
T p {T_p} Tp 为时间序列的真实周期时间。 N {N} N 越大,DFT能输出的有效频率范围也越大。
仍以前面举出的例子为例

[!example]-

  1. F [ 0 ] = 20 {F[0]=20} F[0]=20 表示直流分量为 F [ 0 ] / N = 20 / 4 = 5 {F[0]/N=20/4=5} F[0]/N=20/4=5
  2. F [ 1 ] = − 4 j = F ∗ [ 3 ] {F[1]=-4j=F ^{*} [3]} F[1]=4j=F[3] 表示采样的基频幅值为 2 ∣ F [ 1 ] ∣ / N = 2 {2|F[1]|/N=2} 2∣F[1]∣/N=2 ,相位 − 90 ° {-90°} 90°
    2 cos ⁡ ( 2 π N T n T − 90 ° ) = 2 cos ⁡ ( π 2 n − 90 ° ) 2\cos(\frac{2\pi}{NT}nT-90°)=2\cos(\frac{\pi}{2}n-90°) 2cos(NT2πnT90°)=2cos(2πn90°)
  3. F [ 2 ] = 12 {F[2]=12} F[2]=12 表示采样的二次频谐波如下
    f 2 [ n ] = 1 N F [ 2 ] e j 2 π N 2 n = 3 cos ⁡ ( π n ) f_2[n]= \frac{1}{N}F[2]e^{j\frac{\large 2\pi}{\large N}2n}=3\cos(\pi n) f2[n]=N1F[2]ejN2π2n=3cos(πn)

在实际应用中, N {N} N 必须大于 4 {4} 4 N = 1024 {N=1024} N=1024 ,会有 1024 {1024} 1024 个离散频率点, F [ k ] {F[k]} F[k] 1024 {1024} 1024 个,但第 513 {513} 513 到第 1023 {1023} 1023 个点是 511 {511} 511 到第 1 {1} 1 个采样点的共轭转置, F [ 0 ] / 1024 {F[0]/1024} F[0]/1024 是直流分量, 2 ∣ F [ 1 ] ∣ / 1024 {2|F[1]|/1024} 2∣F[1]∣/1024 2 ∣ F [ 511 ] ∣ / 1024 {2|F[511]|/1024} 2∣F[511]∣/1024 是交流分量的幅值, 1 ∣ F [ 512 ] ∣ / 1024 {1|F[512]|/1024} 1∣F[512]∣/1024 是一个cosine-only的分量的幅值,且在最高分辨频率点 ( k = N / 2 {k=N/2} k=N/2)上。


3. DFT的误差

DFT在已有的采样点上能够多大程度近似傅里叶变换?显然DFT只是一个近似,因为它只提供了有限个频率点。但这些离散频率点有多正确?
DFT有两种误差,混叠(aliasing)与“泄漏(leakage)”。
混叠之前说过了,如果采样点过少(采样间隔太大),最高分辨频率点就会过小,会出现混叠。解决的方法是增加采样率,或者提前对信号进行滤波,去掉高次谐波。网上还说了一种方法就是补上一段值为 0 {0} 0 的信号,也相当于增加了采样点。
泄漏,或者说拖尾效应,就是在做DFT时候时域信号并不是某个周期信号的整数倍,比如如果输入信号是正弦信号的 1.25 {1.25} 1.25 个周期,那在对DFT时候实际上是将 1.25 {1.25} 1.25 个周期的正弦信号做为DFT的信号周期,这样延拓出的周期信号就有很大的不连续性,会导致频谱存在谐波。如图
请添加图片描述
解决方案是使用我们在设计FIR滤波器时遇到的窗口函数之一(例如Hamming或Hanning窗口)。这些窗函数使采样信号在两个端点处逐渐变细为零值,因此与假设的下一个周期不存在不连续性(在Hanning窗的情况下,不存在非常小的不连续性)。泄漏的现象也会减小。


下链

【数字信号处理】FFT


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

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

相关文章

1,使用IDLE开启我们第一个Python程序

前面我们已经安装好了Python,安装了Python后,他会自动帮我们安装一个IDLE。IDLE是一个Python自带的非常简洁的集成开发环境(IDE)。他是一个Python Shell,我们可以利用Python Shell与Python交互。下面我们就利用IDLE开发…

10基于matlab的悬臂梁四节点/八节点四边形单元有限元编程(平面单元)

悬臂梁,有限元编程。基于matlab的悬臂梁四节点/八节点四边形单元有限元编程(平面单元),程序有详细注解,可根据需要更改参数,包括长度、截面宽度和高度、密度、泊松比、均布力、集中力、单元数量等。需要就拍…

水の数列

这题目没有修改,所以可以考虑预处理 显然\(x\)从大到小或者从小到大,被选中的数字是单调的(尽管区间变化个数没有单调性) 所以我们可以考虑枚举\(x\) 我最开始想的是从大到小枚举\(x\),但是维护有一点复杂,因为是删除 这个时候就要…

12.12 作业

1, 源代码: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speerornew QTextToSpeech(this);idstartTimer(1000);//每隔一秒&#xf…

Linux Ubuntu 手动搭建webDav

1、安装 因为需要跟 zotero 进行交互,因此需要在服务器搭建一个webDav 以下是搭建步骤: sudo apt-get update sudo apt-get install apache2 Ubuntu 安装apache2来实现 不同于Centos 安装好了之后,运行 a2enmod dav_fs a2enmod dav 激…

040.Python面向对象_设计原则

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

Mysql的所有数据类型和它们的区别

一、数值类型 1. 普通整数数值类型 以下数据类型只能用以保存整数 整数数值类型类型存储大小(字节)有符号的取值范围(允许存在负数)无符号的取值范围TINYINT1-128 ~ 1270 ~ 255SMALLINT2- 327678 ~ 327670 ~ 65535MEDIUMINT3- 8…

性能优化 vue2/vue3 通过CDN 减少项目启动时间

其实更多可以通过压缩图片等文件大小 也会让项目运行快一些 以及尽量使用异步或者懒加载 使用CDN可以避免在项目中使用npm导入Vue的依赖项&#xff0c;从而减少项目启动时的加载时间 使用方法如下 <!-- Vue 2 --> <script src"https://cdn.jsdelivr.net/npm/vue…

Linux上使用一分钟搞定Kafka的安装

文章目录 一、前言二、安装三、验证是否安装成功 一、前言 一般我们要安装Kafka&#xff0c;还需要先安装JDK和Zookeeper&#xff0c;并进行相关配置。因为Kafka和Zookeeper都是运行在JVM之上的服务&#xff0c;所以需要先安装JDK。另外&#xff0c;Kafka依赖Zookeeper管理集群…

Python常用文件操作库详解与示例

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 文件操作是编程中常见的任务之一&#xff0c;而Python提供了丰富的文件操作库&#xff0c;使得文件的读取、写入、复制、移动等操作变得非常便捷。本文将深入介绍一些Python中常用的文件操作库&#xff0c;以及它…

CSS import 规则

导入 “navigation.css” 样式到当前的样式表&#xff1a; import “navigation.css”; /* 使用字符串 / 或者 import url(“navigation.css”); / 使用 url 地址 */ 属性定义及使用说明 CSS import 用于从其他样式表导入样式规则。 import 规则必须在 CSS 文档的头部&#xff…

NSSCTF第15页(2)

[GKCTF 2020]ez三剑客-easynode 有源代码&#xff0c;点进来看 const express require(express); const bodyParser require(body-parser);const saferEval require(safer-eval); // 2019.7/WORKER1 找到一个很棒的库const fs require(fs);const app express();app.use(b…

设计模式——单例模式(Singleton Pattern)

概述 单例模式确保一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供整个实例&#xff0c;这个类称为单例类&#xff0c;它提供全局访问的方法。单例模式是一种对象创建型模式。单例模式有三个要点&#xff1a;一是某个类只能有一个实例&#xff1b;二是它必须自行…

使用发布订阅模式处理多维度复杂融合场景

场景再现&#xff1a; 模式正确封装方法&#xff1a; class Strategy {map new Map();constructor({ defaultCbs, errorCbs }) {// 默认this.map.set("default", defaultCbs ?? []);// 错误this.map.set("error", errorCbs ?? []);}// 获取条件keyg…

linux ksm实现与代码简述

KSM 全称是 Kernel Samepage Merging&#xff0c;表示相同的物理页只映射一份拷贝。 原理 在ksm初始化时&#xff08;ksm_init&#xff09;&#xff0c;注册了一个ksm_scan_thread线程&#xff0c;这个线程的核心入口是ksm_do_scan。当对一个进程第一次通过madvice(MADV_MERGE…

2023年度盘点:AIGC、AGI、GhatGPT、人工智能大模型必读书单

2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 LLM&#xff1a;Large Language Model&#xff0c;即大语言模型&#xff0c;旨在理解和生成人类语言。LLM的特点是规模庞大&…

代码随想录算法训练营 | day49 动态规划 121.买卖股票的最佳时机,122.买卖股票的最佳时机Ⅱ

刷题 121.买卖股票的最佳时机 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设…

【详细解答】项目经VS产品经理,有什么区别?哪个更值得选择?

最近很多人咨询“项目经理跟产品经理该怎么选&#xff0c;我更适合哪个&#xff1f;”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等&#xff0c;今天就一次性说清楚项目经理跟产品经理有什么区别&#xff0c;应该怎么选择。 不想看长篇大论的&#x…

Python 递归、闭包与装饰器的编程魔法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程中&#xff0c;递归、闭包和装饰器是一些强大的工具&#xff0c;它们能够为代码增色不少&#xff0c;提高代码的可读性和灵活性。本文将深入探讨这三种编程魔法的原理和应用&#xff0c;通过丰富的示…

JavaScript实现飘窗功能

实现飘窗功能很简单 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…