快速傅里叶变换(FFT)——按时间抽取DIT的基

目录

    • 【1】前言
      • 1、DIF计算量
      • 2、利用性质改善
    • 【2】公式推导
      • 1、N 到 2*N/2
        • a、分解原序列
        • b、分解后的DFT变换
        • c、一系列化简操作之后
        • d、蝶形信号流
        • e、计算量总结
      • 2、N/2 到 2*N/4
        • a、分解X2(k)序列
        • b、蝶形信号流(2列)
      • 3、N/4 到 2*N/8
        • a、蝶形信号流(3列)
    • 【3】公式总结
    • 【4】特点以及程序框架讲解
      • 1、原址运算
      • 2、倒位序规律
      • 3、蝶形运算两节点的距离
      • 4、WN^r的确定
      • 5、程序框架
    • 【5】代码实现

【1】前言

1、DIF计算量

公式
更加清楚地了解计算步骤:
公式
观察可知:
1、一次复数乘法需用四次实数乘法和二次实数加法;
2、一次复数加法需二次实数加法
3、整个 DFT 运算总共需要 4N^2 次实数乘法和 2N*(2N—1)次实数加法。
总结:
直接计算 DFT,乘法次数和加法次数都是和 N^2 成正比的。

2、利用性质改善

性质
利用这些性质,将较大的N分解为若干个较小的N然后进行运算。

【2】公式推导

1、N 到 2*N/2

a、分解原序列

1

b、分解后的DFT变换

2
3

c、一系列化简操作之后

4

d、蝶形信号流

1
以N=8的序列为例:
2

e、计算量总结

因而通过第一步分解后, 总共需要(N^2/2)+(N/2)=N(N+l )/2约等于 N^2/2 次复数乘法和 N( N/2-1 )+N = N^2/2 次 复数加法。由此可见,通过这样分解后的运算工作量差不多节省了一半。

2、N/2 到 2*N/4

a、分解X2(k)序列

1

b、蝶形信号流(2列)

在这里插入图片描述

3、N/4 到 2*N/8

a、蝶形信号流(3列)

在这里插入图片描述

【3】公式总结

由于乘法的运算量较大,我们从乘法角度来探讨一下,DFT和FFT的运算量。
设N=2^M;有M列的蝶形信号运算。
在这里插入图片描述
从乘法角度:DFT需要N^2,FFT需要N*lbN;
j计算
当N=2048时,这一比值为372.4,即直接计算DFT的运算量是FFT运算量的372.4倍。
当点数N越大时,FFT的优点更为明显。

【4】特点以及程序框架讲解

1、原址运算

运算
计算之后,将新的X(k)覆盖原本的X(k)。
注意:是将同一行的X进行覆盖(后面的列覆盖前面的列),不同行之间是没有覆盖关系的。
所以,最后只需要N个存储单元。(N个数据,N行)

2、倒位序规律

输出X(k),序列正常。
输入序列不正常。
原因:X(n)按照标号n的奇偶而不断分组。
例子:
1
步骤流程:
I+1,最低位+1,向左进位。
J在二进制最高位+1,逢2向右进位。
由此可以从当前的倒序值计算求得下一个倒序值。
3
观察变址处理,可以发现,只有当J>I时,才将X(I)和X(J)存储内容进行互换。

3、蝶形运算两节点的距离

输入为倒位序,输出为正位序,N=2^ M,在第m级运算,两个节点间的距离为2^(m-1);

4、WN^r的确定

r的变换规律:
1、运算两个节点中第一个节点标号为k,表示为M位的二进制数。
2、将此二进制数乘以2^(M-m),相当于左移M-m位,把右边空出,此数位r的二进制数。

5、程序框架

流程框架

【5】代码实现

没有验证代码的正确性,只是按照上面的流程图进行叙述。

