Fourier transform笔记

2023-12-22 10:52
文章标签 笔记 transform fourier

本文主要是介绍Fourier transform笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.youtube.com/watch?v=spUNpyF58BY
笔记

目录

  • Fourier transform
  • laplace transform
  • FFT(快速傅里叶变换)
    • DFT(离散傅里叶变换)
      • 采样频率
      • 理想情况
      • 解决相的问题
      • 真正的DFT
    • FFT引入原因
    • FFT原理

Fourier transform

图1
对于一个声音,可以把它拆解为多个正弦波,上面是两个正弦波组成的声波,但是当情况更复杂以后
在这里插入图片描述
很难,从声波中提取出有用的信息,所以采用下面的方法
在这里插入图片描述
可以看到,将时间上的波形转换为了左下角的环形的波形,其中,与远点的距离与上面图中与时间轴相对应(白色箭头),图中,有两个频率,一个是时间上的频率,一秒内有3个beats,另一个是打包上图得到左下图的频率(图中虚线),这里是0.5c/s,也就是左下图旋转一周,时间上过了2s。不同的频率,得到的图是不同的。
在这里插入图片描述
在这里插入图片描述
把左下图中的图形当作一个整体,得到质心,绘制出下图,其中右下图中的y轴是左下图质心的x轴坐标信息。
在这里插入图片描述
在这里插入图片描述
这样就得到了频域的信息,可以看到,在3明显突起,更改幅度,依然如此
在这里插入图片描述
3正好是频率的值,这不是巧合,可以用它来分解波形
在这里插入图片描述
为什么是almost,是因为需要去掉高频信息
在这里插入图片描述
在这里插入图片描述
反向fourier transform,与正向的没有区别
在这里插入图片描述
现在已经有了x轴上的fourier变换,需要考虑y轴,既然是二维,可以用复数域来解决。
在这里插入图片描述
欧拉公式
在这里插入图片描述
在这里插入图片描述
e 2 π i f t e^{2\pi ift} e2πift
其中,f是频率,t是时间,逆时针旋转,那么顺时针旋转
e − 2 π i f t e^{-2\pi ift} e2πift
再乘以强度g(t),这就是我们需要的
在这里插入图片描述
这样就得到了fourier变换公式,但多了 1 t 2 − t 1 \frac{1}{t_2-t_1} t2t11,去掉这一部分就可以表示随着时间变化,质心与原点距离是变化的,不是一成不变的。
在这里插入图片描述

laplace transform

