实数DFT,复数DFT,FFT

FFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换成2个(N/2+1)点的频域信号,其中1个(N/2+1)点的信号称之为实部,另一个(N/2+1)点的信号称之为虚部,实部和虚部分别是正弦和余弦信号的幅度。

相比较而言,复数DFT将2个N点的时域信号转换为2个N点的频域信号。时域和频域中,1个N点信号是实部,另1个N点信号是虚部。

如果要计算N点实数DFT,则将这个N个点作为时域中的实部,另取N个0点作为时域的虚部,用FFT计算这样一个复数信号的DFT得到2个N点的频域信号,1个N点是实部另1个N点是虚部,在这两个N点的信号中,从0到N/2个点就是须计算的N点实数的DFT频域。

对于实数DFT来说,就像前几章讲的那样,它的频域也是离散周期信号,其周期为N点,从0到N/2点和1-N到-1点具有对称性,这个你可以从下面一张图看出。图中坐标不是用N表示是用采样频率的分数表示,如果你看不懂,请看前面几章。

所以你如果用FFT反变换计算的是实数时域,则要满足上图的对称性。
--------------------------------
FFT如何工作

FFT的计算可以分为三步:首先将1个N点的时域信号分成N个1点的时域信号,然后计算这N个1点时域信号的频域,得到N个频域的点,然后将这个N个频域的点按照一定的顺序加起来,就得到了我们需要的频谱。这里每个点的意思是复数,都有实部和虚部。

第一步的信号分解按照下面的规律执行:

可以看出它是按照比特反转顺序来分解的。

第二步是计算每个点的频谱:
这一步很简单,因为一个时域的点的频谱的数值就是它自己,所以这一步什么也不需做,但需明白这时候N个点不是时域信号了,而是频域信号。

第三步是将这N个频域信号结合起来
这一步是最麻烦的一步。就是和前面时域分解的顺序相反,将2个1点的频域信号变成1个2点的频域信号,再将2个2点的频域信号变成1个4点的频域信号,一直到结束。这里看下如何将2个4点的频域信号变成1个8点的频域信号。

首先对1个4点的频域信号进行复制,这样能稀释时域信号,也对另1个4点的频域信号进行复制不过复制之前需要乘上正弦函数,这样得到的稀释时域信号时经过了平移的,然后将这两个频域信号加起来,如下图所示。之所以这么做的目的是在时域分解的时候就是用这种交织的分解方式的。

以下是基本的运算,称为蝶形运算,它将2个1点的复数变成1个2点的复数。

以下是FFT运算的流程图

--------------------------------
运算速度比较
如果用相关方法计算DFT:


如果用FFT方法计算DFT:



FFT的速度还能更快
比如使用基4或者基8,这样不是2点一计算,而是4点或者8点一计算,可以提高速度。
--------------------------------
FFT对DSP来说就像是晶体管对电子学来说,都是领域的基础,每个人都知道怎么使用它们,但是只有很少一部分真正了解它们的原理。

事实就是这样,你只要知道怎么用就可以了。

FFT快速傅立叶变换的工作原理的更多相关文章

  1. spoj VFMUL FFT快速傅立叶变换模板题

    题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...

  2. FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus

    Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: th ...

  3. FFT快速傅立叶变换

    //最近突然发现博客园支持\(\rm\LaTeX\),非常高兴啊! 话说离省选只有不到五天了还在学新东西确实有点逗…… 切到正题,FFT还是非常神奇的一个东西,能够反直觉地把两个多项式相乘的时间复杂度 ...

  4. FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain

    您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:

  5. 离散傅立叶变换与快速傅立叶变换(DFT与FFT)

    自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...

  6. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  7. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  8. BZOJ 2194 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

  9. 快速傅立叶变换(FFT)

    多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...

随机推荐

  1. 升级MySQL支持utf8mb4字符集详细步骤

    原文:http://lib.csdn.net/article/mysql/4607 第一步:全备份所有数据库 [root@openfire1 mysql]# mysqldump -u root -p ...

  2. scp lost connection

    将本机的文件copy到远程时, scp -r /home/Projects/test.rpm root@172.1.1.1:/root; 我们得到了一个错误:lost connection lost ...

  3. MapReduce中作业调度机制

    MapReduce中作业调度机制主要有3种: 1.先入先出FIFO      Hadoop 中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业. 2.公平调度器(相当于时间 ...

  4. Java 7 命令/工具 jcmd 使用详细解释

    常见功能 列出 Java 进程 PID 以及 名称 列出进程的 thread dump 得到进程的 heap dump 得到进程的 JVM 参数 具体如下: 列出 Java 进程 PID 以及 名称 ...

  5. c++ 对象内存分配和虚函数

    1. c++类对象(不含虚函数)在内存中的分布 c++类中有四种成员:静态数据.非静态数据.静态函数.非静态函数. 1. 非静态数据成员放在每个对象内部,作为对象专有的数据成员 2. 静态数据成员被抽 ...

  6. matlab cross 3*1 向量叉乘

    一定是1*3  或者3*1 的向量才可以叉乘 A=[1 2 3] B=[4 5 6] cross(A,B) ans=[-3 6 -3] 解决机器人微分运动量之间的等价关系

  7. features recreate的含义

    就是从数据库里导出这个features的代码块.

  8. phalcon: acl权限控制

    目录控制: public/index.php: $di['aclResource']=function(){ return include_once '../app/config/frontbackA ...

  9. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

  10. Android要点记录

    1.Toolbar不能上滑隐藏的原因<!--如果在CoordinatorLayout加上android:fitsSystemWindows="true",而不是在AppLay ...