快速傅氏变换(Fast Fourier Transform,FFT)算法基本原理详细解析

目录

目录

FFT

基本原理

FFT算法

Cooley-Tukey 步骤概述:

        1、分解:将原始序列分成偶数部分和奇数部分。原始DFT问题就被分解成两个长度为N/2的子问题,分别对应偶数索引和奇数索引的元素。

        2、递归:递归地对这两个子序列应用FFT算法。这一步骤将继续进行,直到序列长度减小到足够简单(例如长度为1),可以直接计算其DFT。

        3、组合:使用蝶形运算(一个简单的数学运算,用于结合两个小DFTs的结果来形成一个大DFT的结果)将所有小DFTs的结果合并起来,得到最终的DFT结果。

蝶形运算

组合的具体实例

最终结果

优化

Cooley-Tukey 变体形式

1. 时域抽选法(DIT)

2. 频域抽选法(DIF)

应用

应用中的关键问题

1. 补零(Zero Padding)

2. 频谱泄露(Spectral Leakage)

3. 栅栏效应(Fence Effect)

4. 加窗(Windowing)

5. 细化(Interpolation)

6. 频谱混叠(Spectral Aliasing)

其他相关的概念

频率分辨率

频率步长

提高准确性的策略

采样时间的选择

加窗技术的应用

其他需要考虑的问题

1、频率值的准确性与频率分辨率的关系

2、信号非周期截断对频谱图的影响(频谱泄露)

3、信号的周期延拓对频谱的影响

4、信号补零对频谱的影响

5、FFT点数不等于信号数据点数对FFT结果的影响

总结


FFT

快速傅里叶变换(FFT)是一种用于计算离散傅里叶变换(DFT)及其逆变换的高效算法。DFT是一种数学技术,用于将一个函数或信号分解成不同频率的成分。FFT广泛应用于信号处理、图像处理、通信系统等领域,因为它能够快速而有效地计算DFT,大大提高了处理速度。

基本原理

DFT将时域信号转换为频域信号。对于长度为 N 的复数序列 x[n],其DFT定义为:

FFT算法

最著名的FFT算法是由库尔兹(Cooley)和图基(Tukey)在1965年提出的,通常称为Cooley-Tukey算法。该算法基于“分治”策略,将一个大问题分解为若干个小问题解决。

Cooley-Tukey基于分治策略,将一个DFT分解成许多较小的DFTs,以减少总的计算量。算法通常应用于N是2的幂次方的情况,但也可以通过修改用于其他大小。

Cooley-Tukey 步骤概述:

假设我们有一个长度为8的序列 x[0],x[1],...,x[7]。使用Cooley-Tukey算法的8点FFT详细步骤如下:

        1、分解:将原始序列分成偶数部分和奇数部分。原始DFT问题就被分解成两个长度为N/2的子问题,分别对应偶数索引和奇数索引的元素。

        首先,按照Cooley-Tukey算法,我们将序列分成偶数索引的部分和奇数索引的部分:

        2、递归:递归地对这两个子序列应用FFT算法。这一步骤将继续进行,直到序列长度减小到足够简单(例如长度为1),可以直接计算其DFT。

        接下来,我们对这两个长度为4的子序列(偶数索引序列和奇数索引序列)递归地应用FFT。每个子序列再次被分解为更小的子序列:

这一步骤会递归进行,直到子序列的长度为1,此时的FFT可以直接计算,因为长度为1的序列的FFT就是其自身。

        3、组合:使用蝶形运算(一个简单的数学运算,用于结合两个小DFTs的结果来形成一个大DFT的结果)将所有小DFTs的结果合并起来,得到最终的DFT结果。

        每当完成一个子序列的FFT计算后,我们使用蝶形运算将结果组合起来。对于长度为4的FFT,我们将两个长度为2的FFT结果结合起来;然后,对于长度为8的FFT,我们将两个长度为4的FFT结果结合起来。

假设递归计算后,我们得到了以下两组结果:

蝶形运算

对于序列中的每个元素 k (其中 k=0,1,...,3),进行蝶形运算:

组合的具体实例

以 k=0 为例,我们可以计算:

通过类似的方法,可以计算出 X[1], X[2], X[3], X[5], X[6], X[7]。

最终结果

通过以上的蝶形运算,我们将得到原始序列的FFT结果 X[1],...,X[7]。这个结果是经过组合偶数部分和奇数部分的FFT结果,以及应用旋转因子后得到的。

优化

  • 位逆序排列:在FFT的执行过程中,输入信号通常需要重新排列。这是因为Cooley-Tukey算法在递归地执行过程中,会以一种特定的顺序处理数据。数据的重新排列通常是通过位逆序来完成的。

  • 蝶形运算:蝶形运算是FFT算法中的核心,用于在每一级递归中有效地组合结果。每个蝶形操作涉及两个输入点,通过特定的加法和乘法操作,产生两个输出点。

Cooley-Tukey 变体形式

Cooley-Tukey算法主要有两种变体:时域抽选法(decimation in time, DIT)和频域抽选法(decimation in frequency, DIF)。尽管这两种变体在处理方式上有所不同,它们都遵循了分而治之的原则,通过递归地分解和组合操作以达到降低计算量的目的(两种方法的核心思想都是将DFT分解为较小的DFTs,然后递归地计算这些DFTs)。

1. 时域抽选法(DIT)

DIT FFT算法首先将序列分成偶数索引的部分和奇数索引的部分,然后分别对这两部分计算DFT,最后将结果组合起来得到完整的DFT结果。这种分解过程递归进行,直到分解的序列长度为1(一种自顶向下的方法。它首先处理整个序列,然后逐步分解为更小的部分进行处理)。具体步骤如下:

  1. 分解:将原始序列分为两部分,一部分包含偶数索引处的元素,另一部分包含奇数索引处的元素。这一步将问题规模缩小一半。
  2. 递归:对每个子序列递归地应用相同的分解过程,直到序列长度缩减到1或达到可以直接计算的简单情况。
  3. 蝶形运算:在每一级的递归中,使用蝶形运算合并计算结果,最终得到完整的DFT结果。

DIT方法的优点是逻辑清晰,易于理解和实现。它从整个序列出发,逐步深入到序列的细节。

2. 频域抽选法(DIF)

与DIT类似,DIF FFT算法也是通过递归分解的方式工作,但它是从频域的角度出发,先计算较小长度的DFT,然后合并它们以得到更长长度的DFT结果(一种自底向上的方法。与DIT相反,DIF从序列的单个元素开始,逐步将它们组合成更大的部分)。具体步骤如下:

  1. 蝶形运算:首先对序列中的每一对元素(通常是相邻元素)进行蝶形运算,这一步骤不需要元素的重排序。
  2. 合并:将步骤1中的结果组合起来,形成更大的子序列,并对这些子序列应用蝶形运算。
  3. 重复:重复步骤2,直到所有的元素都被合并为一个完整的序列,此时完成了DFT的计算。

DIF方法的特点是从细节出发,逐渐构建出整体的结果,这种方式在实际实现中可能更适合某些并行处理架构。

应用

FFT的应用非常广泛,几乎涉及到所有需要信号处理的领域,例如:

  • 数字信号处理(DSP):在语音处理、图像处理等领域,FFT是实现快速卷积、滤波等操作的关键技术。
  • 通信系统:FFT用于调制解调技术中,特别是在正交频分复用(OFDM)等现代无线通信技术中扮演着核心角色。
  • 声学:FFT用于分析不同频率的声音成分,用于声音识别、降噪等应用。
  • 谱分析:在物理、化学等科学研究中,FFT用于分析物质的光谱特性。

应用中的关键问题

在使用快速傅里叶变换(FFT)过程中,常会遇到以下几个关键的概念和技术,它们对于理解和应用FFT至关重要。下面详细介绍这些概念:

1. 补零(Zero Padding)

补零是在信号的末尾添加零的过程,目的是增加FFT的点数,从而提高频率分辨率。通过补零,可以使FFT的输出包含更多的频率点,使得频谱更加细腻。需要注意的是,补零并不改变信号的频谱内容,只是在频谱上进行了“插值”,使其看起来更平滑(换言之,补零不能增加信号的频谱信息或改善原始信号的频率分辨率,补零实质上是在频谱中进行了插值,使得频谱看起来更平滑)。

