// ConsoleTemplate.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <stdio.h>
#include <math.h>
#define N 8//1024//
#define M 310
#define PI 3.1415927
typedef struct comp_number
{
 double real;
 double img;
}comp_num;
int reverse(int p)
{
 int i,t=0;
 for(i=M-1;i>=0&&p;i--)
 {
  t+=(p%2)<<i;
  p/=2;
 }
 return t;
}
//复数相乘
comp_num comp_multy(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real*b.real-a.img*b.img;
 c.img=a.real*b.img+a.img*b.real;
 return c;
}
//复数相加
comp_num comp_add(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real+b.real;
 c.img=a.img+b.img;
 return c;
}
//复数相减
comp_num comp_minus(comp_num a,comp_num b)
{
 comp_num c;
 c.real=a.real-b.real;
 c.img=a.img-b.img;
 return c;
}
//comp_adjoint复数共轭
comp_num comp_adjoint(comp_num a )
{
 comp_num c;
 c.real=a.real;
 c.img= -a.img;
 return c;
}

void FFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N]);
void IFFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N]);

//int main(void)
int _tmain(int argc, _TCHAR* argv[])
{
 
 comp_num xt[N],cur_x[N],nex_x[N];
 comp_num W,sec;//蝶形运算的第二部分
 int i,j,k;
 int t,wn;
 double x;
 //初始化原始信号数据
 for(i=0;i<N;i++)
 {
  xt[i].real= 0.001*(i+1);//cos( 2* PI* 100* i)/**/;
  xt[i].img= 1;//0.0;
 }
 printf( "/n原结果:/n");

for(i=0;i<N;i++)
 {

if(xt[i].img>=0)
   printf("%lf+%lfi/n",xt[i].real,xt[i].img);
  else
   printf("%lf%lfi/n",xt[i].real,xt[i].img);
 }

//FFT变换
 FFT( xt,cur_x, nex_x);
 
 printf( "/nFFT结果:/n");

for(i=0;i<N;i++)
 {

if(cur_x[i].img>=0)
   printf("%lf+%lfi/n",cur_x[i].real,cur_x[i].img);
  else
   printf("%lf%lfi/n",cur_x[i].real,cur_x[i].img);

//为IFFT铺垫,保存
  nex_x[ i]=cur_x[ i];
 }
 
 //FFT逆变换
 IFFT( nex_x,cur_x, nex_x);

//cout<<"/nIFFT还原结果/n";
 printf( "/nIFFT还原结果/n");
 for(i=0;i<N;i++)
 {
  
  if(cur_x[i].img>=0)
   printf("%lf+%lfi/n",cur_x[i].real,cur_x[i].img);
  else
   printf("%lf%lfi/n",cur_x[i].real,cur_x[i].img);
 }

scanf("%f", i);
 return 0;
}

//FFT蝶形算法
//xt为原数据,cur_x为最后所求的数据,nex_x为中间变量
void FFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N])
{
 int i,j,k;
 int t,wn;
 double x;
 comp_num W,sec;//蝶形运算的第二部分

//调整数据顺序
 for(i=0;i<N;i++)
 {
  j=reverse(i);//反向进位法
  cur_x[j]=xt[i];
 }

//FFT
 for(i=0;i<M;i++)
 {
  t=1<<i;//间隔
  wn=t*2;//计算W变量
  for(j=0;j<N/wn;j++)
  {
   for(k=0;k<t;k++)//连续加号个数
   {
    x=2*PI*k/wn;
    W.real=cos(x);W.img=-sin(x);
    sec=comp_multy(W,cur_x[j*wn+t+k]);
    nex_x[j*wn+k]=comp_add(cur_x[j*wn+k],sec);
    nex_x[j*wn+t+k]=comp_minus(cur_x[j*wn+k],sec);
   }
  }
  for(j=0;j<N;j++)
   cur_x[j]=nex_x[j];
  
 }
}
//IFFT:调用FFT
//xt为原数据,cur_x为最后所求的数据,nex_x为中间变量
void IFFT( comp_num xt[N], comp_num cur_x[N], comp_num nex_x[N])
{
 int i;
 for(i=0;i<N;i++)
 {
  nex_x[ i]=comp_adjoint( xt[ i]);
 }

FFT( nex_x,cur_x, nex_x);

for(i=0;i<N;i++)
 {
  cur_x[ i]=comp_adjoint( cur_x[ i]);
  cur_x[i].real /= N; cur_x[i].img /= N;
 }
}