在这里插入图片描述
laplace变换就是对 e − t s i n t e^{-t}sint etsint的fourier变换
X ( ω ) = ∫ − ∞ ∞ x ( t ) e − i ω t d t X ( ω ) = ∫ 0 ∞ e − t s i n t e − i ω t d t X ( ω ) = 1 1 + ( 1 + i ω ) 2 X ( ω ) = 1 2 − ω 2 + 2 ω i X(\omega) = \int^{\infty}_{-\infty}x(t)e^{-i\omega t}dt \\ X(\omega) = \int^{\infty}_{0}e^{-t}sinte^{-i\omega t} dt \\ X(\omega) = \frac{1}{1+(1+i\omega)^2} \\ X(\omega) = \frac{1}{2-\omega^2 + 2\omega i} X(ω)=x(t)etdtX(ω)=0etsintetdtX(ω)=1+(1+)21X(ω)=2ω2+2ωi1
从第二个式子到第三个式子的推导如下
X ( ω ) = ∫ 0 ∞ e − t s i n t e − i ω t d t = − 1 1 + i ω ∫ 0 ∞ s i n t e − ( 1 + i ω ) t d ( − ( 1 + i ω ) t ) = − 1 1 + i ω s i n t e − ( 1 + i ω ) t ∣ 0 ∞ + − 1 1 + i ω ∫ 0 ∞ s i n t e − ( 1 + i ω ) t d t = − 1 1 + i ω ∫ 0 ∞ s i n t e − ( 1 + i ω ) t d t = − 1 ( 1 + i ω ) 2 c o s t e − ( 1 + i ω ) t ∣ 0 ∞ − − 1 ( 1 + i ω ) 2 ∫ 0 ∞ s i n t e − ( 1 + i ω ) t d t = 1 ( 1 + i ω ) 2 − − 1 ( 1 + i ω ) 2 ∫ 0 ∞ s i n t e − ( 1 + i ω ) t d t \begin{align} X(\omega) &= \int^{\infty}_{0}e^{-t}sinte^{-i\omega t}dt \nonumber \\ &= -\frac{1}{1+i\omega}\int^{\infty}_{0}sinte^{-(1+i\omega) t}d(-(1+i\omega) t) \nonumber \\ &= -\frac{1}{1+i\omega}sint e^{-(1+i\omega) t} |^{\infty}_{0}+ -\frac{1}{1+i\omega}\int^{\infty}_{0}sinte^{-(1+i\omega) t}dt \nonumber \\ &= -\frac{1}{1+i\omega}\int^{\infty}_{0}sinte^{-(1+i\omega) t}dt \nonumber \\ &= -\frac{1}{(1+i\omega)^2}cost e^{-(1+i\omega) t} |^{\infty}_{0} - -\frac{1}{(1+i\omega)^2}\int^{\infty}_{0}sinte^{-(1+i\omega) t}dt\nonumber \\ &= \frac{1}{(1+i\omega)^2}- -\frac{1}{(1+i\omega)^2}\int^{\infty}_{0}sinte^{-(1+i\omega) t}dt\nonumber \\ \end{align} X(ω)=0etsintetdt=1+10sinte(1+)td((1+)t)=1+1sinte(1+)t0+1+10sinte(1+)tdt=1+10sinte(1+)tdt=(1+)21coste(1+)t0(1+)210sinte(1+)tdt=(1+)21(1+)210sinte(1+)tdt
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
很明显, ω \omega ω控制正弦频率, α \alpha α控制指数衰减
在这里插入图片描述
证明如下:
∫ 0 ∞ x ′ ( t ) e − s t d t = x ( t ) e − s t ∣ 0 ∞ + s ∫ 0 ∞ e − s t x ( t ) d t = s x ( s ) − x ( 0 ) \begin{align} \int^{\infty}_{0}x'(t)e^{-st}dt&=x(t)e^{-st}|^{\infty}_{0} + s\int^{\infty}_{0}e^{-st}x(t)dt \nonumber \\ &= sx(s)-x(0) \nonumber \end{align} 0x(t)estdt=x(t)est0+s0estx(t)dt=sx(s)x(0)
所以laplace变换可以用来求解常微分方程(ODEs)

FFT(快速傅里叶变换)

FFT是DFT的计算方法,首先了解DFT

DFT(离散傅里叶变换)

实际上就是将积分表示为离散的加和形式
X [ k ] = ∑ n = 0 N − 1 x n ⋅ e − i 2 π N k n X[k] = \sum^{N-1}_{n=0}x_n\cdot e^{\frac{-i2\pi}{N}kn} X[k]=n=0N1xneNi2πkn
其中,k是频率,总共有N个采样节点,n代表第n个点。
表示为矩阵形式就是:
[ X 0 , X 1 , X 2 , ⋯ , X N − 1 ] ⏞ 1 × N = [ x 0 , x 1 , x 2 , ⋯ , x N − 1 ] ⏞ 1 × N [ k = 0 k = 1 k = 2 ⋯ k = N − 1 ↓ ↓ ↓ ↓ ] ⏞ N × N \overbrace{[X_0, X_1, X_2, \cdots, X_{N-1}]}^{1\times N} = \overbrace{[x_0, x_1, x_2, \cdots, x_{N-1}]}^{1\times N} \overbrace{\begin{bmatrix} k=0 & k=1 & k=2 & \cdots & k=N-1\\ \Bigg\downarrow & \Bigg\downarrow & \Bigg\downarrow & & \Bigg\downarrow \end{bmatrix}}^{N \times N} [X0,X1,X2,,XN1] 1×N=[x0,x1,x2,,xN1] 1×N k=0 k=1 k=2 k=N1 N×N
如果N很小的时候,这个矩阵乘法是容易计算的,但是现实中,对于信号常常有成百上千的采样点,那么计算量就非常大了,所以就需要FFT。
举例:有8个采样点,用不同频率的正弦函数去得到对应频率的值,每一个值是一个bin
在这里插入图片描述
下面需要理解DFT为什么这么做,以及它面临的一些问题

