Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【STM32F407的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)

【STM32F407的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)

作者头像
Simon223
发布于 2020-05-27 01:12:50
发布于 2020-05-27 01:12:50
1.1K0
举报

第25章       DSP变换运算-快速傅里叶变换原理(FFT)

在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理。因此导致DFT被发现以来,在很长的一段时间内都不能被应用到实际工程项目中,直到一种快速的离散傅立叶计算方法——FFT被发现,离散是傅立叶变换才在实际的工程中得到广泛应用。需要强调的是,FFT并不是一种新的频域特征获取方式,而是DFT的一种快速实现算法。

特别声明:FFT原理的讲解来自网络和书籍。

25.1 FFT由来

25.3 直接计算DFT的问题及改进路径

25.3 改善DFT运算效率的基本途径

25.4 按时间抽选的基2-FFT算法

25.5 按频率抽选的基2-FFT算法

25.6 总结

25.1 初学者重要提示

1、  为大家推荐西电的国家级精品课程信号与系统,含课堂视频,书籍和课堂PPT

http://www.armbbs.cn/forum.php?mod=viewthread&tid=94886

2、 非常好的DSP基础知识普及书籍:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=97312

25.2 FFT的由来

离散傅里叶变换(Discrete Fourier Transform,DFT)是数字信号处理最重要的基石之一,也是对信号进行分析处理时,最常用的工具之一。在200多年前,法国数学家、物理学家傅里叶提出以他的名字命名的傅里叶级数之后,用DFT这个工具来分析信号就已经被人们所知。

历史上最伟大的数学家之一,欧拉是第一个使用“函数”一词来描述包含各种参数的表达式,例如:y = f(x)。他是把微积分应用于物理学的先驱者之一,给出了一个用实变量函数表示傅立叶系数的方程,用三角级数来描述离散声音在媒介中传播,发现某些函数可以通过余弦函数之和来表达。 但在很长时间内,这种分析方法并没有引起更多的重视,最主要的原因在于这种方法运算量比较大。直到1965年,Cooley和Tukey在《计算机科学 》发表著名的《机器计算傅立叶级数的一种算法》论文,FFT才开始大规模应用。

那个年代,有个肯尼迪总统科学咨询委员会,其中有项研究主题是对苏联核测试进行检测,Tukey就是其中一员。美国/苏联核测试提案的批准,主要取决于不实地访问核测试设施而做出检测方法。其中一个想法是,分析离海岸的地震情况,这种计算需要快速算法来计算DFT。其它应用是国家安全,如用声学探测远距离的核潜艇。所以在军事上,迫切需要一种快速的傅立叶变换算法,这也促进了FFT的正式提出。

FFT充分利用了DFT运算中的对称性和周期性,从而将DFT运算量从N2减少到 。当N比较小时,FFT优势并不明显。但当N大于32开始,点数越大,FFT对运算量的改善越明显。比如当N为1024时,FFT的运算效率比DFT提高了100倍。在库利和图基提出的FFT算法中,其基本原理是先将一个N点时域序列的DFT分解为N个1点序列的DFT,然后将这样计算出来的N个1点序列DFT的结果进行组合,得到最初的N点时域序列的DFT值。实际上,这种基本的思想很早就由德国伟大的数学家高斯提出过,在某种情况下,天文学计算(也是现在FFT应用的领域之一)与等距观察的有限集中的行星轨道的内插值有关。由于当时计算都是靠手工,所以产生一种快速算法的迫切需要。 而且,更少的计算量同时也代表着错误的机会更少,正确性更高。高斯发现,一个富氏级数有宽度N=N1*N2,可以分成几个部分。计算N2子样本DFT的N1长度和N1子样本DFT的N2长度。只是由于当时尚欠东风——计算机还没发明。在20世纪60年代,伴随着计算机的发展和成熟,库利和图基的成果掀起了数字信号处理的革命,因而FFT发明者的桂冠才落在他们头上。

之后,桑德(G.Sand)-图基等快速算法相继出现,几经改进,很快形成了一套高效运算方法,这就是现在的快速傅立叶变换(FFT)。这种算法使DFT的运算效率提高1到2个数量级,为数字信号处理技术应用于各种信号的实时处理创造了良好的条件,大大推进了数学信号处理技术。1984年,法国的杜哈梅(P.Dohamel)和霍尔曼(H.Hollamann)提出的分裂基块快速算法,使运算效率进一步提高。

