FFT原理(基2DIT-FFT)及C语言编程思路及实现
1.FFT原理(fast Fourier transform)
首先说明:采用的是基2时域抽取法(Decimation-In-Time FFT 简称DIT-FFT)。
FFT实际上是对DFT的一种快速实现算法,实质上就是对DFT抽取,以8点DFT为例:可以分解为两个4点DFT,在继续分解为4个两点DFT,从而缩小DFT运算量,提高运算效率。(因此首先需要理解DFT算法和它的一些基本性质(周期性等))。
注意:FFT需要的采样点数要是个,若采样点数不够则需要补零处理。
具体算法推导过程如下:
最终得到的蝶形流图如下:
2.c语言算法实现
(1)原位计算:简单理解就是每一级蝶形运算计算的结果存储到原来的存储单元就行,这样可以节省内存,降低成本。
(2)旋转因子规律
首先需要明确FFT一定是对个点进行FFT。下面以N=8为例寻找规律。根据鲽形流图,可以将
分为M级蝶形运算。具体推导如下:
下面是一个16点的蝶形流图,可以用来验证一下
(3)蝶形运算规律
已经知道旋转因子的规律了,接下来需要推导蝶形运算的规律。首先需要有一个跨度的概念(这里用B表示跨度),观察上面的8点,16点的流图,我们可以发现如下规律:
当L=1时:进行蝶形运算的两点跨度(距离)为1,这里记作B=1。
当L=2时:进行蝶形运算的两点跨度(距离)为2,这里记作B=2。
当L=3时:进行蝶形运算的两点跨度(距离)为4,这里记作B=4。
当L=4时:进行蝶形运算的两点跨度(距离)为8,这里记作B=8。
依次类推:则第L级跨度为:。
因此最终得到如下蝶形运算形式:
(5)序列的倒序
上面所进行的所有操作都是在对采样点进行重新排序之后进行的,在进行上述操作前需要对序列进行重新排序(倒序)以N=8为例输入为x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)。需要重新排序为x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7)。这个操作就叫做倒序。首先观察下面16点的正序和倒序的二进制图如下:
i相对容易,每一行只需要加1就可以,j如果从左往右看其实本质上也是加1,因此问题难点实质上在于右边如何从8到4到12等等。这里关键是权重的概念,讲起来可能相对困难,这里大家可以结合下面的代码,调试观察,尝试几组数据之后相信一定可以理解。
框图:
#include<stdio.h>int main()
{int N;printf("请输入需要倒序的个数:"); scanf("%d",&N); int a[N];int i=0;//原始数据赋值 for(i=0;i<N;i++)a[i]=i;printf("原始数据值为");for(i=0;i<N;i++)printf("%-4d",a[i]);printf("\n");int lh=N/2,j=lh,n1=N-2;int index,k;//重新排序部分 for(i=1;i<n1;i++){if(i<j){index=a[j];a[j]=a[i];a[i]=index;}k=lh;while(j>=k){j=j-k;k=k/2;}j=j+k;}printf("倒序数据值为");for(i=0;i<N;i++)printf("%-4d",a[i]);return 0;
}
(6)最终程序框图
到这里,需要明确对于个点,共有M级,每一级需要进行N/2此蝶形运算。第L级有
个旋转因子。可以带入到前文的流图中进性验证。具体框图入下(重点和难理解的是第三层循环,可以代入值进去理解):
(7)关于旋转旋转因子的c语言处理思路
同时需要说明:fft进行的运算都是复数运算,因此进行的加减乘除都是复数的加减乘除。但一般在硬件上输入信号都是由ADC采集的实数信号,因此我们见到的大部分输入都是数值,但其实也可以是复数输入。
(8)完整程序放在这里,大家可以免费下载参考。
DIT-FFT算法c语言实现-C文档类资源-CSDN下载
(9)matlab验证
3.Reference
参考华东理工大学大学万永菁老师讲的数字信号处理。想要详细学习的可以取找视频学习。
所写内容都是自己下学习fft的过程,其中可能有一些错误,如发现 还望大家指正。
FFT原理(基2DIT-FFT)及C语言编程思路及实现相关推荐
- 基于c语言编程思路的实践与探索,C语言程序设计趣味教学探索与实践
张竞丹 王乐 江武汉 范金坪 管明祥 摘要:"C语言程序设计"是高等职业教育中计算机.电子专业的专业基础课程,在其专业课程体系中具有重要的作用.文章针对高职院校"C语言程 ...
- 十分钟搞懂基-2 FFT原理及编程思想
0.写在最前 写本文的目的一是为了帮人理清FFT算法思路,二是有几个疑问(在5总结部分提到)希望得到解答.看懂本文的基础:至少听说过.简单了解过傅里叶变换.离散傅里叶变换(DFT).基于时间抽取的基2 ...
- 基二FFT时间抽取和频域抽取算法
目录: 一.理解离散傅立叶变换(FFT结果的物理意义(编程参考用)) 二.基二频域算法原理 三.基二FFT的C语言实现(时域) 四.基二FFT的C语言实现(频域) ------------------ ...
- 离散傅里叶变换及matlab实现(按时间抽选(DIT)的基-2 FFT算法(库利-图基算法))
转,傅里叶变换,很好的解释 很好的文章,可惜水平太差,还没有完全理解. 快速傅里叶的matlab实现 按时间抽选(DIT)的基-2 FFT算法(库利-图基算法) 傅里叶要用到的nn个复数,不是随机找的 ...
- FFT原理——详细推导理解FFT变换
概要: FFT(Fast Fourier transform):快速傅里叶变换,是DFT的工程化实现方法. DFT直接求解太过于复杂,FFT方法根据DFT求解过程中旋转因子的性质并引入分治算法思想,大 ...
- 1024点fft原理及fpga实现
1024点fft原理及fpga实现 关于傅里叶变换的原理,可以参考以下的博文: 如何理解傅里叶变换公式. FFT即快速傅里叶变换,是有限长序列作离散傅里叶变换(DFT)的快速算法. DFT公式为 X[ ...
- 按时间抽选(DIT)的基-2 FFT算法(库利-图基算法)C++程序
基-2 FFT算法的C++程序,按时间抽选.输入倒位序.输出自然顺序,N=2LN=2^LN=2L #include <complex>int fft(complex<double&g ...
- FFT原理 C++实现简单FFT代码
傅里叶变换的意义 为什么我们要用正弦曲线来代替原来的曲线呢? 用正余弦来表示原信号会更加简单,因为正余弦拥有其他信号所不具备的性质:正弦曲线保真度.一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度 ...
- (2)DFT和FFT原理与实现
目录 1.图像变换 2.离散傅里叶变换(Discrete Fourier Transform) 3.DFT性质 4.DFT与数字图像处理 5.FFT-快速傅里叶变换 6.DFT与FFT的算法实现 1. ...
最新文章
- 2017软件工程实践第二次作业(数独)
- linux下.rar的文件,Linux下.rar压缩文件处理 (RAR 4.11 for linux )
- 将TensorFlow模型变为pb——官方本身提供API,直接调用即可
- 转:linux设置进程优先级
- 软件工程心理学之3---甲方项目负责人 PK 乙方
- leetcode 1178. Number of Valid Words for Each Puzzle | 1178. 猜字谜(bitmask位运算)
- Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?
- android签到功能模块,基于android的课堂签到系统.doc
- 【kafka】Kafka ConsumerOffsetChecker 命令失效问题解决 卡死
- Eclipse Maven编译报不支持muti-catch
- 微服务化的基石--持续集成
- Linux正则表达式
- css在透明的背景下显示白色字体
- ALexa网站排名查询
- 人生若只如初见,碧海青天夜夜心
- 钟表维修管理系统技术解析(七) 保修记录、条件分页查询
- 系统分析员要了解什么知识?
- 机器学习中的概率分布
- 互联网思维(三)——产业思维
- 概率论与数理统计(3):二维随机变量及其分布
热门文章
- 攻防世界 -- very_easy_sql
- c语言最短加法链问题回溯法,《回溯法习题》PPT课件.ppt
- 教你如何使用tftpd32烧录内核及文件系统镜像到nand flash
- php libev 主动发送,libev学习笔记
- Excel批量替换,多个excel文件批量查找和替换的绿色工具,Excel多个Sheet批量替换
- GIS教程之在 R 中使用 Leaflet 的交互式地图
- 德国VS瑞典 2:0
- 网页天气预报源码(天气预报插件)
- 掌上题库V1.2.2全开源版本小程序带后端
- 【通讯录教程】如何大批量导入手机号码到手机的通讯录,下面教你方法