快速傅立叶变换FFT学习笔记

news2024/12/23 16:42:17

什么是FFT?

FFT(Fast Fourier Transformation) 是离散傅氏变换(DFT)的快速算法,即快速傅氏变换。FFT使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。FFT可以将多项式乘法的复杂度从 O ( n 2 ) O(n^2) O(n2)降到 O ( n l o g n ) O(nlogn) O(nlogn)

下图是FFT的整体计算流程,FFT变换的复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),FFT域上的pointwise乘法的复杂度为 O ( n ) O(n) O(n),逆FFT变换的复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),总体复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

在这里插入图片描述

多项式的表示方法

方法1:系数表示

从多项式函数的定义,将所有系数视为系数向量,而由全部系数组成的向量 a a a叫做该多项式的系数表达:

f ( x ) = ∑ i = 0 n − 1 a i x i f(x)=\sum_{i=0}^{n-1}a_ix^i f(x)=i=0n1aixi

a = ( a 0 , a 2 , … , a n − 1 ) a=(a_0 ,a_2, \dots, a_{n-1}) a=(a0,a2,,an1)

举个简单的例子: f ( x ) = 5 x 0 + 6 x 1 + 7 x 2 f(x)=5x^0+6x^1+7x^2 f(x)=5x0+6x1+7x2的系数表示为 { 5 , 6 , 7 } \{5, 6, 7\} {5,6,7}。反之, { 5 , 6 , 7 } \{5, 6, 7\} {5,6,7}的系数编码结果为 f ( x ) = 5 x 0 + 6 x 1 + 7 x 2 f(x)=5x^0+6x^1+7x^2 f(x)=5x0+6x1+7x2

系数表示特点是对多项式加法友好,时间复杂度是 O ( n ) O(n) O(n)。但是对多项式乘法不友好,采用多项式逐项相乘,时间复杂度仍为 O ( n 2 ) O(n^2) O(n2)
注:系数表示的乘法表示卷积操作。

方法2:点值表示

任意选取 n n n个不同的自变量 x x x带入多项式函数 f ( x ) f(x) f(x)进行求值运算,将得到 n n n个不同的结果。于是,多项式的点值表达就是由这 n n n个数值点组成的集合:

{ ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , … , ( x n − 1 , f ( x n − 1 ) ) } \{(x_0, f(x_0)), (x_1, f(x_1)), \dots, (x_{n-1}, f(x_{n-1}))\} {(x0,f(x0)),(x1,f(x1)),,(xn1,f(xn1))}

举个简单的例子: f ( x ) = 5 x 0 + 6 x 1 + 7 x 2 f(x)=5x^0+6x^1+7x^2 f(x)=5x0+6x1+7x2的点值表示为 { ( 0 , f ( 0 ) ) , ( 1 , f ( 1 ) ) , ( 2 , f ( 2 ) ) } \{(0, f(0)), (1, f(1)), (2, f(2))\} {(0,f(0)),(1,f(1)),(2,f(2))}。反之, { 5 , 6 , 7 } \{5, 6, 7\} {5,6,7}的点值编码应该满足 f ( 0 ) = 5 , f ( 1 ) = 6 , f ( 2 ) = 7 f(0)=5, f(1)=6, f(2)=7 f(0)=5,f(1)=6,f(2)=7

点值表示的特点是对多项式乘法友好,时间复杂度是 O ( n ) O(n) O(n)【因为可以做element-wise乘法(EWMM)】,但是多项式加法不友好。

复数

复数的定义:设 a , b a, b a,b为实数,则 z = a + b i z = a + bi z=a+bi的数称为复数,其中 a a a称为实部, b b b称为虚部。
复数的模为: ∣ z ∣ = a 2 + b 2 |z|=\sqrt{a^2+b^2} z=a2+b2 。一个复数的共轭复数为: z ‾ = a − b i \overline{z}=a-bi z=abi,即改变虚部的符号。

单位复数根
对于任意一个复数 ω \omega ω,其 n n n次幂的结果为1,就称复数 ω \omega ω n n n次单位复数根,即
ω n = 1 \omega^n=1 ωn=1

