热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATALB信号处理——信号的变换(6)

2-6快速傅里叶变换快速傅里叶变换(fastFouriertransform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称

2-6快速傅里叶变换

       快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。


1.DFT存在的问题和FFT的基本流程

       有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列。这里面要用到复数乘法和复数加法,相比较于实数乘法和实数加法,复数的运算次数要多上好几倍,而我们实际取N的值也很大,所以整个流程其计算量太大,很难实时地处理问题。

       将DFT中的e^{-j\frac{2\pi}{N}nk}定义为指数因子w_{N},因为其指数函数的特殊性,它具有对称性和周期性,可以借助它的性质来减小计算量。

       FFT的基本流程就是:1.把原始的N点序列,依次分解成一系列的短序列;2.求出这些短序列相应的DFT并进行适当组合,达到删除重复计算,减少乘法运算和简化结构的目的。听起来是不是很类似于小学学的组合运算。


2.FFT的计算方法

       计算离散傅里叶变换的快速方法,有按时间抽取的FFT算法和按频率抽取的FFT算法。前者是将时域信号序列按偶奇分排,后者是将频域信号序列按偶奇分排。它们都借助于的两个特点:一是周期性;二是对称性,这里符号*代表其共轭。这样,便可以把离散傅里叶变换的计算分成若干步进行,计算效率大为提高。

1.按时间抽取

       令信号长度为N(2的幂),可以将时域信号序列x(n)分解成两部分,一是偶数部分x(2n),另一是奇数部分x(2n+1),x_{1}(n)=x(2n)x_{2}(n)=x(zn+1),DFT的运算也分成了2部分

x(k)=\sum_{n=0}^{N-1}x(n)w_{N}^{nk}=\sum_{r=0}^{N/2-1}x(r)w_{N}^{2rk}+\sum_{r=0}^{N/2-1}x(2r+1)w_{N}^{(2r+1)k}=\sum_{r=0}^{N/2-1}x(2r)w_{N}^{2rk}+w_{N}^{k}\sum_{r=0}^{N/2-1}x(2r+1)w_{N}^{2rk}

其中w_{N}^{2n}=e^{-j\frac{2\pi}{N}2n}=e^{-j\frac{2\pi}{N/2}n}=w_{N/2}^{n} 

X(k) = \sum_{r=0}^{N/2-1}x(2r)W_{\frac{N}{2}}^{rk}+W_{N}^{k}\sum_{r=0}^{N/2-1}x(2r+1)W_{N\frac{N}{2}}^{rk}=G(k)+W_{N}^{k}H(k)。H(k),G(k)都有N/2个点,从0到N/2-1。

       根据对称性,有w_{N/2}^{r(N/2+k)}=w_{N/2}^{rk},W_{N}^{k+N/2}=-W_{N}^{k},那么X(k+\frac{N}{2})=G(k)-W_{N}^{k}H(k),k=0,1,\cdot \cdot\cdot,\frac{N}{2}-1,因此,一个抽样点数为N 的信号序列x(n)的离散傅里叶变换,可以由两个 N/2抽样点序列的离散傅里叶变换求出。依此类推,这种按时间抽取算法是将输入信号序列分成越来越小的子序列进行离散傅里叶变换计算,最后合成为N点的离散傅里叶变换。

X(k+\frac{N}{2}) = G(k)-W_{N}^{k}H(k),k = 0,1,\cdot\cdot \cdot ,\frac{N}{2}-1

X(k+\frac{N}{2}) = G(k)-W_{N}^{k}H(k),k = 0,1,\cdot\cdot \cdot ,\frac{N}{2}-1

       通常蝶形算法的信号流图来表示离散傅里叶变换运算。例如,N=8的抽样点的信号序列x(n)的离散傅里叶变换,可用如图2所示的FET算法的信号流图来计算。



 

       对于N=2^M,通过M次分解,最后会成为2点的DFT运算,构成了从x(n)到X(k)的M级运算。 N=2点的离散傅里叶变换的计算全由蝶形运算组成,需要M级运算,每级包括N/2个蝶形运算,总共有log_{2}N(M)个蝶形运算。所以,总的计算量为\frac{N}{2}log{_{2}}^{}N次复数乘法运算和Nlog_{2}N次复数加法运算。 

2.按频率抽取

        对于频率抽取,输入序列不是按奇数偶数分解,而是整个序列从中间截断,前后各一半,即

X(k) = \sum_{n=0}^{N/2-1}x(n)W_{N}^{nk}+\sum _{n=N/2}^{N-1}x(n)W_{N}^{nk}=\sum_{n=0}^{N/2-1}x(n)W_{N}^{nk}+\sum _{n=0}^{N/2-1}x(n+\frac{N}{2})W_{N}^{(n+\frac{N}{2})k}=\sum_{n=0}^{N/2-1}[x(n)+W_{N}^{(\frac{N}{2}k)}x(n+N/2)]W_{N}^{nk}

根据指数因子的展开,可以知道W_{N}^{N/2}=-1,W_{N}^{(N/2)k}=(-1)^k\sum_{n=0}^{N/2-1}[x(n)+(-1)^kx(n+N/2)]W_{N}^{nk}再进一步分解为奇数组和偶数组,

X(2r)=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N}^{2nr}=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N/2}^{2nr}

X(2r+1)=\sum_{n=0}^{N/2-1}[x(n)-x(n+N/2)]W_{N}^{n(2r+1)}=\sum_{n=0}^{N/2-1}[x(n)+x(n+N/2)]W_{N/2}^{nr}W_{N}^{n}

剩下的和第一种方法类似。

参考资料——《MATLAB信号处理》沈再阳

                        百度百科


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • SLAM中相机运动估计的基本问题及解决方案
    本文讨论了SLAM中相机运动估计的基本问题,指出了解决方案的存在。作者认为阅读相关SLAM书籍是掌握基础原理的有效途径,而不是仅仅依赖现成的解决方案。同时,作者也提到了激光雷达和特征点匹配等技术在SLAM中的应用,并建议读者深入理解相关原理,而不是盲目追求现成的代码。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
author-avatar
平安
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有