FFT太慢太死板?滑动DFT让计算飞起来!-转

本博客分享电子设计技巧,聚焦滑动DFT算法。在频域信号处理中,滑动DFT比FFT性能更优。文中给出滑动DFT的数学推导,其与DFT等价且无信息丢失。算法实现上,它能递归计算,降低复杂度和功耗,还介绍了两种初始化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言:

本栏目旨在和大家分享电子设计中的各种技巧。这里是DSP、Electronic、Embedded以及FPGA共同构成的“四维世界”。这里没有长篇大论,助你“修炼成仙”的功法,只有一针见血,将问题“斩于马下”的“秘技”。这里面的“秘技”虽说不能独步天下,但足以给各位大侠的“修炼之路”提供借鉴。

简介

在许多应用中信号在频域中检测或处理比在时域中有优势。有时优势就只是一个比较简单或概念直白的算法,但频域最大的难点往往是包含在快速傅里叶变换中的复杂度或延迟。如果在一个实时应用中频域数据经常更新,FFT的复杂性和延迟会成为实现系统目标和保持低成本、低功耗的一个主要障碍。许多现实应用,比如医学成像、雷达、触屏感应以及通信系统,都使用频域算法来检测和处理信号。在许多实现中复杂性或功耗必须要低,同时要最小化延迟,在上述方面滑动DFT比FFT的频域计算性能更好。

数学理论基础

滑动DFT的推导是相当简单的,并且和DFT完全等价。也就是说,滑动DFT算法相比传统DFT或FFT算法没有信息丢失或失真。下面有完整的推导过程,没有兴趣的读者可以跳过这一节,因为它容易让人想睡觉。使用滑动DFT的基本前提是很长一段时域数据流在一个长度为N的比较短的转换窗口里。以一幅频谱图为例,频谱图是对很长一段或连续的时域采样数据流按照一定的间隔实施到长度为N的窗口的频域转换。

 

对于滑动DFT的推导,我们首先假设变换使用的是非常新的时域采样,这样的话一个长度为N的变换窗口将保持与时域数据流的每一次采样同步。输入采样流用Xk表示,(其中k的范围比N要广)在每个K采样输入时都能实现长度为N的变换。按照DFT的传统定义我们可以得到下面的第K个采样的变换,其中f表示频率,n表示长度为N的窗口中的标度:

滑动序列的下一次变换是第K+1个采样,可以表示为:

 

 

下一步我们要做的是设p=n+1,用p代替等式二中的n+1,这样p的范围就是从1到n,而不是0到n-1。接下来计算和前面是一样的,只是下标的范围发生了变化。

 


第N个式子可以从总和中独立出来表示。同时引入p=0的式子,只要在最后减去。这样看上去虽然很不优美,但是很有用:

 

上式可以被表示成:

 

 

在等式5中,由于f是整数值,所以Xk+N项的指数的值有且只有可能是1+j0,所以此项的值可化简为Xk+N。
而方括号中的和式正是第K个采样值的DFT,只是下标由n变为p。因此,等式5可以表示为:

 

算法实现

等式6就是推导后得出的滑动DFT的表达式。第K+1变换的频域值Xf,k+1可以从第k个变换的频域值Xf,k递归计算而来。第K+1个采样的频域值可以用前一个采样(第K个)的频域值加上最新输入的时域采样值中的Xk+N与第K个采样值中的Xk的差,再乘以就可以得到最新的输出。

 

相比于使用FFT,滑动DFT的优势是非常明显的。滑动DFT避免了很多不必要的运算,降低计算复杂性,节省了很多的计算资源,从而降低功耗。图1表示了实现等式6的信号流程图,它的初始延迟和相加是所有计算共用的,复数递归乘法以及累加在每个频率值计算的时候被重复。

 


图1 等式6的信号流程图

 

滑动DFT的另一个优点是如果不需要对每个输入采样进行变换的话,它可减少不必要的计算。例如,一个变换只需要M个采样输入,当所有的计算完成时,滑动DFT的计算复杂性是N×M,而FFT完成相同的工作的计算复杂性却是N×log2(N)。

 

初始化

滑动DFT算法的递归性意味着需要一些初始化方法。要想输出的Xf,k+1有效,那么Xf,k也必须是有效的。且每个输出依赖于前N采样输入。有两种常用的算法初始化方法:

1、在循环采样数据之前,先使用0来刷新延迟线。类似地,如果缓冲寄存器复位,在循环数据之前,要重置信号路径存储器为0,完成刷新。当N个数据采样完成循环,输出是有效的。

2、第一种方法中N个循环的初始化延迟可以通过前N个输入采样的FFT初始化Xf,k来避免。在一些系统中,特别是离线应用,这个方法很有优势。

 

在快速傅立叶变换(FFT)算法中,蝶式计算是实现运算优化和递归的核心技术之一。它通过将一个较大的离散傅立叶变换(DFT)问题分解为两个较小的DFT问题来实现递归,每个小问题的解可以被组合起来,以形成原始问题的解。这种分解方法降低了总体的计算复杂度,特别是在处理长序列时,效率提升尤为显著。 参考资源链接:[串行FFT递归算法:蝶式计算原理与高效实现](https://wenku.youkuaiyun.com/doc/5ccmso88nd?spm=1055.2569.3001.10343) 具体来说,蝶式计算基于DFT的一个基本性质:DFT可以被分解为两个较小的DFT。如果我们将一个长度为N的序列分为两个长度为N/2的子序列,那么原始的DFT可以通过对这两个子序列分别进行DFT,并使用蝶式操作来组合结果来实现。在蝶式操作中,每一对输入数据经过一系列的复数乘法和加法操作,生成输出数据。这个过程中,大量计算得以复用,从而减少了重复计算的数量。 例如,当序列长度为2的幂时(如2^k),FFT算法的计算复杂度降低为N log2(N),相比原始DFT的N^2次计算,效率提升明显。蝶式计算通过迭代地将问题规模减半,并在每一步中利用中间结果,有效减少了所需的运算次数。 为了深入理解FFT中蝶式计算的递归过程和优化原理,建议参考《串行FFT递归算法:蝶式计算原理与高效实现》。该文档详细介绍了FFT算法的设计步骤,提供了算法描述和流程图,以及具体的源程序代码和运行结果,帮助读者从理论到实践全面掌握FFT的核心概念和应用。通过学习这份资料,读者可以更好地理解FFT如何通过递归和蝶式计算来优化DFT运算,从而在数字信号处理和其他工程领域中实现更高效的数据分析和处理。 参考资源链接:[串行FFT递归算法:蝶式计算原理与高效实现](https://wenku.youkuaiyun.com/doc/5ccmso88nd?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值