2. 频谱泄露(Spectral Leakage)

频谱泄露是指在进行FFT时,由于信号的长度通常不是无限的,且不一定正好是周期的整数倍,导致原本应集中在某个频率的能量分散到其他频率上。这会造成频谱的模糊,使得无法准确地区分接近的频率成分。频谱泄露是离散傅里叶变换的固有属性,无法完全避免。

3. 栅栏效应(Fence Effect)

栅栏效应,也称为拾取效应,是由于FFT固定频率分辨率的特性造成的。当信号中的频率成分不正好落在FFT频率网格的点上时,会出现能量被相邻的频率点“拾取”的现象,导致频谱的不精确表示。这种效应在频谱分析中尤为显著。

4. 加窗(Windowing)

为了减少频谱泄露的影响,通常在进行FFT之前会对信号加窗。加窗是指将信号与一个窗函数进行逐点乘法操作,目的是减少信号两端的不连续性。窗函数在信号中间值较大,两端逐渐衰减到零,从而减少了非周期信号带来的边缘效应。常用的窗函数包括汉宁窗、汉明窗和布莱克曼窗等(加窗的根本目的是为了在进行FFT时,通过模拟信号的周期性延拓,使得信号的开始和结束部分平滑过渡,相互衔接。这样做可以显著减少信号在首尾部分的突变,从而有效减少频谱泄露的现象。)。

5. 细化(Interpolation)

细化是指通过数学处理提高频谱的频率分辨率的技术,不同于补零,细化尝试通过算法来估计信号中的频率成分,从而获得更精确的频率信息。细化通常在信号处理后进行,作为一种后处理步骤。

6. 频谱混叠(Spectral Aliasing)

频谱混叠发生在采样频率低于信号中最高频率成分的两倍时(违反了奈奎斯特采样定理)。在FFT分析中,如果原始信号没有经过适当的抗混叠滤波,那么高于采样频率一半的频率成分会被错误地映射(混叠)到较低的频率上,导致频谱分析结果不准确(此处大家可以搜索压缩感知相关内容,当信号可以被稀疏表示时,是可以在不满足奈奎斯特采样定理的前提下实现信号的采样,并且不产生频谱混叠)。

其他相关的概念

频率分辨率

频率分辨率是测量系统能够区分两个相邻频率成分的最小频率差异。在FFT中,频率分辨率是由总的采样时间决定的。具体来说,频率分辨率可以通过公式 Δf=1/T​ 来计算,其中 Δf 是频率分辨率,T 是采样时间的总长度。这意味着,通过增加采样时间(即分析的时间窗口),我们可以提高频率分辨率,使得更接近的频率成分能够被区分开。

频率步长

频率步长是离散频谱中相邻频点之间的间距。在进行FFT时,由于信号被离散化处理,整个频谱也是离散的,每个频点代表一个特定的频率。频率步长由采样率和FFT点数共同决定,具体可以通过 fs/N​​ 计算得到,其中 fs​ 是采样率,N 是FFT的点数。这意味着,虽然通过增加采样时间可以提高频率分辨率,但频率步长是由采样率和FFT点数确定的,与采样时间无关。

提高准确性的策略

采样时间的选择

虽然增加采样时间可以提高频率分辨率,但对于提高频率幅值的准确度,需要考虑的是待测频率与频率步长的关系。当待测频率正好是频率步长的整数倍时,可以获得较高的频率和幅值准确度。因此,在实际应用中选择采样时间时,应考虑使采样时间与待测信号的周期成整数关系,以确保待测频率符合频率步长的整数倍。

加窗技术的应用

加窗技术可以减少频谱泄露,从而提高频率成分的幅值准确度。通过适当选择窗函数,可以在减少泄露的同时,尽可能保持频率成分的幅值不变形。

综上所述,FFT分析中频率的准确性和幅值的正确度不仅取决于采样时间的长度,还需要考虑采样策略(如采样时间与信号周期的关系、采样率与FFT点数的选择)和信号处理技术(如加窗)的综合应用。这些因素共同作用,以期达到对信号频谱的准确分析。

