FFT算法和DFT算法C语言实现(赋详解)

2023-11-05

声明:

本人在校期间主修过《数字信号处理》这门课程
对离散傅里叶变换(DFT)和快速傅里叶变换(FFT)深有了解
现编写了基于C语言的FFT算法,已完成对抽样序列的FFT变换并通过窗口输出。

编写思路:

由于FFT变换里面含有对虚数的运算,现将输出序列定义成一个结构体函数
结构体函数里面包含输出序列的实部和虚部,并定义处理复数运算的几种函数
快速傅里叶变换的核心在于倒序运算和蝶形运算
现将倒序运算和蝶形运算的核心思想用代码的形式表现出来

代码部分

## 倒序代码:

for (int I = 1; I < N1; I++)						//定义倒序序列函数
	{
		if (I < J)
		{
			T = x[I];
			x[I] = x[J];
			x[J] = T;
		}
		K = LH;
		if (J >= K)
		{
			do
			{
				J = J - K;
				K = K / 2;
			} while (J >= K);
		}
		J = J + K;
	}

## 倒序代码解释:

用J表示当前倒序数的十进制数值。
对于N=2^M,M位二进制数最高位的十进制权值为N/2,且从左向右二进制位的权值依次为N/4,N/8,……,2,1。
因此,最高位加一相当于十进制运算J+N/2。如果最高位是0(J<N/2),则直接由J+N/2得下一个倒序值;
如果最高位是1(J>=N/2),则先将最高位变成0(J=J-N/2),然后次高位加1(J+N/4)。
但次高位加1时,同样需要判断0、1值,如果为0(J<N/4),则直接加1(J=J+N/4),否则将次高位变成0(J=J-N/4),再判断下一位;
依次类推,直到完成最高位加1,逢2向右进位的运算

## FFT代码:

for (L = 1; L <= M; L++)							//FFT运算
	{
		B = (int)(pow(2, L - 1));
		for (J = 0; J < B; J++)
		{
			P = (int)(J*pow(2, M - L));
			for (k = J; k < N; k = (int)(k + pow(2, L)))
			{
				K1 = k + B;
				complex wn, t;
				Wn_i(N, P, &wn);
				c_mul(f[K1], wn, &t);					//。。。。。。。。。。。。
				c_sub(f[k], t, &(f[K1]));				//蝶形运算
				c_plus(f[k], t, &(f[k]));				//。。。。。。。。。。。。
			}
		}
	}

## FFT代码解释:

第L级中,每个蝶形的两个输入数据相距B=2^(L-1)个点
每级有B个不同的旋转因子;同一旋转因子对应着间隔为2^L点的2^(M-1)个蝶形
先从输入端(第1级)开始,逐级进行,共进行M级运算
在进行第L级运算时,依次求出B个不同的旋转因子,每求出一个旋转因子,就计算完它对应的所有2^(M-L)个蝶形

## 复数函数定义与运算代码部分:

void c_plus(complex a, complex b, complex *c)			//复数加法
{
	c->real = a.real + b.real;
	c->imag = a.imag + b.imag;
}
void c_sub(complex a, complex b, complex *c)			//复数减法
{
	c->real = a.real - b.real;
	c->imag = a.imag - b.imag;
}
void c_mul(complex a, complex b, complex *c)			//复数乘法
{
	c->real = a.real*b.real - a.imag*b.imag;
	c->imag = a.real*b.imag + a.imag*b.real;
}

void Wn_i(int n1, int i, complex *Wn)				//定义FFT旋转因子
{
	Wn->real = cos(2 * PI*i / n1);
	Wn->imag = -sin(2 * PI*i / n1);
}

查看完整代码请点击这里

## 完整代码实现的功能:

1.基础功能:
 - 可自定义序列的抽样点数 
 - 对序列进行FFT和DFT运算输出
