MPI程序实例:FFT算法及应用

news2024/12/25 14:20:55

目录

一、一维串行FFT算法

二、二维串行FFT算法

三、并行FFT算法

四、应用示例

4.1、多项式相乘

4.2 循环矩阵方程组的求解


        1965年,两位美国科学家J.W.Cooley和J.W.Tukey发明了一种有效计算傅氏变换的方法,被称为FFT(Fast Fourier Transform,快速傅里叶变换),该算法在众多科学与工程计算中起着至关重要的作用,是20世纪计算科学的重要贡献之一。这里我们将对FFT串行算法、并行实现及FFT的应用进行介绍。

        FFT快速计算:

y_{k}=\sum_{j=0}^{n-1}x_{j}e^{-\frac{2\pi ijk}{n}},k=0,1,\cdots,n-1.\;\;\;\;\;\;\;\;\;(1)

其中i^{2}=-1。记w(n)=e^{-\frac{2\pi i}{n}},则w(n)^{k}是方程x^{n}=1的根。下面的性质成立:

(1)\;\;(w(n)^{k})^{n}=1\\ (2)\;\;w(n)^{2}=w(n/2)\\ (3)\;\;w(n)^{n/2}=-1

        记Y=(y_{0},y_{1},\cdots,y_{n-1})^{T},X=(x_{0},x_{1},\cdots,x_{n-1})^{T},\Omega_{kj}=w(n)^{kj},公式(1)的计算过程可以写成矩阵乘向量的形式Y=\Omega X。因此,直接计算公式(1)需要O(n^{2})个浮点运算。由于w(n)具有特殊性,假设n=2m,则公式(1)可以分为以下的计算过程