采样频率

首先,根据nyquist定理,要采样频率为f的信号,需要2f+1的采样点,人耳能听到的最高频声音是20khz,所以现实中采样率一般为44.1khz

理想情况

假设有一个f=2hz的余弦,那么我就希望在频域中2的位置有峰值,其他位置为0
在这里插入图片描述
那就将离散化得到的向量与不同频率下的波形去求相似性,如果相似度高,就代表该频率下有峰值,这也就是为什么DFT是有效的,意味着采样率一定等于最大频率(N=N)。
但是,通过计算不同频率的波的相似性,会发现问题, a 1 ⃗ = a 7 ⃗ \vec{a_1}=\vec{a_7} a1 =a7 , a 2 ⃗ = a 6 ⃗ \vec{a_2}=\vec{a_6} a2 =a6 等,导致右下图中很多值不为0
在这里插入图片描述
也就是A矩阵不仅不正交,还不可逆,所以不是DFT的最终版本
但是可以发现右下图的左上角这一部分是可逆的,所以每次都采样双倍,但只是采用其中的前半部分。

解决相的问题

通过之前的解决方案,无论是改变幅度,还是频率,或者是初始值,都可以实现FT的功能,但是,当改变相位的时候,频域中的值受到影响,这是不正确的。这是因为在这个变化过程中,无论是sin还是cos都会存在为0的情况,所以要将两者组合在一起。

真正的DFT

就是为sin和cos分别保存一个矩阵,合并后,就得到了我们开始的时候DFT的公式。

FFT引入原因

利用避免重复计算来提升计算速度,上图需要进行64个复数域乘法,改进后,只需要计算24个
在这里插入图片描述

FFT原理

