c++快速傅里叶变换、反变换(FFT、IFFT)
初步了解快速傅里叶变换、反变换的处理过程。
C++语言编写
#include <math.h> //编写头文件,还可采用#include "***"方式编写头文件#include <malloc.h>//添加需要使用到的头文件#define pi (double)3.14159265359 //定义所需要的参数变量typedef struct{double re;//定义double类型的变量double im;}COMPLEX;//COMPLEX是一个类型,可以用来定义变量//计算权重COMPLEX Add(COMPLEX c1, COMPLEX c2)//加法函数{COMPLEX c;c.re=c1.re+c2.re;c.im=c1.im+c2.im;return c;}COMPLEX Sub(COMPLEX c1, COMPLEX c2)//减法程序{COMPLEX c;c.re=c1.re-c2.re;c.im=c1.im-c2.im;return c;}COMPLEX Mul(COMPLEX c1, COMPLEX c2)//乘法程序{COMPLEX c;c.re=c1.re*c2.re-c1.im*c2.im;c.im=c1.re*c2.im+c2.re*c1.im;return c;}void FFT(COMPLEX * TD, COMPLEX * FD, int power)//快速傅里叶变换{//COMPLEX * TD: 指向时域数组的指针
//COMPLEX * FD: 指向频域数组的指针
//int power: 2的幂数,即迭代次数int count;//傅里叶变换点数int i,j,k,bfsize,p;//循环变量i,j,k和中间变量bfsize,pdouble angle;//角度COMPLEX *W,*X1,*X2,*X;count=1<<power;//计算傅里叶变换点数W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2);//分配运算所需要的存储器X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count);X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count);for(i=0;i<count/2;i++)//计算加权系数{angle=-i*pi*2/count;W[i].re=cos(angle);W[i].im=sin(angle);}memcpy(X1,TD,sizeof(COMPLEX)*count);//将时域点写入x1for(k=0;k<power;k++)//采用蝶形算法惊醒快速傅里叶变换{for(j=0;j<1<<k;j++){bfsize=1<<power-k;for(i=0;i<bfsize/2;i++){p=j*bfsize;X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]);}}X=X1;X1=X2;X2=X;}for(j=0;j<count;j++)//重新排序{p=0;for(i=0;i<power;i++){if (j&(1<<i)) p+=1<<power-i-1;}FD[j]=X1[p];}free(W);//释放内存free(X1);free(X2);}void IFFT(COMPLEX *FD, COMPLEX *TD, int power)//快速傅立叶反变换//COMPLEX *TD: 指向时域数组的指针
//COMPLEX *FD: 指向频域数组的指针
//int power: 2的幂数,即迭代次数{int i,count;//定义循环变量和傅里叶变换点数COMPLEX *x;count=1<<power;//计算傅里叶变换点数x=(COMPLEX *)malloc(sizeof(COMPLEX)*count);//分配运算所需要的存储器memcpy(x,FD,sizeof(COMPLEX)*count); //将频域点写入xfor(i=0;i<count;i++) //求共轭{x[i].im=-x[i].im;}FFT(x,TD,power); //调用快速傅里叶变换函数for(i=0;i<count;i++) //求时域点共轭{TD[i].re/=count;TD[i].im=-TD[i].im/count;}free(x); //释放内存}
c++快速傅里叶变换、反变换(FFT、IFFT)相关推荐
- 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
多项式表示法与卷积 多项式有两种表示方法 系数表示法 点值表示法 系数表示法 就是最普通的表示方法,如 f(x)=a0x0+a1x1+a2x2+......+an−1xn−1f(x) = a_0x^0 ...
- 快速傅里叶变换(FFT)的C#实现及详细注释
快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...
- 快速傅里叶变换 (FFT)基础
参考博文 频谱分析是一种将复杂信号分解为较简单信号的技术. 首先来很清楚几个概念: FT(Fourier Transformation): 傅里叶变换.其时域信号.频域信号都是连续的. DTFT(Di ...
- 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)
整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...
- 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...
- 数字信号处理知识点总结(四):快速傅里叶变换(FFT)
本篇文章主要介绍快速傅里叶变换(FFT)的优化原理,基-2FFT算法的推导.实现及用FFT实现的线性卷积. 主要参考知乎[精品讲义]-快速傅里叶变换(Fast Fourier Transformati ...
- 卷积和快速傅里叶变换(FFT)的实现
卷积运算 卷积可以说是图像处理中最基本的操作.线性滤波通过不同的卷积核,可以产生很多不同的效果.假如有一个要处理的二维图像,通过二维的滤波矩阵(卷积核),对于图像的每一个像素点,计算它的领域像素和滤波 ...
- 快速傅里叶变换(FFT)详解
快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...
- 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1
目录 介绍 傅里叶变换和卷积 FFT 介绍 我们将继续讨论频率分析以及如何用频率分量的概念来研究图像.如果你还记得上次我们讲过的基于频率的图像分解的概念.我们通过给你们看这张照片来回忆它(如图).这是 ...
- DIT和DIF实现快速傅里叶变换的FFT
DIT和DIF实现快速傅里叶变换的FFT 数字信号处理课程老师要求做的一个小程序,在此分享~ %***************基2的DIF&DIT-FFT算法***************** ...
最新文章
- 8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
- scp: /usr/java: Permission denied
- 大牛推荐的15本学习数据分析挖掘的好书
- SAP CRM WebClient UI和Hybris Commerce的懒加载机制
- ac 梦幻布丁 启发式合并
- jmxtrans安装使用
- 跨站脚本攻击之反射型XSS漏洞【转载】
- ActionErrors和ActionError
- 高德地图如何取消订单_一文教你如何爬取高德地图
- Linux查看最后一页日志,linux常用查看文件或日志命令
- 知识点二十五:启发式搜索算法——A*算法
- 长江存储一笔高额投资,让SK海力士开始钻研我国专利法
- 详谈GoLang的panic和error
- 反问疑问_反问疑问句
- html聊天室ui,震惊!这个H5居然是在线聊天室!(内附完整教程)
- Xilinx基于PCIE的部分重配置实现(一)
- python爬取武汉二手房房价
- 飞机大战游戏制作思路
- 解决input输入框与select下拉框水平不对齐
- 室内定位技术(四)——产品研发进度