#define PI 3.14159//数位倒读
int rev(int i, int m) {//i=0~2^m,m为二进制位数 int j = 0;while (m > 0) {j += (i & 0x01) * (0x01 << (m - 1));//j+=(i%2)*mypow(2,m-1);i >>= 1;//i/=2m -= 1;}return j;
}//快速傅里叶变换
//输入x(n)、N
//输出X(k)
void fft(const float real_in[], const float imag_in[], float real_out[], float imag_out[],int N) 
{//【1】获取Mint M = log2(N);	//【2】倒序for (int i = 0;i < N;i++) {//数位倒读 int j;j = rev(i, M);real_out[j] = real_in[i];imag_out[j] = imag_in[i];}//【3】for (int m = 1;m <= M;m++){int B = 2 ^ m - 1;for (int J = 0;J <= B - 1;J++){int P = 2 ^ (M - m) * J;for (int k = J;k <= N - 1;k++){float tmpr1, tmpi1, tmpr2, tmpi2;//临时变量float theta = -2 * PI * P / N ;tmpr1 = real_out[k];tmpi1 = imag_out[k];tmpr2 = cos(theta) * real_out[k + B] - sin(theta) * imag_out[k + B];tmpi2 = cos(theta) * imag_out[k + B] + sin(theta) * real_out[k + B];real_out[k] = tmpr1 + tmpr2;imag_out[k] = tmpi1 + tmpi2;real_out[k + B] = tmpr1 - tmpr2;imag_out[k + B] = tmpi1 - tmpi2;}}}
}

参考资料:

《数字信号处理第三版.刘顺兰版》

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

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

相关文章

Python字符串| 带示例的format()方法

