从信号处理角度彻底理解FFT

只想速览公式可以转到简明FFT公式

一、FFT起初用于解决的问题

分解复合信号
将复合信号视为若干正弦波与余弦波的叠加,如何得知某个正弦波/余弦波在该信号中的强度?
分解复合信号

二、即答

用特定频率的正弦波/余弦波(设其为a)乘上复合信号即可
由三角函数系的正交性,对于复合信号中频率不同于a的波,与a相乘的结果在一个周期内积分为0;而对于频率与a相同的波,乘积在一个周期上的积分结果不为0,由此可以得到a在复合信号中的强度。(类似于码分多路复用,不知道不碍事,和FFT没关系)(不用担心相位问题,相位不为0的波可以分解成余弦波和正弦波)
傅里叶变换
图中左上(记为图1),蓝的是原始信号,红的是给定频率的正弦波/余弦波a,是信号强度关于时间的函数(AKA时域)。图中左下(记为图2)是原始信号与a的乘积。图中右侧(记为图3)是不同频率的信号在原始信号中的强度,是信号强度关于频率的函数(AKA频域)。

如果某频率不存在于原始信号中,那么乘积的积分结果为0,对应于图3函数值接近于0的部分;如果某频率存在于原始信号中,那么乘积的积分结果不为0.对应于图3的峰值。

由图1中的蓝色曲线变成图3,这样的变换称为傅里叶变换(FT, Fourier Transform),也称由时域转换为频域;反之,为逆傅里叶变换(IFT, Inverse Fourier Transform),由频域转为时域。

那么把所有频率的正弦波和余弦波都和复合信号相乘再积分就好了,但这显然不现实

三、数学建模

1. 涉及到正弦波与余弦波

想到用欧拉公式,那么只用将信号乘上对应不同频率信号的指数就好

欧拉公式: e i x = c o s x + i s i n x e^{ix}=cosx+isinx eix=cosx+isinx

由于信号是关于时间的函数,并且和频率有关,因此写作 e i ω t e^{i\omega t} et,其中 ω \omega ω与频率f有关

问题变成: F ( f ) = ∫ − ∞ ∞ f ( t ) e − i ω t d t F(f)=\int_{-\infty}^{\infty} f(t) e^{-i \omega t} d t F(f)=f(t)etdt f ( t ) f(t) f(t)指原始信号。

2. 没法积分

现实中的信号往往用采样点表示,由此想到积分的极限形式,只不过这里n是有限的,即采样点的个数

问题变成: F f = ∑ n = 0 N − 1 e − i ω n f n F_{f}=\sum_{n=0}^{N-1} e^{-i \omega n} f_n Ff=n=0N1eiωnfn,其中N是采样点个数, f n f_n fn是第n个采样点的信号强度

3. 没法乘所有频率

根据奈奎斯特采样定理,为了准确地重构一个连续时间信号,其采样频率必须至少是信号中最高频率成分的两倍。也就是说,可以有效地分辨出的信号的最大频率为采样频率的一半

因而要拿去乘原始信号的频率具体为 f k = ( k / N ) f s , k = 0 , 1 , 2... N − 1 , f s f_k=(k/N)f_s,k=0,1,2...N-1,f_s fk=(k/N)fsk=0,1,2...N1fs是采样频率

举例来说,如果有8个采样点,那么就输出8个频率范围
对应于0-7倍的基频

如果严格按照奈氏定理,k最大取到2/N,个人理解k取到N-1是为了考虑信号中的最高频率成分,而且根据FFT,高频部分与低频部分信号强度的计算共轭,顺手的事
如果有更科学的理解希望不吝赐教orz

因而要拿去乘原始信号的信号可以表示为 e − i 2 π N k n , k = 0 , 1 , 2... N − 1 e^{-i \frac{2 \pi}{N} k n}, k=0,1,2...N-1 eiN2πkn,k=0,1,2...N1

问题转化为 F k = ∑ n = 0 N − 1 e − i 2 π N k n f n , k = 0 , 1 , 2... N − 1 F_k=\sum_{n=0}^{N-1} e^{-i \frac{2 \pi}{N} k n} f_n,k=0,1,2...N-1 Fk=n=0N1eiN2πknfnk=0,1,2...N1

四、简化计算——FFT

