Real FFT
[文/告别年代 Email:byeyear@hotmail.com]
FFT算法是针对复信号的,而现实场景中很多时候时域是实信号,此时有两种办法加快FFT的速度。
1. 使用一个N点的复FFT同时处理两个N点的实序列
假定我们有两个N点的实序列x[n]和y[n],它们的FFT具有如下性质:实部偶对称,虚部奇对称。因此可将它们的FFT写为如下形式:
x[n] --F--> Nyquist以下部分:a+bi;Nyquist以上部分:a-bi
y[n] --F--> Nyquist以下部分:c+di;Nyquist以上部分:c-di
将这两个实信号拼成一个复信号z=x+yi,因FFT变换满足加法和乘法组合定理,z的FFT变换如下:
z[n] --F--> Nyquist以下部分:p+qi = a+bi+i(c+di) = (a-d)+(b+c)i,即实部p=a-d, 虚部q=b+c
Nyquist以上部分:s+ti = a-bi+i(c-di) = (a+d)+(-b+c)i,即实部s=a+d, 虚部t=-b+c
于是我们可以从z[n]的变换结果p+qi和s+ti分离出x[n]和y[n]的FFT结果:
a=(p+s)/2
b=(q-t)/2
c=(q+t)/2
d=(-p+s)/2
下面是一个稍微正式点的推导:
取z[n]=x[n]+iy[n]
那么:
x[n]=(z[n]+z[n]*)/2
y[n]=-i(z[n]-z[n]*)/2
将上式变换到频域,设x,y,z,z*的FFT系数分别为Fx,Fy,Fz*:
Fx=(Fz+Fz*)/2
Fy=-i(Fz-Fz*)/2
现在来看如何简便地获得Fz*:
Fz*= ∑z[n]*e-jk(2π/N)n
= ∑z[n]*{e+jk(2π/N)n}*
= {∑z[n]e+jk(2π/N)n}*
= {∑z[n]e+jk(2π/N)n-2π}*
= {∑z[n]e-j(N-k)(2π/N)n}*
因此,Fz*[k]=(Fz[N-k])*
代入上面的Fx和Fy即可。
2. 使用一个N/2点的复FFT处理一个N点的实序列



上式中将时域序列拆分为两个序列:偶序列fe和奇序列fo,我们可以发现这实际上就是FFT算法推导过程的第一步。
我们已经看过如何用一个N点复FFT计算两个N点实FFT,因此FFTN/2(k,fe)和FFTN/2(k,fo)的求解不是问题:



回顾下开头的式子:

上述三个式子组合一下:

这个就是我们需要的结果。
至此差不多可以完工了,除了F(0)和F(N/2):这两个值在上式中需要用到Z(N/2)。
根据DFT的周期性,N/2点的复序列FFT满足Z(0)=Z(N/2),于是F(0)和F(N/2)也有了。
并且对于偶数长度实序列,F(0)和F(N/2)都是实数(实序列FFT满足FFT[k] = FFT*[n-k]),所以可以把F(N/2)放在F(0)的虚部,这样N点实序列FFT可以用N/2个复数完全表示。
[文/告别年代 Email:byeyear@hotmail.com]
Real FFT的更多相关文章
- 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...
- 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2978 Solved: 1523[Submit][Status][Di ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- FFT NNT
算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
- ECF R9(632E) & FFT
Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...
- fft练习
数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...
- FFT时域与频域的关系,以及采样速率与采样点的影响
首先对于FFT来说,输入的信号是一个按一定采样频率获得的信号序列,而输出是每个采样点对应的频率的幅度(能量). 下面详细分析: 在FFT的输出数据中,第一个值是直流分量的振幅(这样对应周期有无穷的可能 ...
- 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...
- FFT
void FFT(complex a[],int n,int fl){ ,j=n/;i<n;i++){ if (i<j) {complex t=a[i];a[i]=a[j];a[j]=t; ...
随机推荐
- VGA
VGA(Video Graphics Array )视频图形阵列,是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高.显示速率快.颜色丰富等优点,在彩色显示器领域得到了广泛的应用 ...
- (转载)Java 自动装箱与拆箱、equals和==的比较
什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...
- Java——String类
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 2.3 C++类的信息隐藏机制 -- 封装
参考:http://www.weixueyuan.net/view/6335.html 总结: private.protected和public 限制类中声明的变量和函数在外部的访问权限. 声明为p ...
- UNIX设备文件
UNIX和Linux中比较重要的三个设备文件是:/dev/console,/dev/tty和/dev/null. 0 /dev/console 这个设备代表的是系统控制台,错误信息和诊断信息通常会被发 ...
- PHP出现Cannot modify header information问题的解决方法
在C盘的WINDOWS中找到php.ini 这个配置文件,然后查找一项:output_buffering将其值由原来的off改为on,重新启动Apache就ok了.
- UITableViewCell的高度与UILabel自适应
UITableViewCell内部只放了一个UILabel,Cell的高度随着UILabel内容的高度变化而变化,可重写UITableView的委托方法动态调整高度,还要设置UILabel.numbe ...
- ubuntu16安装mysql图形界面
之前在windows用sqlyog当做图形界面连接mysql,现在在ubuntu上需要连接测试环境的数据库,需要安装mysql图形界面.安装只需要条命令: sudo apt-get update su ...
- Express文件上传之Multer
Express文件上传之Multer Multer是一个nodejs中间件,用来处理http提交multipart/form-data,也就是文件上传.它是在busboy的基础上开发的. 在我看来,M ...
- JS禁止用F5键
//禁止用F5键 function document.onkeydown() { if ( event.keyCode==116) { event.keyCode = 0; event.cancelB ...