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…

Web开发伴侣 Prepros 7.17 Crack

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

翻译: 为什么需要微调大模型 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…

虚拟电厂 能源物联新方向

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

Gitee:远程仓库步骤

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

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

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

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…

​LeetCode解法汇总1631. 最小体力消耗路径

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你准备参…

【Linux】使用官方脚本自动安装 Docker(Ubuntu 22.04)

前言 Docker是一种开源平台&#xff0c;用于开发、交付和运行应用程序。它利用了容器化技术&#xff0c;使开发人员能够将应用程序及其依赖项打包到一个称为Docker容器的可移植容器中。这些容器可以在任何运行Docker的机器上快速、一致地运行&#xff0c;无论是开发环境、测试…

make没有更新最新的uImage

在 LCD 驱动的时候发现&#xff0c;linux logo一直弄不出来&#xff0c;猜想可能是因为uImage的问题&#xff0c;就看了一眼 uImage 时间&#xff1a; ​ 我现在的时间是 &#xff0c;那可能就是没有更新make的时候没有更新&#xff0c;就上网搜了一下用下面的命令输出 uImage&…

数据结构(七):树介绍及面试常考算法

一、树介绍 1、定义 树形结构是一种层级式的数据结构&#xff0c;由顶点&#xff08;节点&#xff09;和连接它们的边组成。 树类似于图&#xff0c;但区分树和图的重要特征是树中不存在环路。树有以下特点&#xff1a; &#xff08;1&#xff09;每个节点有零个或多个子节点…