可以看到, n n n次单位复数根有 n n n个,其几何意义为: n n n个单位复数根均匀地分布在以复平面原点为圆心的单位圆上。

在这里插入图片描述

在几何意义的单位圆中,我们将圆周角 2 π 2\pi 2π均分成 n n n份,则 2 π n \frac{2\pi}{n} n2π叫做单位根的幅角。
由欧拉公式:
e i 2 π n = c o s 2 π n + i s i n 2 π n e^{i\frac{2\pi}{n}} = cos \frac{2\pi}{n} + i sin \frac{2\pi}{n} ein2π=cosn2π+isinn2π

定义 ω n \omega_n ωn表示一个 n n n次单位根:
ω n = e i 2 π n \omega_n = e^{i\frac{2\pi}{n}} ωn=ein2π

ω n \omega_n ωn也是主 n n n次单位根,其余 w n 1 、 w n 2 w_{n}^{1}、w_{n}^{2} wn1wn2等叫做 n n n次单位根的幂次,记为:
ω n k = e i 2 k π n , k = 0 , 1 , … , n − 1 \omega_{n}^{k} = e^{i\frac{2k\pi}{n}}, k=0,1,\dots,n-1 ωnk=ein2,k=0,1,,n1

于是,很容易知道:
ω n 0 = ω n n = 1 , ω n n 2 = − 1 \omega_n^0=\omega_n^n=1, \omega_n^{\frac{n}{2}}=-1 ωn0=ωnn=1,ωn2n=1

单位复数根的性质1:消去引理
ω d n d k = e i 2 d k π d n = e i 2 k π n = w n k \omega_{dn}^{dk} = e^{i\frac{2dk\pi}{dn}}=e^{i\frac{2k\pi}{n}}=w_{n}^{k} ωdndk=eidn2d=ein2=wnk

单位复数根的性质1:折半引理
ω n k + n 2 = ω n k ω n n 2 = − ω n k \omega_{n}^{k+\frac{n}{2}} = \omega_{n}^{k}\omega_{n}^{\frac{n}{2}}=-\omega_{n}^{k} ωnk+2n=ωnkωn2n=ωnk
于是也可以得到:
( ω n k + n 2 ) 2 = ( − ω n k ) 2 = ( ω n k ) 2 = ω n 2 k = ω n 2 k (\omega_{n}^{k+\frac{n}{2}})^2=(-\omega_{n}^{k})^2=(\omega_{n}^{k})^2=\omega_{n}^{2k}=\omega_{\frac{n}{2}}^{k} (ωnk+2n)2=(ωnk)2=(ωnk)2=ωn2k=ω2nk
好处是将 n n n降到了原来的一半。

DFT:离散傅立叶变换

假设多项式:
A ( x ) = ∑ i = 0 n − 1 a i x i A(x)=\sum_{i=0}^{n-1}a_ix^i A(x)=i=0n1aixi

n n n次单位根的幂次 x = ω n k x=\omega_n^k x=ωnk分别代入多项式:
y k = A ( ω n k ) = ∑ i = 0 n − 1 a i ω n k i , k = 0 , 1 , … , n − 1 y_k = A(\omega_n^k)=\sum_{i=0}^{n-1}a_i\omega_n^{ki}, k=0,1,\dots,n-1 yk=A(ωnk)=i=0n1aiωnki,k=0,1,,n1

y = ( y 0 , y 1 , … , y n − 1 ) y=(y_0, y_1, \dots, y_{n-1}) y=(y0,y1,,yn1)是系数向量 a = ( a 0 , a 1 , … , a n − 1 ) a=(a_0, a_1,\dots,a_{n-1}) a=(a0,a1,,an1)的离散傅立叶变换,即DFT。

IDFT:离散傅立叶逆变换
a j = 1 n ∑ k = 0 n − 1 y k ω n − k i a_j = \frac{1}{n}\sum_{k=0}^{n-1}y_k\omega_n^{-ki} aj=n1k=0n1ykωnki

DFT对应多项式求值
IDFT对应插值,求多项式系数