FFT蝶形算法,IFFT相关推荐

  1. 【signal】傅里叶分析和FFT蝶形算法

    Date: 2018.10.31 下面两篇文章对傅里叶分析和FFT蝶形算法的分析很好,特转载. https://www.cnblogs.com/luoqingyu/p/5930181.html htt ...

  2. 使用FFT来计算IFFT

    使用FFT来计算IFFT 公式 DFT与IDFT DFT公式 iDFT公式 DFT计算iDFT 公式推导 FFT是DFT的一种快读计算方式,本质上的计算逻辑是一样的,所以下面使用DFT来讨论公式,应用 ...

  3. java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析

    FFT与DFT关系: 快速傅里叶变换(Fast Fourier Transform)是离散傅里叶(DFT)变换的一种快速算法,简称FFT,通过FFT可以将一个信号从时域变换到频域:FFT(快速傅里叶变 ...

  4. lms matlab fft,lms算法的频域快速实现源程序有问题,点解

    我最近在学习自适应滤波器,lms算法matlab有自带的adaptfilt.lms,我现在准备进一步学习lms算法的频域实现办法,自己查看了一些资料,综合后自己编写了程序如下: function [h ...

  5. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  6. Java实现算法导论中快速傅里叶变换FFT迭代算法

    要结合算法导论理解,参考:http://blog.csdn.NET/fjssharpsword/article/details/53281889 FFT的迭代实现,可以实现并行电路,和比较网络中的比较 ...

  7. [转]FFT倒序算法—雷德算法

    转载文章,文字说明部分修改文字错误.补充一些文字以及在程序中加一些注释,原文网址: http://www.xuebuyuan.com/2117668.html 程序部分是借鉴介绍FFT算法程序的文章& ...

  8. 理解快速傅里叶变换(FFT)算法

     编注:这篇译文由@unblock 和@jingliang 共同完成. 再次推荐:<如果看了此文你还不懂傅里叶变换,那就过来掐死我吧[完整版]> 快速傅里叶变换(Fast Fourie ...

  9. verilog中将fft转换成ifft

    fft的实现以及代码已经展现在verilog实现8点FFT运算中了. 利用fft的代码即可实现ifft的代码. 主要操作就是将输入的部分取共轭,然后输出结果取共轭再除8(因为是8点fft所以结果除以8 ...

  10. 【老生谈算法】matlab实现FFT变换算法源码——FFT变换算法

    Matlab实现FFT变换(单边谱及双边谱) 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]Matlab实现FFT变换程序源 ...

最新文章

  1. 将TVM集成到PyTorch上
  2. poj1679(次小生成树)
  3. 9Python全栈之路系列之Win字符编码深解
  4. python redis事务_python redis事务源码及应用分析
  5. 用户借助操作系统使用计算机,计算机操作系统试题_B试卷及答案(08-09)
  6. 用于安全连接 Microsoft 365 的 Mimecast 数字证书被盗
  7. 如何用EasyRecovery找回删除的文档(附注册机下载地址)
  8. 内的图标_从零开始画图标系列:线性图标设计实战演示!
  9. 如何阅读Java源码 阅读java的真实体会
  10. hive sql 行列转换
  11. css文字跑马灯,css3实现文字跑马灯(css3跑马灯demo) - 全文
  12. 惠普打印机WiFi连接使用
  13. windows计算机查看里设置,windows10电脑配置怎么查看
  14. 数值分析|二阶三点式Python编程
  15. f5服务器维护,F5-LTM(服务器的负载均衡)网络结构和功能
  16. 关于解决Mac上keras数据集自动下载过慢问题(不要问我是怎么知道的,干就完了,奥利给!)
  17. 计算机专业认知教育,计算机学院 “专业认知教育和学业规划教育”讲座顺利举行...
  18. 利用Event实现WinUI层与Bussiness层 跨层间动态提示
  19. html 标签 简写_HTML缩写标签
  20. 惟实励新·笃行致远,艾特网能2022年度合作伙伴大会成功举办

热门文章

  1. java毕设项目——图书借阅管理系统(附源码课件)
  2. python题目-青蛙跳井口
  3. 分布式定时任务调度框架
  4. FlashFXP注册码-FlashFXP密钥
  5. 智能中医诊疗系统php代码,中医HIS
  6. SD卡格式化造成数据丢失的恢复方法
  7. C2:Unity3D制作智能家居设计软件——绘制户型(一)
  8. 统计学中p值计算公式_统计学中的P值应该怎么计算
  9. MATLAB 批量下载网页中的数据
  10. 腾讯会议中用PPT放视频,视频没有声音