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]
最新文章
- C++的内存泄漏检测
- HTML5 获取地理位置信息
- OpenCV整体的模块架构
- aspx页面,中文乱码解决方案
- centos7 安装mariaDB 以及 phpmyadmin的安装
- JQuery 解决 鼠标快速滑过后,会执行多次滑出的问题
- 有关ARM大小端及网络字节序
- 【百度地图API】如何进行地址解析与反地址解析?——模糊地址能搜索到精确地理信息!
- Android在未来对 Java 8 特性的支持
- Python设计TFTP客户端
- 2015 多校联赛 ——HDU5416(异或)
- 浅析PHP正则表达式的利用技巧
- Elastic 基础篇(2)
- LOJ117 有源汇有上下界最小流(上下界网络流)
- Flask web开发之路二
- docker+mysql基本搭建过程
- mysql判断两个时间段是否有交集
- R入门(一)
- 关于Unity中Mesh网格的详解
- [朴孝敏][Sketch]
热门文章
- 快速切题 poj2488 A Knight's Journey
- web项目中的路径问题
- SpingBoot二——引入MySql数据库
- SharePoint BDC(Business Data Connectivity)服务-PowerShell
- 数据库SQL优化大总结之 百万级数据库优化方案(转载)
- rem 移动端适配
- easyui 定义的右键菜单 在 浏览器中 失效.
- 如何在win10(64位系统)上安装apache服务器
- 安装python第三方库
- VM中 Ubuntu14.04 中Samba的安装配置和使用