[文/告别年代   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的更多相关文章

  1. 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)

    对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...

  2. 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2978  Solved: 1523[Submit][Status][Di ...

  3. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  4. FFT NNT

    算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...

  5. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  6. ECF R9(632E) & FFT

    Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...

  7. fft练习

    数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...

  8. FFT时域与频域的关系,以及采样速率与采样点的影响

    首先对于FFT来说,输入的信号是一个按一定采样频率获得的信号序列,而输出是每个采样点对应的频率的幅度(能量). 下面详细分析: 在FFT的输出数据中,第一个值是直流分量的振幅(这样对应周期有无穷的可能 ...

  9. 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

    前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...

  10. 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; ...

随机推荐

  1. 快速切题 poj3026

    感受到出题人深深的~恶意 这提醒人们以后...数字后面要用gets~不要getchar 此外..不要相信那个100? Borg Maze Time Limit: 1000MS   Memory Lim ...

  2. Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划

    固定执行计划-使用SPM(Sql Plan Management)固定执行计划 转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sq ...

  3. DBLookupComboBox 的初始值

    http://www.yourdelphi.com/topic_234544_e6b7.htm 试下在form的oncreate中加入 dblookupcombobox1.keyvalue:=tabl ...

  4. foreach的使用原理简单解析

    数组可以foreach遍历,这个是在jdk1.5之前就可以的,我也不太清楚是怎么做到的. 后面的List,Set等的foreach都是实现Iterable接口,基于iterator()对象实现的.Fo ...

  5. 获取bean的两种方式

    BeanFactory方式: 1: public void testFactory(){ ResourcePatternResolver rpt=new PathMatchingResourcePat ...

  6. jQuery的noConflict以及插件扩展

    一.noConflict函数 JavaScript有很多插件,如果jQuery对象的$与其他插件冲突,我们可以使用noConflict()方法去掉$或者使用其他的符号代替 注:noConflict() ...

  7. 如何修改tomcat端口以及tomcat热部署

    一.修改tomcat端口 1.首先我们需要知道,http的默认端口是80,tomcat的默认端口是8080,也就是说,如果我们将tomcat的默认端口号修改为80,输入网址的时候就可以不用输入端口了, ...

  8. 拦截器interceptors

    拦截器interceptors 1. 基于HandlerMapping,对请求实施拦截,根据业务需求,基于不同的HandlerMapping定义多个拦截器 2. HandlerInterceptor接 ...

  9. jsp:incloud用法

    为什么要用jsp:incloud 因为单独一个页面太大,需要嵌套子页面,当请求有父页面的时候,子页面会自动加载<jsp:include page="/agentProfitShareN ...

  10. scanf格式化中的\n

    如果一个scanf的格式串以\n结尾,那么在读取完后还会阻塞等待,比如: int a; scanf("%d\n", &a); 这种情况,输入一个数字然后敲下回车后,程序还是 ...