目录

  • 【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、分解原序列

b、分解后的DFT变换


c、一系列化简操作之后

d、蝶形信号流


以N=8的序列为例:

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)序列

b、蝶形信号流(2列)

3、N/4 到 2*N/8

a、蝶形信号流(3列)

【3】公式总结

由于乘法的运算量较大,我们从乘法角度来探讨一下,DFT和FFT的运算量。
设N=2^M;有M列的蝶形信号运算。

从乘法角度:DFT需要N^2,FFT需要N*lbN;

当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的奇偶而不断分组。
例子:

步骤流程:
I+1,最低位+1,向左进位。
J在二进制最高位+1,逢2向右进位。
由此可以从当前的倒序值计算求得下一个倒序值。

观察变址处理,可以发现,只有当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;}}}
}

参考资料:

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

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

  1. 快速傅里叶变换(FFT)的推导过程(DIT)

    FFT是一种快速计算DFT的算法.按时间抽选的基-2FFT推导过程如下: 首先给出DFT的计算公式: X(k)=DFT[x(n)]=∑n=0N−1x(n)WnkN X ( k ) = D F T [ ...

  2. python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)

    离散傅里叶变换(discrete Fouriertransform)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规 ...

  3. OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测

    OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...

  4. Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1. 定义 2. 变换和处理 3. 函数 4. 实例演示 例1:单频正弦信号(整数周期采样) 例2:单频正弦信号(非整数周期采样) 例3:含有直流分量的单频正弦信号 例4:正弦复合信号 例5 ...

  5. Java编程实现快速傅里叶变换FFT

    快速傅里叶变换的时间复杂度分析 1 快速傅里叶变换FFT 1.1 理论分析 1.1.1 离散傅里叶变换 1.1.2 快速傅里叶变换 1.2 编程实现 1.2.1 算法思想 1.2.2 实验结果 1 快 ...

  6. 快速傅里叶变换FFT C语言实现 可用于嵌入式系统进行模拟采样频谱分析

    快速傅里叶变换C语言实现 模拟采样进行频谱分析 FFT是DFT的快速算法用于分析确定信号(时间连续可积信号.不一定是周期信号)的频率(或相位.此处不研究相位)成分,且傅里叶变换对应的 ω \omega ...

  7. 离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)

    目录 离散傅里叶变换 (DFT) 离散傅里叶变换的基 离散傅里叶变换 快速傅里叶变换 (FFT) 卷积 线性时不变系统 傅里叶级数 参考文献 离散傅里叶变换 (DFT) 离散傅里叶变换的基 对于周期为 ...

  8. matlab cftool光滑曲线导出为什么就不光滑了_快速傅里叶变换(FFT)中为什么要“补零”?...

    为了大家能够复现各个图中的结果,我附上了所有我编写的MATLAB代码. 创作不易,未经允许,禁止转载. 另外,说明一下,用MATLAB做FFT并不要求数据点个数必须为以2为基数的整数次方.之所以很多资 ...

  9. Python信号处理小试牛刀——快速傅里叶变换(FFT)

    输入:仿真一个理想的多频信号y,频率为3Hz.10Hz,然后在这个理想信号上添加一个白噪声,得到一个带有白噪声的多频信号y_noise: 处理过程:分别对两个信号进行快速傅里叶变换得到对应的频谱图: ...

最新文章

  1. Redis应用案例,查找某个值的范围(转)
  2. SSO单点登录三种情况的实现方式详解
  3. 【NOIP普及组】2016模拟考试(10.29)——排座椅
  4. HALCON示例程序classify_image_class_knn.hdev使用KNN分类器对多通道图像进行分割
  5. js input 自动换行_深入Slate.js - 拯救 ContentEditble
  6. swift语言 数组定义_如何在Swift中声明弱引用数组?
  7. oracle多用户导出导入用法
  8. UVA10229 Modular Fibonacci 【循环数列】
  9. jQuery点击文本框复制其内容到剪贴板上
  10. 放弃大厂高薪的程序员,涌进体制内
  11. java获取文本文件的编码格式
  12. 22.基于深度学习的车型识别方法及系统实现
  13. Java之时间格式转换
  14. 互动媒体技术——processing旋转方块(不同角度的旋转)
  15. 台式机就是指什么的计算机,什么是台式机操作系统
  16. 医学统计学笔记之设计
  17. python plt 内存_python-创建matplotlib图形后如何释放内存
  18. 人生的三把钥匙,太经典了!
  19. 副屏幕全屏_win7双屏电脑主屏副屏设置|Win7系统如何设置双屏显示?
  20. 如何截取视频中的一部分制作成GIF动态图

热门文章

  1. 前端常见浏览器兼容性问题及解决办法
  2. 初级前端工程师笔试技巧总结,祝你顺利拿高分
  3. webpack——概念的引入
  4. 页面重构-让我们的布局自适应
  5. CentOS6.4 Install FTP
  6. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
  7. 网页上线后音频不能自动播放
  8. 下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s=a+b+c+d;
  9. 怎么解决xp系统不能安装NET Framework4.0?
  10. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用