库利和图基的FFT算法的最基本运算为蝶形运算,每个蝶形运算包括两个输入点,因而也称为基-2算法。在这之后,又有一些新的算法,进一步提高了FFT的运算效率,比如基-4算法,分裂基算法等。这些新算法对FFT运算效率的提高一般在50%以内,远远不如FFT对DFT运算的提高幅度。从这个意义上说,FFT算法是里程碑式的。可以说,正是计算机技术的发展和FFT的出现,才使得数字信号处理迎来了一个崭新的时代。除了运算效率的大幅度提高外,FFT还大大降低了DFT运算带来的累计量化误差,这点常为人们所忽略。

25.3 直接计算DFT的问题及改进路径

25.3.1 问题的提出

设有限长序列x(n),非零值长度为N,若对x(n)进行一次DFT运行,共需要多大的运算工作量。

25.3.2 DFT的运算量

DFT和IDFT的变换式:

下面以DFT为例说明计算量:

计算机运算时(编程实现):

由上面的结算可得DFT的计算量如下:

复数乘法的计算量:(a+jb)(c+jd)=(ab-bd)+j(bc+ad)

下面通过两个实例来说明计算量:

例一:计算一个N点DFT,共需 次复乘。以做一次复乘1 计算,若N=4096,所需时间为

例二:石油勘探,有24个通道的记录,每通道波形记录长度为5秒,若每秒抽样500点/秒。

  1. 每道总抽样点数:500*5 = 2500点。
  2. 24道总抽样点数:24*2500=6万点。

由于计算量大,且要求相当大的内存,难以实现实时处理,限制了DFT的应用,人们一直在寻求一种能提高DFT运算速度的方法。

FFT便是Cooley和Tukey在1995年提出来的快速算法,它可以使运算速度提高几百倍,从而使数字信号处理成为一个新兴的应用学科。

25.4 改善DFT运算效率的基本途径

1、利用DFT运算的系数 的固有对称性和周期性,改善DFT的运算效率。

1)对称性

2)周期性

3)可约性

2、将长序列DFT利用对称性和周期性分解为短序列DFT的思路

因为DFT的运算量与N2成正比,如果一个大点数N的DFT能分解为若干小点数DFT的组合,则显然可以达到减少运算工作量的效果。

FFT算法的基本思想:

  • 利用DFT系数的特性,合并DFT运算中的某些项。
  • 把长序列DFTà短序列DFT,从而减少运算量。

FFT算法分类:

时间抽选法

DIT: Decimation-In-Time

频率抽选法

DIF: Decimation-In-Frequency

25.5 按时间抽选的基2-FFT算法

25.5.1 算法原理

设输入序列长度为N = 2M(M为正整数),将该序列按时间顺序的奇偶分解为越来越短的子序列,称为基2按时间抽取的FFT算法。也称为Coolkey-Tukey算法。

其中基2表示:N = 2M,M为整数。若不满足这个条件,可以人为地加上若干零值(加零补长)使其达到N = 2,M。

25.5.2 算法步骤

  • 分组,变量置换
  • 分组,变量置换

其中k = 0, 1,…. N/2 – 1。 和 只有N/2个点,以N/2为周期;而X(k)却有N个点,以N为周期。要用x1(k)和x2(k)表达全部的X(k)值。还必须利用

系数的周期特性。

有了上面的计算结果后,我们可以得到如下的蝶形运算流图符号:

关于这个蝶形运算流图符号说明如下:

  1. 1个蝶形运算需要1次复乘,2次复加。
  2. 左边两路为输入。
  3. 右边两路为输出。
  4. 中间以一个小圆表示加减运算(右上路为相加输出,右下路为相减输出)。
  • 分解后的运算量

运算量减少了近一半。

例子:求N=23=8点FFT变化。按N=8àN/2=4,做4点的DFT,先将N=8点的DFT分解成2个4点的DFT:

可知:  时域上 x(0),x(2),x(4),x(6)为偶子序列。

               x(1),x(3),x(5),x(7)为奇子序列。

        频域上  X(0) 到X(3) 由X(k)给出

                X(4) 到X(7) 由X(k+N/2)给出

此外,还有4个蝶形结,每个蝶形结需要1次复乘,2次复加。一共是:复乘4次,复加8次。

用分解的方法的得到X(k)需要:

复乘:32+4=36次

复加:24+8=32次

N = 23 = 8 按时间抽取的DFT分解过程:

因为4点DFT还是比较麻烦,所以再继续分解。

若将N/2(4点)子序列按奇/偶分解成两个N/4点(2点)子序列。即对将x1(r)和x2(r)分解成奇、偶两个N/4点(2点)的子序列。

因此可以对两个N/2点的DFT再分别作进一步的分解。将一个8点的DFT可以分解成四个2点的DFT,直到最后得到两两点的DFT为止。