其他需要考虑的问题

1、频率值的准确性与频率分辨率的关系

频率分辨率决定了FFT能够区分两个相近频率的能力,而频率值的准确性指的是能否准确测量这些频率的实际值及其对应的幅值。虽然提高频率分辨率(通过增加采样时间)有助于更好地区分接近的频率,但这并不直接影响频率及其幅值的准确测量。频率值的准确性更多地受到信号截断方式和是否进行信号处理(如窗函数处理)的影响。

2、信号非周期截断对频谱图的影响(频谱泄露)

当信号在进行FFT之前被非周期性截断时,即信号的采样长度不是信号周期的整数倍,会导致频谱泄露。这意味着信号的能量会错误地分布到本应集中的频率以外的频率上,导致频谱图中频率及其幅值的不准确。

3、信号的周期延拓对频谱的影响

对信号进行周期延拓,尤其是非整周期的截断信号,虽然可以通过增加采样时间提高频率分辨率,但它会在相邻两段信号之间产生间断点,导致信号连接的不连续。这种操作虽然提高了频率分辨率,但对于提高频率值及其幅值的准确性帮助不大。

综合整周期截断和非整周期截断后的延拓次数对频谱的影响情况来看,对信号进行延拓相当于增加了采样时间,能够提高频率分辨率,但是不会改善频谱中频率及其幅值的准确性。

4、信号补零对频谱的影响

补零是在信号末尾添加零值的过程,这个操作不会改变原始频谱的基本特性,即频率值及其幅值基本保持不变。补零主要影响的是频谱的显示方式,使得频谱看起来更光滑。但是,补零并不改善频率及其幅值的准确性,且大量补零可能会引入结构变化,导致频率出现微小偏差。

补零对于原始频谱图几乎没有影响,其各频率值及其幅值在补零数量较少时没有变化,当补零数量较多时会发生微小的变化,频谱图逐渐变得更加光滑连续,但对频率及其幅值的影响很小。随着补零次数的增多,信号的结构会发生变化,频率也会有一定的偏差

5、FFT点数不等于信号数据点数对FFT结果的影响

当FFT点数与信号数据点数不匹配时,FFT算法会对信号进行补零或截断,以匹配所需的FFT点数。如果FFT点数大于信号数据点数,系统会自动补零;如果FFT点数小于信号数据点数,则会截断信号。这种不匹配可能会影响频谱分析的结果,包括频率分辨率和频谱泄露等方面,因此选择合适的FFT点数对于获得准确的频谱分析结果至关重要。

总结

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

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

相关文章

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…

黑马现有java课程框架及其功能梳理

