C语言实现快速傅立叶(FFT)(一)

1. FFT理论相关知识

FFT(快速傅里叶变换)其本质就是DFT,只不过可以快速的计算出DFT结果,所以首先应该理解DFT,DFT(Discrete Fourier Transform) 离散傅里叶变换的缩写,FFT(Fast Fourier Transform)快速傅里叶变换的缩写,搞明白DFT之后,FFT就相对容易了。DFT(FFT)的作用是可以将信号从时域变换到频域,而且时域和频域都是离散的,通俗的说,可以求出一个信号由哪些正弦波叠加而成,求出的结果就是这些正弦波的幅度和相位.

1 .1 DFT

如图6-1所示,离散傅里叶变换可以将一个N点的输入信号变成两个N/2+1点的输出信号。输入信号含有已被分解的信号,而两个输出信号包含正弦波和余弦波的幅值信息。在时域x[ ]包含从0到N-l计N个样点。经过DFT变换之后,在频域产生两个信号:

其实部记作ReX[],虚部记作ImX[ ]。DFT变换是从时域变换到频域,而DFT逆变换与此相反,是从频域变换到时域.

图6-1 实DFT变换

频域与时域描述的都是同一个信号,只是表述形式不同。如果已知其中的一个域,就能计算出另外一个域。通过给定的时域信号计算频域信号的过程就叫做分解、分析、正向DFT,或者简称为DFT。而通过给定的频域信号计算时域信号的过程就被称做合成或逆向DFT。无论分解还是合成都可以用方程式和计算机算法来描述。

时域的样点数常用变量N表示。虽然N可以是任意的正整数,但是通常选择2的k次方(k任意正整数),也就是128、256、512、1024等。这样选择的原因有以下两点:首先,数字数据存储使用二进制寻址方式,因此,2的k次方构成了一个信号的合理长度;其次,快速傅里叶变换(FFT)是计算DFT最有效的算法,它通常用N(N是2的k次方)进行运算。通常情况下,N值选在32和4096之间。在大多数的情况下,抽样序号是从0到N-1,而不是1到N。

DFT的标准算法——通过相关性计算 DFT。通过举例来说明此方法如何使用。假设我们现在要对一个64点的信号进行DFT计算,这意味着我们需要计算频域里实部的33个点和虚部的33个点。在这个例子中,我们只介绍如何计算单个样点的值,如ImX[3],即为从0点到63点之间含有3个完整周期的正弦波的幅值。同理可求得其余的频域值。

图6-2描述了如何使用相关性来计算ImX[3]。图6-2a和图6-2b是两个时域信号。

            

图6-2 通过相关性计算 ImX[3]

DFT的公式:

   

                   (6-1)

                 

利用欧拉公式展开:

     

       (6-2)

在计算机中可以这样展开:

                                (6-3)

                               (6-4)

                                              

在python中实现的算法:

def DFT(Y,N):real = { }imag = { }ret = { }for k in range(N):real[k] = 0imag[k] = 0print(k)for n in  range(N):real[k] = real[k] + Y[n] * np.cos(2 * np.pi * k * n / N)imag[k] = imag[k] - Y[n] * np.sin(2 * np.pi * k * n / N)ret[k] = np.sqrt( real[k]**2+imag[k]**2)return ret

以上算法能够实现DFT功能了,从程序可以看出,该算法的时间复杂度是,在计算机中执行的速度太慢。所以接下来介绍比较快的算法FFT(快速傅里叶变换)。

1 .2 FFT

FFT变换首先把一个N点时域信号分解成N个时域信号,其中每个信号只包含一个点。第二步是计算出这N个时域信号相对应的N个频谱。最后,由这N个频谱合成一个频谱。如图6-3所示。FFT 分解。 一个 N 点信号被分解为 N个单点信号。每一步都使用交错分解,把偶数点和奇数点分开,如图6-4所示。

图1-3 FFT算法流程图

图1-4 FFT分解案例

      FFT的最后一步是将N个频谱按照时域分解时重新排列的顺序进行组合。这就是此算法相对麻烦的地方。在第一步,8个频谱(每个频谱包含1点)被合成为4频谱(每个频谱包含2点),在第二步,4个频谱(每个频谱包含2点)被合成为2频谱(每个频谱包含4点),最后一步使得FFT的输出是一个8点的频谱。如图6-5所示。图6-6 是FFT运算的最基本元素,将两个复数点转换成另外两个复数点。

图1-5 FFT  N=8点合成

                                                图1-6 FFT蝶形运算最基本元素

1 .3 窗函数

如果连续时间信号 Xa(t) 在时域无限长,则离散化后的序列 X(n) 也是无限长的,而 DFT 只适用于有限长序列的计算,因此需要对 X(n) 加窗截断,使之成为有限长序列 XN(n),这个过程称为时域加窗(time-windowing)。设窗函数为Wn(N),则

  

                                      (1-5)

有DFT的性质,时域上有两个序列相乘,在频域上是两个序列的离散时间傅里叶变换的卷积。

     

                                                                        图1-7 原始信号

                                                                   图1-8 窗函数

                                                                   图1-9 加窗后的信号

      使用不同的时间窗,它的时域形状和频域特征是不相同的。在这,介绍三种常见的窗函数的时域表达形式,以及它们的时域窗形状和频域特征。这三种窗分别是矩形窗、汉宁窗和平顶窗。它们的时域表达形式如下表所示,并且假设时间窗的范围为0≤t≤T,如果时间t的取值区间不同,窗函数的表达形式也会略有差异。

                                                                        图1-10 几种窗函数

       矩形窗、汉宁窗和平顶窗的时域形状和频域特征如下图所示,可以看出,窗函数不同,时域和频域都是不同的。

                                                            图1-11 几种窗函数的时域形状和频域特征

       为了减少泄漏,可采用不同的窗函数来进行信号截取,因而,泄漏与窗函数的频谱特征相关的。窗函数的典型频谱特征如下图所示:

                                                           图1-12 几窗函数的典型频谱特征