对DFT中的部分用W表示,方便表达
在这里插入图片描述
简单来讲就是数学家利用上面提到的旋转因子W的周期性,对称性等性质进行公式化简。在算法编程中则是不断利用已经计算过的点来算新的点,即:旧点算新点。
FFT需要依赖蝶形图进行计算
X ( k ) = ∑ n = 0 N − 1 x ( n ) W N n k = ∑ n = 0 , 2 , 4 , ⋯ N − 1 x ( n ) W N n k + ∑ n = 1 , 3 , 5 ⋯ N − 1 x ( n ) W N n k → 令n=2r = ∑ r = 0 , 1 , ⋯ N 2 − 1 x ( 2 r ) W N 2 r k + ∑ r = 0 , 1 , ⋯ N 2 − 1 x ( 2 r + 1 ) W N ( 2 r + 1 ) k → x ( 2 r ) = x 1 ( r ) = ∑ r = 0 , 1 , ⋯ N 2 − 1 x 1 ( r ) W N 2 r k + ∑ r = 0 , 1 , ⋯ N 2 − 1 x 2 ( r ) W N ( 2 r + 1 ) k → W N ( 2 r + 1 ) k = W N k ∗ W N / 2 r k W N 2 r k = W N / 2 r k = ∑ r = 0 , 1 , ⋯ N 2 − 1 x 1 ( r ) W N / 2 r k + W N k ∑ r = 0 , 1 , ⋯ N 2 − 1 x 2 ( r ) W N / 2 ( r k ) = X 1 ( k ) + W N k X 2 ( k ) \begin{align} X(k) &= \sum^{N-1}_{n=0}x(n)W_N^{nk} \nonumber \\ &= \sum^{N-1}_{n=0,2,4,\cdots}x(n)W_N^{nk} + \sum^{N-1}_{n=1, 3, 5\cdots}x(n)W_N^{nk} \xrightarrow{\text{令n=2r}}\nonumber \\ &= \sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x(2r)W_N^{2rk} + \sum^{\frac{N}{2}-1}_{r=0,1, \cdots}x(2r+1)W_N^{(2r+1)k} \xrightarrow{x(2r)=x_1(r)}\nonumber \\ &= \sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x_1(r)W_N^{2rk} + \sum^{\frac{N}{2}-1}_{r=0,1, \cdots}x_2(r)W_N^{(2r+1)k} \xrightarrow[W_N^{(2r+1)k} = W_{N}^{k} * W_{N/2}^{rk}]{W_N^{2rk}=W_{N/2}^{rk}}\nonumber \\ &= \sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x_1(r)W_{N/2}^{rk} + W_N^k\sum^{\frac{N}{2}-1}_{r=0,1, \cdots}x_2(r)W_{N/2}^{(rk)} \nonumber \\ &=X_1(k)+W_N^kX_2(k) \nonumber \end{align} X(k)=n=0N1x(n)WNnk=n=0,2,4,N1x(n)WNnk+n=1,3,5N1x(n)WNnkn=2r =r=0,1,2N1x(2r)WN2rk+r=0,1,2N1x(2r+1)WN(2r+1)kx(2r)=x1(r) =r=0,1,2N1x1(r)WN2rk+r=0,1,2N1x2(r)WN(2r+1)kWN2rk=WN/2rk WN(2r+1)k=WNkWN/2rk=r=0,1,2N1x1(r)WN/2rk+WNkr=0,1,2N1x2(r)WN/2(rk)=X1(k)+WNkX2(k)
上面的过程没有减少运算量继续进行简化
∵ X ( k ) = ∑ r = 0 , 1 , ⋯ N 2 − 1 x 1 ( r ) W N / 2 r k ∴ X 1 ( k + N / 2 ) = ∑ r = 0 , 1 , ⋯ N 2 − 1 x 1 ( r ) W N / 2 r ( k + N / 2 ) = ∑ r = 0 , 1 , ⋯ N 2 − 1 x 1 ( r ) W N / 2 r k = X 1 ( k ) \because X_(k) = \sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x_1(r)W_{N/2}^{rk} \\ \therefore X_1(k+N/2) = \sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x_1(r)W_{N/2}^{r(k+N/2)}=\sum^{\frac{N}{2}-1}_{r=0,1,\cdots}x_1(r)W_{N/2}^{rk} = X_1(k) X(k)=r=0,1,2N1x1(r)WN/2rkX1(k+N/2)=r=0,1,2N1x1(r)WN/2r(k+N/2)=r=0,1,2N1x1(r)WN/2rk=X1(k)
同理, X 2 ( k + N / 2 ) = X 2 ( k ) X_2(k+N/2) = X_2(k) X2(k+N/2)=X2(k)
∵ X ( k ) = X 1 ( k ) + W N k X 2 ( k ) ∴ X ( k + N / 2 ) = X 1 ( k + N / 2 ) + W N k + N / 2 X 2 ( k + N / 2 ) → W N k + N / 2 = − W N k = X 1 ( k + N / 2 ) + W N k X 2 ( k + N / 2 ) = X 1 ( k ) − W N k X 2 ( k ) \because X(k)=X_1(k)+W_N^kX_2(k) \\ \therefore \begin{align} X(k+N/2)&=X_1(k+N/2)+W_N^{k+N/2}X_2(k+N/2) \xrightarrow{W_N^{k+N/2}=-W_N^k} \nonumber \\ &= X_1(k+N/2)+W_N^{k}X_2(k+N/2) = X_1(k)-W_N^kX_2(k) \nonumber \end{align} X(k)=X1(k)+WNkX2(k)X(k+N/2)=X1(k+N/2)+WNk+N/2X2(k+N/2)WNk+N/2=WNk =X1(k+N/2)+WNkX2(k+N/2)=X1(k)WNkX2(k)
综上推导得到:
X ( k ) = X 1 ( k ) + W N k X 2 ( k ) X ( k + N / 2 ) = X 1 ( k ) − W N k X 2 ( k ) X(k)=X_1(k)+W_N^kX_2(k) \\ X(k+N/2) = X_1(k)-W_N^kX_2(k) X(k)=X1(k)+WNkX2(k)X(k+N/2)=X1(k)WNkX2(k)
这里都是用X1和X2来计算,所以缩减了计算量
继续推导
在这里插入图片描述
在这里插入图片描述
最后一步
在这里插入图片描述
在这里插入图片描述

这篇关于Fourier transform笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523685

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus