/*******************************************************************************
** 程序名称:快速傅里叶变换(FFT)
** 程序描述:本程序实现快速傅里叶变换
** 程序作者:宋元瑞
** 最后修改:2011年4月5日
*******************************************************************************/
#include <stdio.h>
#include <math.h>

#define PI 3.141592653589 //圆周率,12位小数
#define N 8     //傅里叶变换的点数
#define M 3     //蝶形运算的级数,N = 2^M
typedef double ElemType; //原始数据序列的数据类型,可以在这里设置

typedef struct    //定义复数结构体
{
 ElemType real,imag;
}complex;

complex data[N];   //定义存储单元,原始数据与负数结果均使用之
ElemType result[N];   //存储FFT后复数结果的模

//变址
void ChangeSeat(complex *DataInput)
{
 int nextValue,nextM,i,k,j=0;
    complex temp;
 
    nextValue=N/2;                  //变址运算,即把自然顺序变成倒位序,采用雷德算法
    nextM=N-1;
    for (i=0;i<nextM;i++)
    {
        if (i<j)     //如果i<j,即进行变址
        {
            temp=DataInput[j];
            DataInput[j]=DataInput[i];
            DataInput[i]=temp;
        }
        k=nextValue;                //求j的下一个倒位序
        while (k<=j)    //如果k<=j,表示j的最高位为1
        {
            j=j-k;     //把最高位变成0
            k=k/2;     //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
        }
        j=j+k;      //把0改为1
    }                                      
}
/*
//变址
void ChangeSeat(complex *DataInput)
{
 complex Temp[N];
 int i,n,New_seat;
 for(i=0; i<N; i++)
 {
  Temp[i].real = DataInput[i].real;
  Temp[i].imag = DataInput[i].imag;
 }
 for(i=0; i<N; i++)
 {
  New_seat = 0;
  for(n=0;n<M;n++)
  {
   New_seat = New_seat | (((i>>n) & 0x01) << (M-n-1));
  }
  DataInput[New_seat].real = Temp[i].real;
  DataInput[New_seat].imag = Temp[i].imag;
 }
}
*/
//复数乘法
complex XX_complex(complex a, complex b)
{
 complex temp;
 
 temp.real = a.real * b.real-a.imag*b.imag;
 temp.imag = b.imag*a.real + a.imag*b.real;
 
 return temp;
}

//FFT
void FFT(void)
{
 int L=0,B=0,J=0,K=0;
 int step=0;
 ElemType P=0,T=0;
 complex W,Temp_XX;
 //ElemType TempResult[N];
 
 ChangeSeat(data);
 for(L=1; L<=M; L++)
 {
  B = 1<<(L-1);//B=2^(L-1)
  for(J=0; J<=B-1; J++)
  {
   P = (1<<(M-L))*J;//P=2^(M-L) *J
   step = 1<<L;//2^L
   for(K=J; K<=N-1; K=K+step)
   {
    W.real =  cos(2*PI*P/N);
    W.imag = -sin(2*PI*P/N);
    
    Temp_XX = XX_complex(data[K+B],W);
    data[K+B].real = data[K].real - Temp_XX.real;
    data[K+B].imag = data[K].imag - Temp_XX.imag;
    
    data[K].real = data[K].real + Temp_XX.real;
    data[K].imag = data[K].imag + Temp_XX.imag;
   }
  }
 }
}
void IFFT(void)
{
 int L=0,B=0,J=0,K=0;
 int step=0;
 ElemType P=0,T=0;
 complex W,Temp_XX;
 //ElemType TempResult[N];
 
 ChangeSeat(data);
 for(L=1; L<=M; L++)
 {
  B = 1<<(L-1);//B=2^(L-1)
  for(J=0; J<=B-1; J++)
  {
   P = (1<<(M-L))*J;//P=2^(M-L) *J
   step = 1<<L;//2^L
   for(K=J; K<=N-1; K=K+step)
   {
    W.real =  cos(2*PI*P/N);
    W.imag =  sin(2*PI*P/N);//逆运算,这里跟FFT符号相反
    
    Temp_XX = XX_complex(data[K+B],W);
    data[K+B].real = data[K].real - Temp_XX.real;
    data[K+B].imag = data[K].imag - Temp_XX.imag;
    
    data[K].real = data[K].real + Temp_XX.real;
    data[K].imag = data[K].imag + Temp_XX.imag;
   }
  }
 }
}
int main(int argc, char *argv[])
{
 int i = 0;
 for(i=0; i<N; i++)//制造输入序列
 {
  data[i].real = sin(2*PI*i/N);
  printf("%lf ",data[i]);
 }
 printf("\n\n");
 
 
 FFT();//进行FFT计算
 printf("\n\n");
 for(i=0; i<N; i++)
  {printf("%lf ",sqrt(data[i].real*data[i].real+data[i].imag*data[i].imag));}
 
 IFFT();//进行FFT计算
 printf("\n\n");
 for(i=0; i<N; i++)
  {printf("%lf ",data[i].real/N);}
 printf("\n");
 /*for(i=0; i<N; i++)
  {printf("%lf ",data[i].imag/N);}
 printf("\n");*/
 /*for(i=0; i<N; i++)
  {printf("%lf ",sqrt(data[i].real*data[i].real+data[i].imag*data[i].imag)/N);}*/
 return 0;
}

