用于ARM上的FFT与IFFT源代码-C语言

/*******************************************************************************
** 程序名称:快速傅里叶变换(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语言

时间: 2024-08-04 08:30:17

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

二维FFT,IFFT,c语言实现

学习DIP第6天 网上关于FFT的实例有很多,具体也可以参照上一篇,其实Matlab,OpenCV都可以很轻松的实现相关操作,但是对于学习其原理,还是自己操作下比较好. 二维FFT的是实现方法是先对行做FFT将结果放回该行,然后再对列做FFT结果放在该列,计算完所有的列以后,结果就是响应的二维FFT. 本次所有操作都是对基2的数据进行的操作. 二维IFFT网上很少见到,操作过程是:上述的傅里叶变换结果,先对每行做一维IFFT,结果放在该行,对偶数列取其共轭,然后再按照每列做一维IFFT,其结果放

【Allwinner ClassA20类库分析】 1.ARM上的Delphi - Lazarus

提起上位机上的Delphi,在以前可能熟悉的人很多,虽然前几年随着Borland公司的倒闭,使用Delphi的人越来越少,但是这并不能掩盖她先进的VCL框架.全能选手的光芒.在Windows平台上,无论从Win95,还是到Win8.1,编译过一次的exe文件可以在无需安装任何运行时库的情况下直接运行,曾经也是病毒编写优先考虑的语言:而在各种管理系统的开发中,Delphi也是开发效率运.行效率极其优秀的语言.只是由于Borland公司过度捆绑Windows的策略,使其应用于其他平台的机会大大减少.

qt5.3.2移植到arm上出undefined reference to &#39;__sync_sub_and_fetch_4的错

qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错.解决办法如下, 使用工具:GCC4.4.1 QT源码:qt5.3.2 前提是确保你的工具已经安装成功了. 解决:1.下载gcc源码:我用的4.4.1解压,在gcc-4.4.3/gcc/config/arm/目录下找到一个linux-atomic.c:2.制作链接库:使用libtool制作,输入命令 libtool --tag=CC --mode=compile arm-

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

对于pc上的可变参数列表,比较容易理解:参数全部存储在栈上.所以:va_list p定义一个指针,va_start(p, arg_a)获取参数列表地址,该地址就是va_start第二个参数对应数据之后的地址,,在栈上表现为:arg_a+sizeof(arg_a). 此后根据参数类型,使用va_arg依次从指定的参数列表地址取数据. 但时对于arm上,一个会使用寄存器传递参数的平台,又回怎样处理的呢? 通过写一个简单的示例程序: int test(int a, ...){ va_list p; v

arm上移植mplayer

关于mplayer移植网上资料很多,但都很混乱.在此,我做了一个关于mplayer 的详细总结.在做之前最好在解压源码包后,先通过./configure --help看一下相关配置. X86的LINUX上已经自带了解码库,不需要另外安装解码库,而arm平台自己做的文件系统没有解码库,需要另外安装解码库. 下载MPlayer:MPlayer-1.0rc2.tar.bz2        解码库:libmad-0.15.0b.tar.gz 一.在x86的LINUX上安装mplayer 1 #./con

用jQuery重置用于文件上传的input (type=&quot;file&quot;)

页面中有如下标签: <input type="file" id="upload"/> 此标签本用于文件上传,现在有需要将其值重置为空.于是想当然地写出如下代码: $('#upload').val(''); 但经测试,该处理方法对IE无效,因为IE不允许javascript改变type为file的input的值,又是让人蛋疼的IE... 在浏览器兼容性方面本人是白痴一个,遂放狗一搜,有解决方案如下: if(ie) { // 此处判断是否是IE $('#up

我写的界面,在ARM上跑

这个...其实,我对ARM了解并不多,我顶多也就算是知道ARM怎么玩,EMMC干啥,MMU干啥,还有早期的叫法,比如那个NorFlash NandFlash ,然后也就没啥了. 然后写个裸机什么的,那个还稍微好一点点... 还是那个界面,运行环境,Contex-A9. boot使用的是 uboot ,然后 dnw 把界面下载到板子里,直接写的显存,方法简单有效.通用. 目前,就这个在ARM上跑的问题,就是,如何才能简单.有效且通用的实现鼠标键盘的操作抓取,x86上,好办,无非就是接管几个中断,基

MPlayer在ARM上的移植(S5PV210开发板)

MPlayer 1.0已经把大部分解码库都自带了,如ffmpeg,但是自带的音频库在S5PV210下效果非常不好.换成使用libmad效果不错.因此MPlayer 在ARM-Linux的最简单的移植只需要移植这两个即可.移植后即进行字符界面的播放.      移植之前先做好移植前准备,安装好arm-linux交叉编译器,并下载 MPlayer-1.0rc2.tar.bz2 和libmad包(libmad-0.15.1b.tar.gz) 1.安装libmad(1)解压libmad解压libmad包

游戏2048源代码 - C语言控制台界面版

完整源代码如下,敬请读者批评指正: 1 /* 2 * Copyright (C) Judge Young 3 * E-mail: [email protected] 4 * Version: 1.0 5 */ 6 7 #include <stdio.h> 8 #include <time.h> /* 包含设定随机数种子所需要的time()函数 */ 9 #include <conio.h> /* 包含Windows平台上完成输入字符不带回显和回车确认的getch()函数