代码请参考 一下代码在很多实际工程中用过,C语言实现快速傅立叶(FFT)(二)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法与数据结构】376、LeetCode摆动序列

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题难点在于要考虑到不同序列的情况,具体来说要考虑一下几种特殊情况: 1、上…

4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

今天我们学习灯光类 首先来学习Light类,它是所有灯光的虚基类,该类是无法创建的,主要是为子类提供很多公共属性。 常用属性如下所示: ambientColor : color,该属性定义在被该光照亮之前应用于材质的环境颜色。默认值…

oracle 锁表解决办法

相关表介绍 V$LOCKED_OBJECT(记录锁信息的表)v$session(记录会话信息的表)v$sql(记录 sql 执行的表)dba_objects(用来管理对象,表、库等等) 查询锁表的 SID select b.…

Cockpit upload文件上传漏洞(CVE-2023-1313)

0x01 产品简介 Cockpit 是一个自托管、灵活且用户友好的无头内容平台,用于创建自定义数字体验。 0x02 漏洞概述 Cockpit assetsmanager/upload接口处存在文件上传漏洞,攻击者可通过该漏洞在服务器端任意上传代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x0…

基于SpringBoot的语言课学习系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的语言课学习系统,java项…

Web开发伴侣 Prepros 7.17 Crack

您友好的 Web 开发伙伴,Prepros 编译您的文件、转译您的 JavaScript、重新加载您的浏览器并 使开发变得非常容易测试您的网站,以便您可以专注于制作 他们完美。 编译一切 Prepros 可以编译 Sass、Less、Stylus、Pug/Jade、Haml、Slim、CoffeeScript 和 …

linux中core调度器

背景 开始把core调度器当成了linux的主调度器,导致查找网上资料时总觉得对不上,最后从linux的rust文档中明白了,core调度器是为了解决超线程场景下缓存漏洞(如mds、L1HF)而存在的。简单来说就是一个cpu上同时运行两个…

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息,但还有另一种叫做微调(fine-tuning)的技术,也是给它更多信息的一种方式。特别是,如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大,那…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输,我们在网上获取到的影像一般都是分块的,正式使用之前需要对这些影像进行拼接,这里为大家介绍一下ArcGIS Pro中拼接影像的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累? 使用大珩助手中的素材库功能,将Word中的,或系统中的文本文件、图片、其他word文档、pdf,所有见到的好素材,一键收纳。 步骤:选中文件,按住鼠标左键拖到素材库界面中&…

微服务架构之争:Quarkus VS Spring Boot

在容器时代(“Docker时代”),无论如何,Java仍然活着。Java在性能方面一直很有名,主要是因为代码和真实机器之间的抽象层,多平台的成本(一次编写,随处运行——还记得吗?&a…

轻松入门:Python 中的 Scipy 库初探

写在开头 Python在科学计算领域中的强大地位得益于其丰富的库和工具,而Scipy库则是这个生态系统中的一颗璀璨明珠。本文将带你轻松入门Scipy库,深入探索其基本用途和功能。 1.scipy库的简介 Scipy库是Scientific Python的缩写,是建立在Num…

虚拟电厂 能源物联新方向

今年有多热?据上海市气象局官微消息,5月29日13时09分,徐家汇站气温达36.1℃,打破了百年来的当地5月份气温*高纪录。不仅如此,北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

什么是PSR标准?有哪些常见的PSR标准?

PSR 是 PHP Standard Recommendation(PHP 标准推荐)的缩写,是由 PHP-FIG(PHP Framework Interop Group)组织提出并维护的一系列 PHP 编程规范。这些规范旨在促进 PHP 生态系统中各种项目的互操作性和可维护性。以下是一…

Gitee:远程仓库步骤

第一步:新建仓库 第二步:初始化本地仓库,git init 创建分支 git branch 新分支名 第三步:git add . :添加到暂存区 第四步:git config –global user.email关联邮箱,user.name用户名 第…

LeetCode137. Single Number II

文章目录 一、题目二、题解 一、题目 Given an integer array nums where every element appears three times except for one, which appears exactly once. Find the single element and return it. You must implement a solution with a linear runtime complexity and u…

用python编写九九乘法表

1 问题 我们在学习一门语言的过程中,都会练习到编写九九乘法表这个代码,下面介绍如何编写九九乘法表的流程。 2 方法 (1)打开pycharm集成开发环境,创建一个python文件,并编写第一行代码,主要构建…

WX小程序案例(一):弹幕列表

WXML内容 <!--pages/formCase/formCase.wxml--> <!-- <text>pages/formCase/formCase.wxml</text> --> <view class"bk bkimg"><!-- <image src"/static/imgs/ceeb653ely1g9na2k0k6ug206o06oaa8.gif" mode"scal…

coffee:使用AI构建和迭代React UI速度提高10

该项目的目的不仅仅是一个漂亮的演示&#xff0c;而是一个可以编写生产质量代码并与之交互的人体工学工具。 特征 适用于任何 React 代码库&#xff0c;包括 Next.js、Remix 等。对于大多数标准 UI 组件来说足够可靠支持最简单的 prop 类型&#xff08;数据、回调等&#xff…