几种快速傅里叶变换(FFT)的C++实现
链接:http://blog.csdn.net/zwlforever/archive/2008/03/14/2183049.aspx
一篇不错的FFT 文章,收藏一下。
DFT的的正变换和反变换分别为(1)和(2)式。假设有N个数据,则计算一个频率点需要N次复数乘法和N-1次复数加法,整个DFT需要N*N次复数乘法和N(N-1)次复数加法;由于一次的复数乘法需要进行4次的实数乘法和2次的复数加法,一次的复数加法需要两次的实数加法,因此整个DFT需要4*N*N次的实数乘法和2*N(N-1)+2*N*N≈4*N*N次的复数加法。当N比较大时,所需的计算工作量相当大,例如N=1024时大约需要400万次乘法运算,对于实时信号处理来说,将对计算设备提出非常苛刻的要求,于是就提出如何能够减少计算DFT的运算量的问题。
大多数的FFT算法都是利用(3)式的周期性、共轭对称性、可压缩和扩展性的特点来压缩计算量。。
1)、根据DFT定义进行计算的代码
void dft(complex<double>*Data,int Log2N,int flag)
{
int i,j,length;
complex<double> wn;
length=1<<Log2N;
complex<double>*temp=new complex<double>(length);
for(i=0;i<length;i++)
{
temp[i]=0;
for(j=0;j<length;j++)
{
wn=complex<double>(cos(2.0*pi/length*i*j),sin(flag*2.0*pi/length*i*j));
temp[i]+=Data[j]*wn;
}
}
if(flag==1)
for(i=0;i<length;i++)
Data[i]=temp[i]/length;
delete[] temp;
}
2)、基2时间抽选FFT
把时域的数字信号序列按照奇偶进行分组计算,可以进行如下的变换,从变换结果可以知道,一个长度为N的DFT可以变换成长度为N/2的两个子序列的组合。依次类推,可以直到转为N/2个2点的傅立叶变化的组合。不过这时的输入应该为以2为基的倒位序。
由于经过多次的奇偶抽选,输入数据要按照基2倒序的原则进行重排,输出数据为正常顺序,倒序算法另外叙述。下面首先用递归的形式进行算法的描述,由于递归方法没有充分利用DIT2算法的优点---原位计算,因此递归形式只是为了描述的清晰。
{
complex<double>*EvenData=new complex<double>(length/2);
complex<double>*OddData =new complex<double>(length/2);
complex<double>*EvenResult=new complex<double>(length/2);
complex<double>*OddResult=new complex<double>(length/2);
int i,j;
if(length==1)
{
OutData[0]=InData[0]/N;
return;
}
for(i=0;i<length/2;i++)
{
EvenData[i]=InData[2*i];
OddData[i]=InData[2*i+1];
}
dit2rec(EvenData,EvenResult,length/2,sign);
dit2rec(OddData,EvenResult,length/2,sign);
for(i=0;i<length/2;i++)
{
OutData[i]=EvenData+OddData*complex<double>(cos(2*pi*i/length),sin(sign*2*pi*i/length));
OutData[i+length/2]=EvenData- OddData*complex<double>(cos(2*pi*i/length),sin(sign*2*pi*i/length));
}
delete[] EvenData,OddData,EvenResult,OddResult;
return;
}
{
int i,j,k,step,length;
complex<double> wn,temp,deltawn;
length=1<<Log2N;
for(i=1;i<=Log2N;i++)
{
wn=1;step=1<<i;deltawn=complex<double>(cos(2*pi/step),sin(sign*2.0*pi/step));
for(j=0;j<step/2;j++)
{
for(i=0;i<length/step;i++)
{
temp=Data[i*step+step/2+j]*wn;
Data[i*step+step/2+j]=Data[i*step+j]-temp;
Data[i*step+j]=Data[i*step+j]+temp;
}
wn=wn*deltawn;
}
}
if(sign==-1)
for(i=0;i<length;i++)
Data[i]/=length;
}
{
int i,j,k,step,length;
complex<double> wn,temp,deltawn;
length=1<<Log2N;
for(i=0;i<length;i+=2)
{
temp=Data[i];
Data[i]=Data[i]+Data[i+1];
Data[i+1]=temp-Data[i+1];
}
for(i=2;i<=Log2N;i++)
{
wn=1;step=1<<i;deltawn=complex<double>(cos(2.0*pi/step),sin(sign*2.0*pi/step));;
for(j=0;j<step/2;j++)
{
for(i=0;i<length/step;i++)
{
temp=Data[i*step+step/2+j]*wn;
Data[i*step+step/2+j]=Data[i*step+j]-temp;
Data[i*step+j]=Data[i*step+j]+temp;
}
wn=wn*deltawn;
}
}
if(sign==1)
for(i=0;i<length;i++)
Data[i]/=length;
}
void dif2rec(complex<double>*InData,complex<double>*OutData,int length,int sign)
{
complex<double>* LData=new complex<double>(length/2);
complex<double>* LResult=new complex<double>(length/2);
complex<double>* RData=new complex<double>(length/2);
complex<double>* RResult=new complex<double>(length/2);
complex<double> temp;
int i;
if(length==1)
{
OutData[0]=InData[0];
return;
}
for(i=0;i<length/2;i++)
{
LData[i]=InData[i];
RData[i]=InData[i+length/2];
}
for(i=0;i<length/2;i++)
{
temp=LData[i];
LData[i]=LData[i]+RData[i];
RData[i]=(temp-RData[i])* complex<double>(cos(2*pi*i/length),sin(sign*2*pi*i/length))
}
dit2rec(LData,LResult,length/2,sign);
dit2rec(RData,RResult,length/2,sign);
for(i=0;i<length/2;i++)
{
OutData[2*i]=LResult[i];
OutData[2*i+1]=RResult[i];
}
return;
}
void dif2(complex<double>*InData,int r,int sign)
{
int length=1<<r;
int i,j,k,step;
complex<double> temp,wn;
for(i=1;i<=r;i++)
{
step=1<<(r-i+1);
wn=1;
for(j=0;j<step/2;j++)
{
for(k=0;k<step/2;k++)
{
temp=InData[k*step+j];
InData[k*step+j]=InData[k*step+j]-InData[k*step+step/2+j];
InData[k*step+step/2+j]=(temp-InData[k*step+step/2+j])*wn;
}
wn=wn*complex<double>(cos(2*pi/step*j),sin(sign*2*pi/step*j));
}
}
}
和DIT一样,最外层的最后一个循环可以另外独立出来,因为最后一个循环没有必要进行复数运算,这样可以减少复数运算的次数。
基四时间抽选快速傅立叶算法
转载于:https://www.cnblogs.com/Free-Thinker/p/4759955.html
几种快速傅里叶变换(FFT)的C++实现相关推荐
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算 ...
- Java中实现快速傅里叶变换FFT
Java中实现快速傅里叶变换FFT 一.概述 1.傅里叶变换(FT) 2.离散傅里叶变换(DFT) 3.快速傅里叶变换(FFT) 1)单位根 2)快速傅里叶变换的思想 3)蝶形图 4)快速傅里叶变换的 ...
- OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测
OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...
- Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析
文章目录 1. 定义 2. 变换和处理 3. 函数 4. 实例演示 例1:单频正弦信号(整数周期采样) 例2:单频正弦信号(非整数周期采样) 例3:含有直流分量的单频正弦信号 例4:正弦复合信号 例5 ...
- Java编程实现快速傅里叶变换FFT
快速傅里叶变换的时间复杂度分析 1 快速傅里叶变换FFT 1.1 理论分析 1.1.1 离散傅里叶变换 1.1.2 快速傅里叶变换 1.2 编程实现 1.2.1 算法思想 1.2.2 实验结果 1 快 ...
- 快速傅里叶变换python_基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...
- 离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)
目录 离散傅里叶变换 (DFT) 离散傅里叶变换的基 离散傅里叶变换 快速傅里叶变换 (FFT) 卷积 线性时不变系统 傅里叶级数 参考文献 离散傅里叶变换 (DFT) 离散傅里叶变换的基 对于周期为 ...
- matlab cftool光滑曲线导出为什么就不光滑了_快速傅里叶变换(FFT)中为什么要“补零”?...
为了大家能够复现各个图中的结果,我附上了所有我编写的MATLAB代码. 创作不易,未经允许,禁止转载. 另外,说明一下,用MATLAB做FFT并不要求数据点个数必须为以2为基数的整数次方.之所以很多资 ...
- [模板] 快速傅里叶变换(FFT)
快速傅里叶变换FFT 多项式 转换 快速傅里叶变换 铺垫 定理 算法构建 IFFT 递归版FFT&IFFT 迭代版FFT&IFFT 蝴蝶效应 Code 后记 多项式 假设有nnn次多项 ...
最新文章
- 【深度学习】一个应用—肝脏CT图像自动分割(术前评估)
- ant-design圣诞彩蛋
- Solr7 安装部署 管理界面介绍
- PopsTabView--filter容器
- 去除Java字符串中的空格
- 如何在eclipse jee中创建Maven project并且转换为Dynamic web project
- android学习笔记---58_拖拉功能与多点触摸,实现图片的拖拉和缩放功能
- 深入css布局 (3)完结 — margin问题与格式化上下文
- 修改fstab导致linux无法启动的解决
- NFine框架踩过的坑
- 从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新
- 无刷直流电机学习笔记5
- linux command path fast switch,Oracle and Linux
- 信息安全快讯丨密标委发布信息系统密码应用基本要求;国家漏洞库关于微软多个安全漏洞的通报;支付宝检测到部分苹果用户ID被盗
- 书到用时方恨少,一大波JS开发工具函数来了
- Exp9 Web安全基础 20164302 王一帆
- 感冒发烧没想象中可怕:人体自我保护清除体内感染
- 根据月份,计算当月周数(非自然周)
- 笔记本电脑无法搜索到wifi
- 上网行为安全之深信服用户认证技术和用户、组管理
热门文章
- Hi,我们是-MobileNet-家族
- CNN看清世界——浅谈四个经典网络的差异
- android读写缓存文件路径,Android app-cache-Path的 缓存图片、缓存文件的路径包名路径 和外路径比较...
- mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
- 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_轻量化 | 如何让笨重的深度学习模型在移动设备上跑起来?看它!...
- android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法
- CentOS 7上安装 MongoDB数据库 4.0.0最新版
- 前端-面试题(答案仅限于自己的理解,非正确答案)
- vue自定义全局和局部指令
- 照着官网来安装openstack pike之neutron安装