由于这种方法每一步分解都是按输入序列是属于偶数还是奇数来抽取的,所以称为“按时间抽取的FFT算法”。

下图是由4个两点DFT组成的8点DFT:

下图是按8点抽取的FFT运算流图:

这里注意观察蝶形图的系数

25.5.3 FFT算法和直接计算DFT运算量的比较

FFT算法与直接计算DFT所需乘法次数的比较曲线

25.6 按频率抽选的基2-FFT算法

在基2快速算法中,频域抽取法FFT也是一种常用的快速算法,简称DIF-FFT。

鉴于网上和课本中关于FFT原理已经讲解非常详细了,在这里就不再赘述了。有兴趣的查阅相关书籍进行学习即可。

25.7 总结

本章节主要讲解了FFT的基2算法实现原理,讲解稍显枯燥,不过还是希望初学的同学认真学习,搞懂一种快速傅里叶算法的实现即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【STM32F407的DSP教程】第27章 FFT的示波器应用
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第27章       FFT的示波器应用 特别声明:本章节内容整理自
Simon223
2020/06/01
1.6K0
【STM32F407的DSP教程】第27章    FFT的示波器应用
【STM32H7的DSP教程】第24章 DSP变换运算-傅里叶变换
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第24章       DSP变换运算-傅里叶变换 本章节开始进入此教
Simon223
2020/05/22
8410
【STM32F407的DSP教程】第26章 FFT变换结果的物理意义
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第26章       FFT变换结果的物理意义     FFT是离散
Simon223
2020/06/01
1.8K0
【STM32F407的DSP教程】第26章    FFT变换结果的物理意义
从DTFT到DFS,从DFS到DFT,从DFT到FFT,从一维到二维
因为要移植CSK得写快速傅里叶变换的算法,还是二维的,以前在pc平台上只需调用库就可以了,只是有点印象原信号和变换之后代表的是什么,但是对于离散傅里叶变换的来龙去脉忘得已经差不多了,最近要用到,于是重新来学习一遍,翻出了自己大三当时录的吴镇扬老师讲的数字信号处理的视频,DFT-FFT这里老师讲了有10讲之多,但每讲都不是很长,20分钟左右,这里记录一下学习的过程,前面的推导有点多,简书又打不了公式,mathtype的直接复制也不过来,截图又太麻烦,也为了自己再推导一遍,手写了前面一部分的内容。图片形式传上来。 简单说几句:DTFT有了之后为什么还要搞出来一个DFT呢,其根本原因就是因为DTFT的频域是连续的,无法用计算机进行处理。根据我们之前得到的的傅里叶变换的规律:
和蔼的zhxing
2018/09/04
2K0
从DTFT到DFS,从DFS到DFT,从DFT到FFT,从一维到二维
matlab 及数字信号实验报告,Matlab数字信号处理实验报告.doc
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
全栈程序员站长
2022/07/23
1K0
STM32F103 如何实现 FFT?
数字信号在我们生活中随处可见,自然而然地就会涉及到对于数字信号的处理,最为典型的一个应用就是示波器,在使用示波器的过程当中,我们会通过示波器测量到信号的频率以及幅值,同时我们也可以通过示波器对测量到的信号进行 FFT ,从而能够观察到待测信号的频谱,方便直观的看出信号的高频分量和低频分量,从而帮助我们去除信号中携带的噪声。而在嵌入式方面的应用,我们可以直接使用 DSP 芯片对信号进行处理,同时, ARM 公司推出的 Cortex-M4F 内核是带有 FPU ,DSP 和 SIMD 单元的,针对于这些单元也增加了专用的指令,指令如下图所示:
wenzid
2021/03/04
2.7K0
STM32F103 如何实现 FFT?
几幅图弄清FFT、DFT、DTFT和DFS的关系
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
4.4K0
几幅图弄清FFT、DFT、DTFT和DFS的关系
快速傅里叶变换——理论
离散傅里叶变换的原理是将原本非周期的信号复制扩展为周期信号,在实际的数字电路处理中,处理的信号是有限长的,取长度为N,即N为信号
月见樽
2021/04/13
1.7K0
数字信号处理课程实验报告(数字信号处理需要什么基础)
按照题目要求,首先应利用计算机生成一个由多个频率叠加而成的信号。之后在不通风抽样频率之下对信号进行采样。编写FFT程序对信号进行DFT变换,应能观察出在满足和不满足奈奎斯特采样定理的情况下信号频谱分别处于不混叠和混叠状态。然后需要对信号进行恢复以观察满足或不满足奈奎斯特采样定理的情况下,频域的频谱混叠对时域恢复信号的影响。在频谱混叠时,观察其时域信号的失真。
全栈程序员站长
2022/07/30
8500
数字信号处理课程实验报告(数字信号处理需要什么基础)
基于python的快速傅里叶变换FFT(
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换。
py3study
2020/02/10
2.7K0
快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一。我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章中,以看似简单的计算技巧来讲解这个东西。 本文的目标是,深入Cooley-Tukey  FFT 算法,解释作为其根源的“对称性”,并以一些直观的python代码将其理论转变为实际。我希望这次研究能对这个算法的背景原理有更全面的认识。 FFT(快速傅里叶变换)本身就是离散傅里叶变换(Discrete Fourie
Angel_Kitty
2018/04/09
5.2K0
快速傅里叶变换(FFT)算法【详解】
全面解析傅立叶变换(非常详细)
第一部分、 DFT 第一章、傅立叶变换的由来 第二章、实数形式离散傅立叶变换(Real DFT)
全栈程序员站长
2022/11/01
6.1K0
sin傅里叶变换公式_傅里叶变换公式(傅里叶变换常用公式)
一般傅里叶变换与反变换的公式是成对儿给出的。1、如果正变换 前有系数1/2*π,则反变换 前无系数2、如果正变换 前无系数,则反变换 前有系数1/2*π3、正、反变换 前.
全栈程序员站长
2022/09/13
2.4K0
快手3面:说说傅里叶变换、拉普拉斯变换为什么要变换,它们之间的联系是什么!
要理解这些变换,首先需要理解什么是数学变换!如果不理解什么是数学变换的概念,那么其他的概念我觉得也没有理解。
Java程序猿
2021/06/07
7850
一文学透Crane DSP预测算法
孟凡杰,腾讯云容器技术专家,FinOps产品研发负责人。 余宇飞,腾讯云专家工程师,专注云原生可观测性、成本优化等领域,Crane 核心开发者,现负责 Crane 资源预测、推荐落地、运营平台建设等相关工作。 背景 在《Effective HPA:预测未来的弹性伸缩产品》 一文中,我们提到原生HPA并不完美。基于阈值被动响应机制的滞后性与众多应用冷启动慢等原因导致很大一部分应用无法安心配置弹性。 基于DSP(Digital Signal Processing,数字信号处理)算法的预测机制,Crane确保在
腾讯云开发者
2023/02/13
1.3K0
一文学透Crane DSP预测算法
傅里叶变换
是描述数学函数或物理信号对时间的关系。例如一个信号的时域波形可以表达信号随着时间的变化。是真实世界,是惟一实际存在的域。因为我们的经历都是在时域中发展和验证的,已经习惯于事件按时间的先后顺序地发生。
为为为什么
2022/08/05
1.6K0
傅里叶变换
傅里叶变换理论与应用
$$ \begin{array}{l} \int_{-l}^{l} \cos \frac{n \pi x}{l} \cos \frac{m \pi x}{l} \mathrm{~d} x &=&\frac{1}{2} \int_{-l}^{l} \cos \frac{(n+m) \pi x}{l}+\cos \frac{(n-m) \pi x}{l} \mathrm{~d} x \\ &=&\left.\left(\frac{l}{2(n+m) \pi} \sin \frac{(n+m) \pi x}{l}+\frac{l}{2(n-m) \pi} \sin \frac{(n-m) \pi x}{l}\right)\right|_{-l} ^{l} \\&=&0 \end{array} $$
为为为什么
2022/12/17
1.1K0
傅里叶变换理论与应用
MATLAB实现FFT 及信号的谱分析
一、实验目的 1.通过实验加深对 FFT 的理解,熟悉 FFT 程序、结构及编程方法。
timerring
2022/07/20
1.3K0
MATLAB实现FFT 及信号的谱分析
数字信号处理实验报告MATLAB(matlab数字信号处理pdf)
信号是数字信号处理领域中最基本、最重要的概念。而数字信号变换技术,又是对信号进行处理操作的最基本的有效途径之一。因此,数字信号变换技术,便成为数字信号处理领域中专业人员所必须要张我的一项最基本的技能。
全栈程序员站长
2022/08/01
9000
离散时间傅里叶变换(DTFT)和离散傅里叶变换(DFT)区别-粒粒分明版
离散时间信号是指在离散的时间点上取值的信号。与连续时间信号(如模拟信号)不同,离散时间信号只在特定的、等间隔的时间点上有定义。
云深无际
2024/10/14
4420
离散时间傅里叶变换(DTFT)和离散傅里叶变换(DFT)区别-粒粒分明版
推荐阅读
相关推荐
【STM32F407的DSP教程】第27章 FFT的示波器应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档