\left\{\begin{matrix} y_{k}=\sum_{j=0}^{m-1}x_{2j}w(m)^{kj}+w(n)^{k}\sum_{j=0}^{m-1}x_{2j+1}w(m)^{kj}\\ y_{k+m}=\sum_{j=0}^{m-1}x_{2j}w(m)^{kj}-w(n)^{k}\sum_{j=0}^{m-1}x_{2j+1}w(m)^{kj}\;\;\;\;\;\;\;\;\;\;\;\;(2)\\ k=0,1,\cdots,m-1 \end{matrix}\right.

假设T_{n}是计算所有y_{k}的计算量,由公式(2)有T_{n}=2T_{n/2}+3/2n,即T_{n}=3/2nlog_{2}n+n。在此讨论的算法中,假定数据的长度是n=2^{m}

一、一维串行FFT算法

        公式(2)是FFT的一种计算方法基础,可以通过递推的方式来完成其计算任务。在计算过程中,需要大量的数据移动,从而使得计算效率有所降低。为有效实现FFT方法,需要对数据进行重排序,使得新的数据顺序适合于计算过程。以n=8为例,计算过程的数据依赖关系如下图。图中可知,在进行FFT算法的执行过程中,需要对原始数据进行重排序,以利于计算。数据重新排列的规则是按位倒置(bit reverse)方式进行的,以n=16为例,按位倒置变换如下表所示。

FFT数据依赖关系
按位倒置变换
原始顺序 第一次 第二次 第三次 十进制
0000 0000 0000 0000 0
0001 1000 1000 1000 8
0010 0001 0100 0100 4
0011 1001 1100 1100 12
0100 0010 0001 0010 2
0101 1010 1001 1010 10
0110 0011 0101 0110 6
0111 1011 1101 1110 14
1000 0100 0010 0001 1
1001 1100 1010 1001 9
1010 0101 0110 0101 5
1011 1101 1110 1101 13
1100 0110 0011 0011 3
1101 1110 1011 1011 11
1110 0111 0111 0111 7
1111 1111 1111 1111 15

        假设n=2^{m},所有x_{j}按照按位倒置规则进行重新排序,记为y_{j}。令D(2k)=diag(w(2k)^{j}),j=0,\cdots,k-1,它是k阶对角矩阵。按照公式(2),在时间上进行大幅度减少(decimation in time,DIT)的FFT算法如下:

算法1

(1)置s=1,t=1,l=n/2

(2)计算所有长度为2t的变换l个,其中每个变换的形式为;

Y=\begin{pmatrix} I & D(2t)\\ I & -D(2t) \end{pmatrix}Y

(3)如果s<m,置

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

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

相关文章

java中StringBuffer类和StringBuilder类常用的api

目录 1.StringBuffer类Api 1&#xff09;.构造方法 2&#xff09;.append("添加的字符串内容") 3&#xff09;.insert(int 要添加数据到指定索引后,"要添加的字符串") 4&#xff09;.delete(int 起始索引位置,int 结束索引位置) 5&#xff09;.deleteCharA…

基于SpringBoot+Vue+Uniapp微信小程序的电子竞技信息交流平台设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

Nginx请求头丢失,引发出来的问题

1.问题 新增的几个 header 参数是这样的&#xff1a; api_key_idapi_key_value 我配置有2层nginx转发&#xff0c;从机器A到机器B再到目标服务&#xff0c;遇到一个接口请求需要在header中传递api_key_id和api_key_value这2个参数&#xff0c;但是在EC2机器上直接curl目标服…

重塑排班新体验,搭贝员工排班系统 —— 让管理更高效,工作更顺心!

在快节奏的工作环境中&#xff0c;排班管理往往是决定团队效率与员工满意度的关键。搭贝低代码平台精心打造的员工排班系统应用&#xff0c;以直观、智能、灵活为核心&#xff0c;为您的团队带来前所未有的排班体验。 &#x1f4c5; 日历视图&#xff0c;一目了然 我们采用…

论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models

摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力&#xff0c;也就是说&#xff0c;这些模型可以通过对由几个输入输出示例构建的提示进行条件反射&#xff0c;直接应用于解决大量下游任务。然而&#xff0c;先前的研究表明&#xff0c;由于训练示例、示例顺序和提示…

刷题小计六:矩阵

73.矩阵置零 mid 矩阵置零 ①先使用两个变量&#xff08;row_0 & col_0&#xff09;&#xff0c;记录「首行 & 首列」是否该被置零 ②在「非首行首列」的位置&#xff0c;存储置零信息到首行首列 // 把第一行第一列作为标志位for (int i 1; i < row; i) {for (…

电动牙刷拆解学习

大厂量产的产品的寻片选型为自己设计硬件的时候芯片选型提供了参考&#xff1a; 采用这个触点的方式充电相比于tppeC来说可以很好起到防水作用&#xff1a; USB公头&#xff1a; 牙刷母头&#xff1a; 电池充电芯片来自英集芯&#xff0c;型号IP2326&#xff0c;是一颗内部集…

执行node.js获取本机Ip命令,报:Error: Cannot find module ‘ip‘错误

Error: Cannot find module ip是由于没有改模块的依赖包&#xff0c;需要进行安装&#xff0c;以管理员的身份打开命令行&#xff0c;执行npm install ip 获取当前电脑的ip地址 方法一&#xff1a; const ip require("ip")/*** 1:获取当前电脑的ip地址*/ console.…

渗透测试之 域AD渗透手法【密码喷洒技术】手法详解 以及相关示例

说明: 域内密码喷洒工具: Kerbrute DomainPasswordSpray.ps1 原理抓个包分析一下&#xff1a; 域内用户枚举攻击防御&#xff1a; 流量检测&#xff1a; 说明: 域内密码喷洒&#xff08;Password Spraying&#xff09;一般和域内用户名枚举一起使用。 域内密码喷洒工具:…

slam系列1:open3d入门笔记

1. 读写数据 这里有很多测试用的pcd文件&#xff1a; https://github.com/PointCloudLibrary/data/blob/master/tutorials/ import open3d as o3d pcd o3d.io.read_point_cloud("test.pcd") o3d.io.write_point_cloud("write.pcd", pcd, True) # 默认fa…

SF6气体密度监测仪市场研究:主要企业的市场份额已超过37.13%

SF6气体密度监测仪是一种专用于监测和测量六氟化硫&#xff08;SF6&#xff09;气体密度的设备。SF6气体因其优异的绝缘性能和灭弧能力&#xff0c;被广泛应用于电力行业&#xff0c;尤其是在气体绝缘金属封闭开关设备&#xff08;GIS&#xff09;和断路器等关键设备中。随着电…

Java 函数式编程(1 万字)

此笔记来自于B站黑马程序员 good Java 历史版本及其优势 函数式编程, Stream API 一.函数伊始函数、函数对象 函数对象 行为参数法 延迟执行 a-lambda b-方法引用 复习小测 Math::random () -> Math.random()Math::sqrt (double number) -> Math.sqrt(number)Student:…

喜大普奔!eBay英国站取消个人卖家几乎所有销售费用!

二手电商市场竞争愈发激烈&#xff0c;eBay开始放大招了&#xff01;为什么说是取消个人卖家的几乎所有销售费用呢&#xff1f;一起来了解一下—— eBay英国站个人卖家无需支付最终交易费或监管运营费&#xff0c;这大大减轻了个人卖家的交易成本。不过需要注意的是&#xff0…

后端开发——规则引擎简介(Drools)

目录 什么是规则引擎&#xff1f;规则引擎带来的好处;Drools案例规则引擎的工作原理及应用场景常见的规则引擎及对比工作流引擎与规则引擎有什么不同 什么是规则引擎&#xff1f; 规则引擎&#xff0c;听起来高大上&#xff0c;其实可以理解为一种帮助你做“决策”的工具。你可…

使用浏览器原生API实现录屏功能

好早之前写了个小deme,本来都忘了,现在无意中又翻出来了,所以也来记录一下吧! 废话不说了,直接上代码了: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content=&q…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生&#xff1a; 最近开发项目的时候&#xff0c;遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候&#xff0c;有一个图片上传的接口&#xff0c;需要将byte[]转为MultipartFile 对象&#xff0c;但是发现根本没有这样的工具类&#xff0c;后面翻阅…

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…

数据结构与算法——Java实现 33.堆排序

刻意去找的东西&#xff0c;往往是找不到的。 天下万物的来和去&#xff0c;都有它的时间。 —— 24.10.10 使用堆进行排序 算法描述 1.heapify 建立大顶堆&#xff08;所有结点的父元素大于子元素&#xff09; 2.将堆顶与堆底交换(最大元素被交换到堆底)&#xff0c;缩小并…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

java反射Class类的api

目录 Class类 1.构造器相关 1&#xff09;Constructor getConstructor(Class... parameterTypes): 2&#xff09;Constructor[] getConstructors(): 3&#xff09;Constructor getDeclaredConstructor(Class... parameterTypes): 4&#xff09;Constructor[] getDeclaredConstr…