上面的公式,对于每个特定频率,都要计算N次,一共有N个频率,时间复杂度为 O ( N 2 ) O(N^2) O(N2),Cooley提出简化。

以样本点个数为8,这8个数据要乘上8个频率的正弦波与8个频率的余弦波,这里以余弦波为例,按照三角函数的周期性,这些余弦波会以一定规律重叠,因此可以省去大量运算(如样本点 X 4 X_4 X4处,只用计算两次即可)
余弦波的规律
他将样本点按照顺序分成奇偶两组
在这里插入图片描述
对于奇数点,以下是8个频率的余弦波,左侧是低频,右侧高频
在这里插入图片描述
发现每个样本点位置都有两个频率的波取值相同(对于偶数点则是互为相反数)
在这里插入图片描述
这意味着只用对低频部分做乘法并求和,高频部分可以直接复用低频结果,于是运算缩减到一半。而对于剩下的N/2个样本点,可以施以同样的方法,直到只剩一个样本点。于是时间复杂度变为 O ( N l o g 2 N ) O(Nlog_2N) O(Nlog2N)

这也是FFT最为广泛应用的Cooley-Turkey算法,具体公式可转到简明FFT公式
———————————————————————————————— ———————————————————————————————— ————————————————————————————————

参考:这个算法彻底改变了世界_哔哩哔哩

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

问界M9激光雷达解说

什么是激光雷达 激光雷达(英文:Lidar),是一种通过发射激光束来测量目标位置、速度等特征量的雷达系统。其工作原理是将激光光束照射到目标物体上,然后通过测量激光光束从发射到反射回来的时间,来计算目标物体的距离、位置、速度等参数。激光雷达通常用于测量地形、地貌、…

云轴科技海通期货 | 一云多芯信创云平台方案入选上海金融科技优秀解决方案

近日,在上海金融科技产业联盟主办的第五届上海金融科技国际论坛上,上海市地方金融监督管理局、中国人民银行上海总部共同发布了2023年度上海金融科技优秀应用场景及解决方案入选名单,其中云轴科技ZStack联合海通期货申报的“一云多芯信创云平…

【linux kernel】linux的SPI框架分析

文章目录 一、linux内核中的SPI框架二、SPI核心的初始化三、SPI核心的数据结构1、struct spi_statistics2、struct spi_delay3、struct spi_device4、struct spi_driver5、struct spi_controller6、struct spi_res7、struct spi_transfer8、struct spi_message9、struct spi_bo…

JavaScript中history对象常用方法【通俗易懂】

✨前言✨   本篇文章主要在于了解及使用JavaScript中history对象常用方法 🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍒博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 &#x1f4cd…

【052】基于Springboot、Vuey电影购票管理系统(附完整源码、数据库)

**基于Springboot、Vue、Mysql的电影购票管理系统(附源码、数据库),超级完整的项目,值得下载!! 链接在博客最底下**电影购票管理系统源码及数据库百度云链接: https://pan.baidu.com/s/1loetDV…

VC6.0 下载的dsw打不开解决

有位朋友发了个老项目给我,是十多年前的VC6.0写的,为此我下载了一个VC6。但当选择打开工作空间时,却没有反应,甚至会报错。提示如下: 根据提示内容,Google了一下,找到了这篇帖子:htt…

poi操作Excel给列设置下拉菜单(数据验证)

效果图&#xff1a; pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency> 12345Workbook实现类有三个&#xff1a;HSSFWork…

2024,「量子人工智能」比想象中来得更快

我们离量子人工智能的未来还有多远&#xff1f; 两种改变游戏规则的技术的蓄意碰撞有可能颠覆科技行业&#xff0c;并带来一个商业颠覆和创新的新时代。很少有行业能幸免于这场变革&#xff0c;它将创造全新的价值和风险。夸夸其谈&#xff1f;业界并不这么认为。未来&#xff…

从零开始 - 在Python中构建和训练生成对抗网络(GAN)模型

生成对抗网络&#xff08;GANs&#xff09;是一种强大的生成模型&#xff0c;可以合成新的逼真图像。通过完整的实现过程&#xff0c;读者将对GANs在幕后的工作原理有深刻的理解。本教程首先导入必要的库并加载将用于训练GAN的Fashion-MNIST数据集。然后&#xff0c;提供了构建…