http://blog.csdn.net/syrchina/article/details/6670517

用于ARM上的FFT与IFFT源代码-C语言的更多相关文章

  1. 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)

    源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...

  2. 二维FFT,IFFT,c语言实现

    学习DIP第6天 完整内容迁移至http://www.face2ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/ http://www.tony4ai.com/DIP-2-4-二维FF ...

  3. arm上的参数列表传递的分析(以android为例)

    1. Linux中可变列表实现的源码分析 查看Linux0.11的内核源代码,对va_list, va_start, va_arg 的实现如下: va_list的实现没有差别,chartypedef ...

  4. ARM上的linux如何实现无线网卡的冷插拔和热插拔

    ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...

  5. valgrind简介以及在ARM上交叉编译运行【转】

    转自:https://blog.csdn.net/dengcanjun6/article/details/54958359 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  6. 基2时域抽取FFT、IFFT的C++实现代码,另附DFT与IDFT的原始实现--转1

    介绍网络上的原理介绍非常丰富,具体请自行搜索网络资源. 本算法依靠FFT流图进行布置. 算法 ##进行完所有的原理推导后,我们可以得到如下的16点FFT流图: 通过上图可以看出整个流图输入序列的顺序已 ...

  7. AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机)

    AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机) 特别感谢google官方文档及AOSP源代码开放 參考链接: https://source.a ...

  8. 【Qt开发】【ARM-Linux开发】 QT在ARM上显示字体的问题

    在PC机上利用QT开发的应用程序在设置字体时,在PC上运行,可根据自己的设置,字体随之变大或变小.而移植到ARM上运行时发现,显示字体与所设置的字体不用,字体普遍偏小.经过上网搜索发现,是环境变量字库 ...

  9. 用jQuery重置用于文件上传的input (type="file")

    页面中有如下标签: <input type="file" id="upload"/> 此标签本用于文件上传,现在有需要将其值重置为空.于是想当然地写 ...

随机推荐

  1. Spring-data-jpa 之Specification in的用法

    1.一个简单的 Predicate 的示例 构建简单的Predicate示例: Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+ ...

  2. Linux源码编译安装MySQL5.7

    目录[-] 一.环境准备: 二.升级系统: 三.做一些准备工作(以下Linux命令均在su到root用户操作): 四.开始编译安装mysql-5.7.9: 一.环境准备: 我尝试过以下环境都是能成功的 ...

  3. html DOM 的继承关系

    零散的知识聚合在一起,就会形成力量,就有了生命力. 如各种语言的开发框架, 都是右各个碎片化的功能聚合在一起,构成有机地整体,便有了强大的力量.will be powerful! 如: jquery ...

  4. JSONObject和JSONArray(json-lib-2.4)的基本用法

    json-lib-2.4是一个用于JSON和java对象间转换的第三方包,其jar和依赖包下载地址在:https://files.cnblogs.com/files/xiandedanteng/jso ...

  5. 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成

    3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...

  6. 配置git账号和密码

    最开始启动的时候 配置用户名和用户邮箱,安装完git第一件要做的事情! git config --global uesr.name "Sunnshino" git config - ...

  7. POI动态生成word2007加强版

    先看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAzODkxNzU=/font/5a6L5L2T/fontsize/400/fill ...

  8. javascript中的正則表達式

    对文本数据进行操作是JavaScript中常见的任务.正則表達式通过同意程序猿指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务. 1.正則表達式标记: 字符 含义 举例 i 大写 ...

  9. MySQL 5.6数据导入报 GTID 相关错误

    从阿里云备份数据后还原到本地,用命令行 mysql -uroot -p --default-character-set=<character> -f <dbname> < ...

  10. Jenkins部署java项目实例

    源码管理 选择 “git”, Repository URL填写你的git地址,并配置对应的key,大家最好事前先在jenkins这台机器上能够直接远程git操作私有仓库 构建触发器.构建环境.Pre ...