值得注意的是,DFT的复杂度仍然是 O ( n 2 ) O(n^2) O(n2)

FFT和蝶形计算

FFT的原理是将多项式分解成奇偶两部分,并用分治的思想依次计算下去。
A ( x ) = a 0 + a 1 x 1 + ⋯ + a n − 1 x n − 1 A(x)=a_0+a_1x^1+\dots+a_{n-1}x^{n-1} A(x)=a0+a1x1++an1xn1

A 0 ( x ) = a 0 + a 2 x 1 + ⋯ + a n − 2 x n − 2 2 A_0(x)=a_0+a_2x^1+\dots+a_{n-2}x^{\frac{n-2}{2}} A0(x)=a0+a2x1++an2x2n2

A 1 ( x ) = a 1 + a 3 x 1 + ⋯ + a n − 1 x n − 2 2 A_1(x)=a_1+a_3x^1+\dots+a_{n-1}x^{\frac{n-2}{2}} A1(x)=a1+a3x1++an1x2n2

A ( x ) = A 0 ( x 2 ) + x A 1 ( x 2 ) A(x)=A_0(x^2)+xA_1(x^2) A(x)=A0(x2)+xA1(x2)

证明:
A ( x ) = A 0 ( x 2 ) + x A 1 ( x 2 ) = a 0 + a 2 x 2 + a 4 x 4 + ⋯ + a n − 2 x n − 2 + a 1 x 1 + a 3 x 3 + a 5 x 5 + ⋯ + a n − 1 x n − 1 A(x)=A_0(x^2)+xA_1(x^2)=a_0+a_2x^2+a_4x^4+\dots+a_{n-2}x^{n-2}+\\a_1x^1+a_3x^3+a_5x^5+\dots+a_{n-1}x^{n-1} A(x)=A0(x2)+xA1(x2)=a0+a2x2+a4x4++an2xn2+a1x1+a3x3+a5x5++an1xn1
得证!

x = ω n k x=\omega_n^k x=ωnk代入 A ( x ) = A 0 ( x 2 ) + x A 1 ( x 2 ) A(x)=A_0(x^2)+xA_1(x^2) A(x)=A0(x2)+xA1(x2)中,得到:
A ( ω n k ) = A 0 ( ω n 2 k ) + ω n k A 1 ( ω n 2 k ) = A 0 ( ω n 2 k ) + ω n k A 1 ( ω n 2 k ) A(\omega_n^k)=A_0(\omega_n^{2k})+\omega_n^kA_1(\omega_n^{2k})=A_0(\omega_{\frac{n}{2}}^{k})+\omega_n^kA_1(\omega_{\frac{n}{2}}^{k}) A(ωnk)=A0(ωn2k)+ωnkA1(ωn2k)=A0(ω2nk)+ωnkA1(ω2nk)

x = ω n k + n 2 x=\omega_n^{k+\frac{n}{2}} x=ωnk+2n代入 A ( x ) = A 0 ( x 2 ) + x A 1 ( x 2 ) A(x)=A_0(x^2)+xA_1(x^2) A(x)=A0(x2)+xA1(x2)中,得到:
A ( ω n k + n 2 ) = A 0 ( ω n 2 k + n ) + ω n k + n 2 A 1 ( ω n 2 k + n ) = A 0 ( ω n 2 k ) − ω n k A 1 ( w n 2 k ) = A 0 ( ω n 2 k ) − ω n k A 1 ( w n 2 k ) A(\omega_n^{k+\frac{n}{2}})=A_0(\omega_n^{2k+n}) + \omega_n^{k+\frac{n}{2}}A_1(\omega_n^{2k+n})=A_0(\omega_n^{2k})-\omega_n^kA_1(w_n^{2k})=A_0(\omega_{\frac{n}{2}}^{k})-\omega_n^kA_1(w_{\frac{n}{2}}^{k}) A(ωnk+2n)=A0(ωn2k+n)+ωnk+2nA1(ωn2k+n)=A0(ωn2k)ωnkA1(wn2k)=A0(ω2nk)ωnkA1(w2nk)