String.format()方法 (String.format() Method) format() method is used to format the string (in other words - we can say to achieve the functionality like printf() in C language). format()方法用于格式化字符串(换句话说&#xff0c;我们可以说实现了C语言中类似于…

PLSQL Developer使用技巧

1、PL/SQL Developer记住登陆密码在使用PL/SQL Developer时&#xff0c;为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码&#xff1b;设置方法&#xff1a;PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History &#xff0c; “St…

3月份的总结

租房子找了个黑中介&#xff0c;各种扣钱&#xff0c;合租的违约了&#xff0c;押金不要了直接一走了之&#xff0c;水费我们承担&#xff0c;中介这会儿又把责任推得一干二净&#xff0c;还耍小聪明&#xff0c;非说我是两个人住的&#xff0c;各种费用要交两份。。。我一时气…

快速傅里叶变换(FFT)——按频率抽取DIF的基

目录【1】回顾DIT【2】算法原理【3】运算特点【1】回顾DIT https://blog.csdn.net/qq_42604176/article/details/105559756 【2】算法原理 设序列点数&#xff1a;N2^M,M为正整数。将输入序列按照前一半、后一半分开。&#xff08;并非按照奇偶分&#xff09; 由于&#xf…

02.2-元素定位(XPath)

XML路径语言用来确定XML文档中某部分位置的语言XPath用于在XML文档中通过元素和属性进行导航XPath遵守W3C标准XPath节点类型&#xff1a; 元素、属性、文本、命名空间、指令处理、注释、文档 通过路径表达式从XML文档中选取节点或节点设置 表达式结果说明/xxx选取根节点xxx/xx…

android ImageView 之 android:scaleTye=

原文&#xff1a;http://juliaailse.iteye.com/blog/1409317 1、scaleType“matrix” 是保持原图大小、从左上角的点开始&#xff0c;以矩阵形式绘图。 2、scaleType“fitXY” 是将原图进行横方向&#xff08;即XY方向&#xff09;的拉伸后绘制的。 3、scaleType“fitStart…

acquire方法_Python锁类| 带有示例的acquire()方法

acquire方法Python Lock.acquire()方法 (Python Lock.acquire() Method) acquire() is an inbuilt method of the Lock class of the threading module in Python. acquisition()是Python中线程模块的Lock类的内置方法。 This method is used to acquire a lock, either block…

VSS2008 安装silverlight3.0步骤

需要的Q我359273753 我是新手不知道在哪里上传附件 汗一个转载于:https://www.cnblogs.com/ganler1988/archive/2011/03/17/1987367.html

php字符串对象,PHP字符串到对象名称

好的我有一个字符串……$a_string "Product";我想在调用这样的对象时使用这个字符串&#xff1a;$this->$a_string->some_function();狄更斯如何动态调用该对象&#xff1f;(不要以为我在PHP 5心中)解决方法:所以你要使用的代码是&#xff1a;$a_string &quo…

莫比乌斯函数---C++

【问题描述】 莫比乌斯函数&#xff0c;数论函数&#xff0c;由德国数学家和天文学家莫比乌斯(Mobius&#xff0c;1790-1868)提出。梅滕斯(Mertens)首先使用μ(n)作为莫比乌斯函数的记号。而据说&#xff0c;高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数。莫比乌斯函数在数…

Opencv——findContours函数再探(由轮廓联想连通域)

目录关于调参的一些思考分析图像的一些角度面积、周长、矩形度、圆形度、宽长比例1&#xff1a;找出汽车轮毂圆孔&#xff08;从轮廓和连通域两个角度&#xff09;例2&#xff1a;找出芯片中间正方形物体例3&#xff1a;桌面上橘色物体总结关于调参的一些思考 合理的参数设置&…

stl vector 函数_vector :: crend()函数以及C ++ STL中的示例

stl vector 函数C vector :: crend()函数 (C vector::crend() function) vector::crend() is a library function of "vector" header, it is used to get the first element of a vector from reverse ending, it returns a const reverse iterator pointing to th…

.Net DateTime.ToString 格式化输出 (转载)

原文 虽然 System.DateTime 本身已经具有了不少现成的格式化输出&#xff0c;例如&#xff1a; ToLongDateString, ToShortTimeString, ToUniversalTime 等&#xff0c;但是却远远不能满足我们实际的需要&#xff0c;这就要用到了 DateTime.ToString&#xff0c;就要提到 DateT…

modelsim 编译 xilinx库

1.为单个工程加入库 在某一个目录建立工程 然后 vlib unisim vcom -work unsim *.vhd 然后就加入了unisim库 如果是windows的话&#xff0c;工程文件mpf应该是记录了这个库的信息&#xff0c;所以重新打开这个工程时&#xff0c;依然有这个库 linux&#xff0c;不用gui界面…

php 字符串匹配 like,ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法...

搜索热词ThinkPHP的数据库条件查询语句有字符串式&#xff0c;数组式书写方法字符串式即是原生式&#xff0c;数组式查询语句因书写方式与特定字符的原因比较复杂&#xff0c;下面为大家例出了常用的ThinkPHP数组式查询语句的使用方法ThinkPHP一般查询$data_gt[id]array(gt,8);…

C++---汉明距离

两个整数之间的汉明距离指的是这两个数对应二进制位不同的位置的数目。 【输入形式】 给出两个整数x和y(0<x,y<2^31)&#xff0c;用空格分隔 【输出形式】 输出他们之间的汉明距离 【样例输出】 1 4 【样例说明】 00000000 00000000 00000000 00000001 00000000 00000000…

Opencv基础画图函数——line、circle、rectangle、Rect、ellipse、polylines、putText函数的用法

目录1、line函数2、circle函数3、rectangle、Rect函数4、ellipse函数5、polylines函数6、随机初始化颜色7、putText函数总结1、line函数 line(img,(0,0),(511,511),(255,0,0),5)这个函数有5个参数&#xff0c;img是图像名称&#xff0c;起点坐标&#xff0c;终点坐标&#xff…

GCC 里面的一些命令

记录一下常用GCC 相关的命令和参数 ldd ---> print share library dependenciy LD_LIBRARY_PATH---> environment variable, it will search the path accord to this variable. Also check the ldd to verify this environmental variable ldconfig-----> configure…

理解关联容器“map”的关键点

map有一个构造函数: map<k, v> m(b, e); 《C Primer》解释为&#xff1a;“创建 map 类型的对象 m&#xff0c; 存储迭代器 b 和 e 标记的范围内所有元素的副本&#xff0c;元素的类型必须能转换为 pair<const k, v>”&#xff0c;这个构造函数理解起来没有另外两个…

c语言中图形驱动程序功能_C / C ++中的图形:一些更有趣的功能

c语言中图形驱动程序功能In this Advance Learning Tutorial of C / C today, we are going to tell you about some of the functions that can be used to make the program more attractive. This works on both text and graphics modes. That is why knowing these funct…