2.拓展功能:
 - 在定义抽样点的基础上比较DFT运算和FFT运算的时间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFT算法和DFT算法C语言实现(赋详解) 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • docker的安装(yum/rpm/二进制/shell/)

    1 yum安装 官方推荐 参考以下文档安装即可 https docs docker com engine install centos https mirrors tuna tsinghua edu cn help docker ce 2
  • PyQty5—第三课:按钮与函数绑定(2)(附完整代码)

    在上一节课中 我们已经学会了将按钮与函数进行绑定 从而自己可以对函数进行扩展 那么今天我们将会学习另一个方法将按钮与函数进行绑定 上一节课的复习链接 点我 gt PyQty5 第二课 首相我们把上一节课的代码中的绑定函数以及对象注释掉 代码
  • win10关闭自动屏保

    https blog csdn net u010560236 article details 108462946 1 桌面空白处点击鼠标右键 显示设置 电源和睡眠 如下都设置了 从不 然而不起作用 还是会自动锁屏 2 桌面空白处点击鼠标右键
  • java调用dll

    本文转自 http www blog edu cn user4 jjj250 archives 2007 1722308 shtml Jawin Java Win32 是一个免费的 开放源代码的体系结构 用于 Java 组件和通过 Wind
  • eclipse中java代码在控制台输出的中文内容是乱码怎么解决

    eclipse中创建了一个maven工程 用System out在控制台输出内容 但中文内容显示乱码 解决方法 右键单击工程 选择Run As gt Run Configurations 点击Common这个tab页 Encoding选择U
  • 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展 为了用户友好体验 大部分网站使用了JavaScript脚本设计 如果您的浏览器禁用或关闭的JavaScript支持 那么可能造成网站体验差或网站部分功能无法使用 下面提供10种浏览器如何开启JavaScript的方法
  • python整数位数能无限大么_在计算机中,整数不能无限大。为什么呢?

    非常感谢邀请 就我个人的浅薄知识回答一下题主的疑问 先简单地回答题主的问题 我猜测题主可能是在学习了C语言之后对 int 类型变量的数值表示范围有限制而产生的疑问 就我的理解 整数不能无限大有两个原因 受限于机器字长与机器中的整数表示方式
  • 2015/4/28总结--git编辑文件---sts创建动态工程

    1 在git 中创建并编辑文件的命令如下 cd touch test txt vi touch test txt 编辑完成时先按Esc退出键 再输入 wq即可保存并退出编辑 2 在spring Tool Suite中创建动态的web 工程
  • muduo net库学习笔记7——用于创建服务器的类TcpServer

    muduo为每个EventLoop设计了runInLoop和queueInLoop函数用来将本该在其他线程执行的线程不安全函数放到它所属线程执行 从而达到线程安全 muduo采用采用one loop per thread的设计思想 即每个线
  • python+opencv分类器训练模型,运动物体识别检测,无人机识别(源码直接下载可用)

    一 简介 使用opencv traincascade 分类器的训练模型包括两个主要阶段 模型的训练阶段和检测阶段 本文档概述了训练自己的弱分类器的级联所需的功能 当前指南将逐步完成所有不同阶段 收集训练数据 准备训练数据并执行实际模型训练
  • Es6基础知识,非常适用前端工作者

    Es6是javascript 的新标准 变量声明 et 1 let声明的关键字和var 声明的基本一致 2 let声明的关键字是局部作用域 只在一对 中启用 3 let声明的变量不会存在变量提升 先把所有变量和函数提升到最前面 变量同意赋值
  • MockMvc测试和spring boot视图开发

    文章目录 导入配置 使用步骤 1 Model准备 2 创建控制器 3 Web测试的支持 视图 JSP 开发 配置文件 编写控制器 环境配置 自定义过滤器 导入配置 pom xml
  • 深度学习中的深度前馈网络简介

    几乎所有的深度学习算法都可以被描述为一个相当简单的配方 特定的数据集 代价函数 优化过程和模型 在大多数情况下 优化算法可以定义为求解代价函数梯度为零的正规方程 我们可以替换独立于其它组件的大多数组件 因此我们能得到很多不同的算法 通常代价
  • unity服务器无响应什么意思,Unity客户端 - 服务器基本问题

    我应该听什么端口 我应该担心的港口 转发 这是一个短语我经常看到卡住的 这是给你的 你可以使用任何你想要的端口 正确的做法是为您的游戏选择约10端口 然后选择1端口作为默认端口 例如 我们从端口10000至10010中选择 让我们将端口10
  • opencv学习历程5 ---- 处理像素点的三种方法

    ConsoleApplication1 cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • 算法基础——大O表示法

    本期主题 算法的大O表示法 目录 1 什么是大O表示法 2 时间复杂度 2 1 时间复杂度定义 2 2 常见算法的时间复杂度 3 数组与链表对比 1 什么是大O表示法 大O表示法是一种特殊的表示方式 指出了算法的速度 指出了最糟情况下的运行
  • 无刷直流风扇PWM调速接线教程(1)

    这是一款服务器使用的大功率无刷轴流风扇 采用的是两个风机级联的方式 提高风压与空气流量 能够快速带走机箱内的热量 正因为如此 这款风扇的功率 转速以及噪音都十分的 暴力 所以有的朋友喜欢称之为 暴力风扇 可以通过图片看到这款风扇的线束有8根
  • 融云出海:两极分化的网红大户「拉美」如何出海制胜

    8 月 17 日 本周四 融云直播课从排查问题到预警风险 社交产品如何更好保障体验 留住用户 欢迎点击报名 处于世界另一端的拉美市场 近些年逐步成为了出海新兴目的地的代表区域 关注 融云全球互联网通信云 了解更多 这里有热衷社媒的网红大国
  • keil5同一个程序编译出来的bin文件大小不一样

    起因 在用一个别人的程序时 出现了设备死机的现象 但是同样的程序别人使用没有问题 经过排查发现生成的bin文件大小和别人的不一样 开始以为是keil和keil编译器的版本不同的问题 但是换成相同的版本还是不行 最后发现是keil配置的优化等
  • FFT算法和DFT算法C语言实现(赋详解)

    声明 本人在校期间主修过 数字信号处理 这门课程 对离散傅里叶变换 DFT 和快速傅里叶变换 FFT 深有了解 现编写了基于C语言的FFT算法 已完成对抽样序列的FFT变换并通过窗口输出 编写思路 由于FFT变换里面含有对虚数的运算 现将输