我们发现, A ( ω n k ) A(\omega_n^k) A(ωnk) A ( ω n k + n 2 ) A(\omega_n^{k+\frac{n}{2}}) A(ωnk+2n)的第一项完全相同,仅第二项为相反数。因此,如果知道 A 0 ( ω n 2 k ) A_0(\omega^k_{\frac{n}{2}}) A0(ω2nk) A 1 ( ω n 2 k ) A_1(\omega^k_{\frac{n}{2}}) A1(ω2nk)的值,我们就可以同时知道 A ( ω n k ) A(\omega^k_n) A(ωnk) A ( ω n k + n 2 ) A(\omega^{k+{n\over 2}}_n) A(ωnk+2n),所以可以用分治思想计算FFT,原问题的规模缩减了一半。

总结一下,FFT的计算如下:
A ( ω n k ) = A 0 ( ω n 2 k ) + ω n k A 1 ( ω n 2 k ) A(\omega_n^k)=A_0(\omega_{\frac{n}{2}}^{k})+\omega_n^kA_1(\omega_{\frac{n}{2}}^{k}) A(ωnk)=A0(ω2nk)+ωnkA1(ω2nk)

A ( ω n k + n 2 ) = A 0 ( ω n 2 k ) − ω n k A 1 ( w n 2 k ) A(\omega_n^{k+\frac{n}{2}})=A_0(\omega_{\frac{n}{2}}^{k})-\omega_n^kA_1(w_{\frac{n}{2}}^{k}) A(ωnk+2n)=A0(ω2nk)ωnkA1(w2nk)

可以通过这样的方式将一个多项式一直分解下去,如下图是对16点输入的分解:

在这里插入图片描述

在计算FFT时,需要成对的点做蝶形运算,这里成对的点就是0和8、4和12等,这个分组的过程可以用bit reverse实现。

8点FFT计算图示:

在这里插入图片描述

每一对数的蝶形运算:

在这里插入图片描述

Bit Reverse确定蝶形运算对

从下面这个8点FFT可以很清楚地看到,FFT蝶形运算时打乱了输入的顺序(倒位序),倒位序是由bit reverse操作得到的。

在这里插入图片描述

FFT的输入为倒位序,输出为自然顺序。

在这里插入图片描述

Bit reverse的原理其实并不复杂,从上文中16点输入的奇偶分解那个图就很容易看出来。

RFFT和FFT

RFFT中的R是实数的意思,RFFT是FFT的特殊版本,为实数输入设计。RFFT利用了实数的傅立叶变换为共轭对称这个事实,因此RFFT只需要计算一半的傅立叶变换系数。所以RFFT效率明显高于FFT,并且也只有一半的存储开销。

在这里插入图片描述

因此,当我们的输入为实数时(比如图像卷积任务),我们就可以利用实数的傅立叶变换为共轭对称这个特性,用RFFT替换FFT来提高计算效率。

实数的FFT为什么是共轭对称?

我们直接看DFT的计算公式(把上文中的索引i改成了t,方便和复数i区分开):
A ( ω n k ) = ∑ t = 0 n − 1 a t ω n k t A(\omega_n^k)=\sum_{t=0}^{n-1}a_t\omega_n^{kt} A(ωnk)=t=0n1atωnkt

其中,
ω n k = e i 2 k π n \omega_{n}^{k} = e^{i\frac{2k\pi}{n}} ωnk=ein2

于是,代入得到:
A ( ω n k ) = ∑ t = 0 n − 1 a t e i 2 k t π n      ( 1 ) A(\omega_n^k)=\sum_{t=0}^{n-1}a_t e^{i\frac{2kt\pi}{n}}~~~~(1) A(ωnk)=t=0n1atein2ktπ    (1)

同时,我们可以计算出与上面点对称的点:
ω n n − k = e i 2 ( n − k ) π n \omega_n^{n-k}=e^{i\frac{2(n-k)\pi}{n}} ωnnk=ein2(nk)π