目录 高并发相关提高通信效率Netty作用:哪些框架使用它: ChannelChannelHandler 和 ChannelPipelineEventLoop 和 EventLoopGroup**涉及的名词解释:**NIOSocketNginx 高并发相关 主要用来解决IO密集型程序(大量文件读写&#xff…

游戏软件报错xinput1_3.dll丢失如何修复,5种方法一分钟教你修复完成

在计算机使用过程中,我们经常会遇到一些错误提示或者程序无法正常运行的情况。其中,一个常见的问题就是与xinput13.dll文件相关的问题。那么,xinput13.dll到底是什么呢?本文将对其进行详细介绍,帮助大家更好地理解和解…

25.7 MySQL 数据库和表的基本操作

1. 基础知识 1.1 一条数据的存储过程 存储数据确实是处理数据的基石, 只有确保数据被准确无误且有条理地存储, 我们才能对其进行深入的处理和细致的分析. 否则, 这些数据就像是一团毫无章法的乱麻, 让我们难以捉摸其内在的逻辑和价值.那么, 如何才能够将用户那些与经营紧密相关…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口:7001,历史漏洞:CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞:CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

Java面试相关问题

一.MySql篇 1优化相关问题 1.1.MySql中如何定位慢查询? 慢查询的概念:在MySQL中,慢查询是指执行时间超过一定阈值的SQL语句。这个阈值是由long_query_time参数设定的,它的默认值是10秒1。也就是说,如果一条SQL语句的执…

【免费】教你如何考取华为人才在线《人工智能技术与应用V2.0》认证

人工智能技术与应用V2.0考试PC网址 课程详情 (huawei.com) 注:免费认证,里面包含免费的课程,浏览器用Edge。 文章目录 人工智能技术与应用V2.0考试网址 前言 一、备考流程 二、联系内容 三、注意事项 总结 前言 随着人工智能&#xff…

一键成片解决方案,轻松解决企业内容创作难题

当今视频内容已经成为企业推广和品牌建设不可或缺的重要元素。然而,传统的视频制作流程繁琐、耗时,往往让企业望而却步。美摄科技凭借前沿的人工智能技术,推出了一键成片解决方案,为企业用户带来前所未有的高效、智能的视频创作体…

AI+ 发展展望

引言 随着人工智能技术的不断进步,"AI"已经成为一个热门话题,它代表着人工智能与其他行业的深度融合。"AI"不仅仅是技术的进步,更是一场影响深远的社会变革。在这篇文章中,回望历史我们将探索历史经验&#…

java智慧城管源码 AI数字化城市管理系统源码

java智慧城管源码 AI数字化城市管理系统源码 智慧城管 管理系统是基于AI视觉分析技术,算法通过云端部署摄像头,对城区街道的视频数据进行实时分析预警,支撑城管执法、市容环境、公共安全应急等管控治理工作,可将各类识别分析功能…

2.Redis有五种主要的数据类型

Redis有五种主要的数据类型 String(字符串):String类型是最简单的数据类型,可以存储任意类型的数据,例如整数、浮点数、字符串等。String类型支持一些基本的操作,如设置值、获取值、增减值等。 Hash&#…

YOLOv8独家改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C2f进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

第十节HarmonyOS 常用容器组件3-GridRow

1、描述 栅格容器组件,仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 2、子组件 可以包含GridCol子组件。 3、接口 GridRow(options:{columns: number | GridRowColumnOption, gutter?: Length | GutterOption, Breakpoints?: B…

360企业安全浏览器兼容模式显示异常某个内容不显示 偶发现象 本地无法复现情况js

360企业安全浏览器兼容模式显示异常 ,现象测试环境频发 ,本地连测试无法复现,线上反馈问题。 出现问题的电脑为windows且使用360企业安全浏览器打开兼容模式可复现 复现过程: 不直接点击超链接跳转页面 ,登录后直接通…

zabbix“专家坐诊”第234期问答

问题一 Q:除了系统信息外,仪表盘显示的信息都是空的是什么原因?已经是admin role,但不是super admin role的。 A:权限不够,在用户组赋主机权限。 问题二 Q:请问队列积压太多可以怎么解决&#…

Matlab进阶绘图第46期—气泡分组柱状图

气泡分组柱状图是分组柱状图与气泡图的组合—在分组柱状图每组柱子上方添加大小不同的气泡,用于表示另外一个数据变量(如每组柱子值的和)的大小。 本文利用自己制作的BarBubble工具,进行气泡分组柱状图的绘制,先来看一…

cesium Clock JulianDate 日照分析

cesium在初始化的时候会自动把Clock对象挂载到容器上Clock内部以JulianDate维护时间,比北京时间慢8个小时,想显示北京时间需要计算时差JulianDate的日期部分和秒数部分是分开的 julianDayNumber:指整数天,记录从公元前4713年正午以…

PCD8011TG兼用可控硅调光线性LED控制芯片 输出电流可调性 恒精度高 保护性强

概述 PCD8011TG是一款兼容可控硅调光线性恒流芯片,输出电流可调,恒流精度高,应用方案简单,不需要太多的组件, 板载IC驱动器,易于组装,降低了材料成本,提高了生产效率,具…

SQL中条件放在on后与where后的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: on条件是在生成临时表时使用的条件,不管on中的条件是否为真&…

146.【局域网_FTP大型文件传输服务器搭建】

FTP文件传输协议 1.FTP是什么?2.window上配置FTP服务器 (无需密码验证)3.打开FTP的防火墙4.两台同一个局域网下电脑进行测试5.window上配置FTP服务器 (需要密码验证) 1.FTP是什么? FTP就是文件传输协议。用于互联网双向传输,控制文件下载空间在服务器复制文件从本…