[文/告别年代   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. 0SGU 128 snake (&& ZOJ 3521) 尺取,排序二叉树,线段树 难度:2

    128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N points given by ...

  2. artDialog 弹窗提示

    artDialog 弹窗提示,方便调用,不用去查文档了. /// <reference path="../../Scripts/artDialog5.0/artDialog.min.j ...

  3. Pycharm(五)安装库和虚拟环境

    随便进入一个项目 进入设置    Ctrl + alt + S Project *********  - Project Interpreter     ******是你的项目名字 Project I ...

  4. Pycharm(一)下载安装

    https://www.python.org/downloads/windows/ 这里下载python,建议2.7,3.6都下载 Download Windows x86 web-based ins ...

  5. Swift网络封装库Moya中文手册之Authentication

    Authentication 安全验证可能有点复杂,一些网络请求需要认证,这里我们讨论两种常见的. Basic HTTP Auth HTTP auth是HTTP协议自带的用户名/密码验证.如果你使用的 ...

  6. 玩转X-CTR100 | STM32F4 l Malloc内存管理

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      内存管理技术,即内存的申请和释放,使用X- ...

  7. 不使用ref

    为什么 尽量避免ref? 使用ref原因:react功能来访问DOM元素,这种功能的需求往往来自于提交表单的操作,再提交表单的时候,需要读取当前表单中input元素的值 而react的产生就是为了避免 ...

  8. Redis 缓存服务器

    Redis 服务器 Remote Dictionay Server   Redis是一个key-value持久化产品,通常被称为数据结构服务器. Redis的key是string类型:value可以是 ...

  9. 【转】游戏buff设计参见

    其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...

  10. kafka集群安装,配置

    1.安装+配置(集群) 192.168.0.10.192.168.0.11.192.168.0.12(每台服务器kafka+zookeeper) # kafka依赖java环境,需要提前安装好jdk. ...