2024年【通信安全员ABC证】复审考试及通信安全员ABC证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 通信安全员ABC证复审考试根据新通信安全员ABC证考试大纲要求&#xff0c;安全生产模拟考试一点通将通信安全员ABC证模拟考试试题进行汇编&#xff0c;组成一套通信安全员ABC证全真模拟考试试题&#xff0c;学员可通过…

优化模型:matlab二次规划

1.二次规划 1.1 二次规划的定义 若某非线性规划的目标函数为自变量 x x x的二次函数&#xff0c;且约束条件全是线性的&#xff0c;则称这种规划模型为二次规划。 1.2 二次规划的数学模型 min ⁡ 1 2 x T H x f T x \min \frac{1}{2}\boldsymbol{x}^{\boldsymbol{T}}\bolds…

【Matlab】RF随机森林时序预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88692249 一&#xff0c;概述 随机森林的基本思想是利用多个决策树对时序数据进行预测&#xff0c;其中每个决策树都使用不同的随机抽样方式选择训练数据&#xff0c;以减小过拟合的风险。 随机森林时序预测…

【计算机毕业设计】SSM实验室设备管理

项目介绍 本项目为后台管理系统&#xff0c;分为管理员、老师、学生三种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 信息管理&#xff1a;用户管理&#xff1b; 基础管理&#xff1a;实验室管理,实验室申请记录,设备管理,设备记录管理,耗材管理,耗材记录管理等功能…

【Java进阶篇】字符串常量、字符串常量池详解

字符串常量、字符串常量池详解 ✔️字符串常量池是如何实现的?✔️字符串常量从哪来的? ✔️字符串常量是什么时候进入到字符串常量池的? ✔️字符串常量池是如何实现的? 字符串常量池 (String Constant Pool) 是Java中一块特殊的内存区域&#xff0c;用于存储字符串常量。…

C语言——操作符

一、算数操作符 1、(加操作符) 用于将两个数相加&#xff0c;例&#xff1a;3 3结果为6 2、-(减操作符) 用于将两个数相减&#xff0c;例&#xff1a;3 - 3结果为0 3、*(乘操作符) 用于将两个数相乘&#xff0c;例&#xff1a;3 * 3结果为9 4、/(除操作符) 用于将两个…

HashMap使用-LeetCode做题总结 454. 四数相加 II

454. 四数相加 II 最初思路优化思路Java语法增强for的使用场景 最初思路 枚举&#xff0c;因为是要计算有多少个元组&#xff0c;所以每个元素肯定都要遍历到&#xff0c;所以干脆算出所有元组的和。 我想用四个for循环加&#xff0c;但是失败。 优化思路 参考力扣 四数相加为…

创建VLAN及VLAN间通信

任务1、任务2、任务3实验背景&#xff1a; 在一家微型企业中&#xff0c;企业的办公区域分为两个房间&#xff0c;一个小房间为老板办公室&#xff0c;一个大房间为开放办公室&#xff0c;财务部和销售部的员工共同使用这个办公空间。我们需要通过VLAN的划分&#xff0c;使老板…

聊聊我使用亚马逊鲲鹏系统注册买家号的心得

想和大家聊一下我最近用了个挺好用的工具&#xff0c;就是亚马逊鲲鹏系统。以前我总是烦恼要一个一个手动注册亚马逊账号&#xff0c;真是麻烦。但有了这个系统&#xff0c;简直是方便到不行&#xff01; 首先&#xff0c;它有个全自动批量注册账号的功能&#xff0c;你只需要提…

Python爬取今日头条热门文章

前言 今日头条文章收益是没有任何门槛&#xff0c;只要是你发布文章&#xff0c;每篇文章的阅读量超过1000就能有收益&#xff0c;阅读量越多收益越高。于是乎我就有了个大胆的想法。何不利用Python爬虫&#xff0c;爬取热门文章&#xff0c;然后完成自动化发布文章呢&#xf…

77 Python开发-批量FofaSRC提取POC验证

目录 本课知识点:学习目的:演示案例:Python开发-某漏洞POC验证批量脚本Python开发-Fofa搜索结果提取采集脚本Python开发-教育SRC报告平台信息提取脚本 涉及资源: 本课知识点: Request爬虫技术&#xff0c;lxml数据提取&#xff08;把一些可以用的或者有价值的数据进行提取和保…