同样,代入得到:
A ( ω n n − k ) = ∑ t = 0 n − 1 a t ω n ( n − k ) t A(\omega_n^{n-k})=\sum_{t=0}^{n-1}a_t \omega_n^{(n-k)t} A(ωnnk)=t=0n1atωn(nk)t

其中,
ω n ( n − k ) t = ω n n t − k t = ω n n t / ω n k t = ω n − k t \omega_n^{(n-k)t}=\omega_n^{nt-kt}=\omega_n^{nt}/\omega_n^{kt}=\omega_n^{-kt} ωn(nk)t=ωnntkt=ωnnt/ωnkt=ωnkt

于是,
A ( ω n n − k ) = ∑ t = 0 n − 1 a t ω n − k t = ∑ t = 0 n − 1 a t e − i 2 k t π n      ( 2 ) A(\omega_n^{n-k})=\sum_{t=0}^{n-1}a_t \omega_n^{-kt}=\sum_{t=0}^{n-1}a_t e^{-i\frac{2kt\pi}{n}}~~~~(2) A(ωnnk)=t=0n1atωnkt=t=0n1atein2ktπ    (2)

容易发现,式(1)和(2)只是在 e e e的指数上为相反数关系!
根据欧拉公式,对于(1):
e i 2 k t π n = c o s 2 k t π n + i s i n 2 k t π n e^{i\frac{2kt\pi}{n}}=cos\frac{2kt\pi}{n}+isin\frac{2kt\pi}{n} ein2ktπ=cosn2ktπ+isinn2ktπ

对于(2):
e − i 2 k t π n = c o s 2 k t π n − i s i n 2 k t π n e^{-i\frac{2kt\pi}{n}}=cos\frac{2kt\pi}{n}-isin\frac{2kt\pi}{n} ein2ktπ=cosn2ktπisinn2ktπ

证毕!

一大堆参考文献

  • 零知识证明 - 理解FFT的蝶形运算
  • 十分简明易懂的FFT(快速傅里叶变换)
  • 大数乘法—多项式与快速傅里叶变换
  • 快速傅立叶变换(Fast Fourier Transform)
  • fft海面模拟(二)
  • 彻底搞懂快速傅里叶变换FFT–旋转因子
  • 快速傅里叶变换(FFT)之一:Radix-2 DIT FFT
  • Rfft 和 FFT 有什么区别?
  • 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称

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

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

相关文章

MySQL索引的使用,大大提升你代码的效率

目录 🚀索引使用 🚀最左前缀法则 🚀范围查询 🚀索引失效情况 隐式类型转换是什么? 隐式类型转换的影响 举例说明 无隐式类型转换的情况 存在隐式类型转换的情况 总结 🚀模糊查询 🚀or…

经典面试题-死锁

目录 1.什么是死锁? 2.形成死锁的四个必要条件 3.死锁的三种情况 第一种情况: 举例: 举例: 第二种情况:两个线程 两把锁 举例: 第三种情况:N个线程 M把锁 哲学家进餐问题 1.什么是死锁&…

Docker基础语法

目录 一.docker安装 二.docker基础名词 三.docker基础命令 四.命令别名 五.数据卷 六.挂载本地目录或文件 七.Docker镜像 八.网络 一.docker安装 1.安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装 docker yum源 yum-config-manag…

Git的安装与配置

目录 前言 Linux-centos:下安装 Linux_ubuntu下安装 创建Git本地仓库 配置用户名和Email 前言 Git是一种版本控制器,能够让我们了解一个文件的历史,以及它的发展过程。通俗的将就是可以记录一个工程的每一次改动和版本迭代的一个管理系统…

书法AI全自动切字+识别算法2.0版发布,草书篆书行书楷书识别准确率超过90%,覆盖书法单字30万张

我们开发的业界识别最准覆盖作品最全的书法AI小程序上线了 书法AI全自动切字识别算法2.0版发布,草书篆书行书楷书识别准确率超过90%,准确率甩百度OCR一条街,覆盖书法单字30万张,遥遥领先同行 我们还可为客户提供书法AI全自动切字a…

Tensorflow2.0笔记 - tensor的合并和分割

主要记录concat,stack,unstack和split相关操作的作用 import tensorflow as tf import numpy as nptf.__version__#concat对某个维度进行连接 #假设下面的tensor0和tensor1分别表示4个班级35名同学的8门成绩和两个班级35个同学8门成绩 tensor0 tf.ones([4,35,8]) tensor1 tf…

C#,入门教程(30)——扎好程序的笼子,错误处理 try catch

上一篇: C#,入门教程(29)——修饰词静态(static)的用法详解https://blog.csdn.net/beijinghorn/article/details/124683349 程序员语录:凡程序必有错,凡有错未必改! 程序出错的原因千千万&…

基于PSO-BP神经网络的风电功率预测(MATLAB)

作品简介 :关注公众号“电击小子程高兴的MATLAB小屋”获取优惠 主要内容 该模型将粒子群算法与BP神经网络结合用于BP神经网络的训练,即优化BP网络中的连接权值和各项阈值,然后利用神经网络分布式并行处理优势、自适应学习能力以及较好的…

坚持刷题 | 二叉树的最大深度

文章目录 题目考察点代码实现实现总结扩展用迭代的方式实现二叉树最大深度可能的扩展问题 坚持刷题,老年痴呆追不上我,今天刷:二叉树的最大深度 题目 104.二叉树的最大深度 考察点 二叉树的基本实现: 能够定义二叉树节点&…

Apifox接口测试教程(一)接口测试的原理与工具

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述,然后着重地对移动端的 GPU 进行了分析,随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 🎬个人简介…

git本地分支的合并/切换分支时遇到的问题

目录 第一章、本地分支的切换测试1.1)切换之前的master分支下文件内容1.2)切换到develop分支后修改文件1.3)切回master分支出现报错: 第二章、解决方式2.1)方式1:commit提交修改2.2)方式2&#…

柔性数组和C语言内存划分

柔性数组和C语言内存划分 1. 柔性数组1.1 柔性数组的特点:1.2 柔性数组的使用1.3 柔性数组的优势 2. 总结C/C中程序内存区域划分 1. 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中&#xff…

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示,在已存在.gitignore文件且已经提交过的Git管理的项目中,其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了,可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…

vue+elementUI el-select 中 没有加clearable出现一个或者多个×清除图标问题

1、现象:下方截图多清除图标了 2、在全局common.scss文件中加一个下方的全局样式noClear 3、在多清除图标的组件上层div加noClear样式 4、清除图标去除成功

iOS应用程序混淆加固原理及逆向工具介绍

概要 本文将介绍iOS应用程序混淆加固的原理和常见的加固类型,以及介绍一些常用的逆向工具。同时还会介绍一种代码虚拟化技术,用于进一步保护应用程序不被逆向分析。 引言 移动应用程序开发面临着越来越严峻的安全挑战,特别是在越狱设备上…

k8s1.27.2版本二进制高可用集群部署

文章目录 环境软件版本服务器系统初始化设置关于etcd签名证书etcd集群部署负载均衡器组件安装设置关于k8s自签证书自签CAkube-apiserver 自签证书kube-controller-manager自签证书kube-scheduler自签证书kube-proxy 自签证书admin 自签证书 控制平面节点组件部署**部署kube-api…

Uni-App三甲医院、医保定点三甲医院在线预约挂号系统源码

医院在线预约挂号系统是一种方便患者预约挂号的系统,患者可以通过该系统进行预约挂号,省去了到医院现场排队等待的时间,提高了就诊效率。随着医院信息化水平的不断发展,医院在线预约挂号管理系统已成为医院管理中不可或缺的一部分…

如何在Linux部署JumpServer堡垒机并实现远程访问本地服务

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…

KAGGLE · GETTING STARTED CODE COMPETITION 图像风格迁移 示例代码阅读

本博文阅读的代码来自于I’m Something of a Painter Myself | Kaggle倾情推荐: Monet CycleGAN Tutorial | Kaggle 数据集说明 I’m Something of a Painter Myself | Kaggle Files monet_jpg - 300 Monet paintings sized 256x256 in JPEG formatmonet_tfrec -…