快速傅立叶变换程序与反变换程序

原创 2007年09月17日 18:26:00
///////////////快速傅立叶变换程序/////////////////////
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M  8
////////////////取反函数//////////////////////////
int rebit(int num,int p)
{
 int i,rb=0,rb1,k,num1=num;
 for(i=1;i<=p;i++)
 {
  k=num&1;
  num=num1>>1;
  num1=num;
  rb=rb+k;
  rb1=rb<<1;
  rb=rb1;
 }
 return rb>>1;
}
///////////////2的次方函数/////////////////////
inline int pow2(int n)
{
 return 1<<n;
}
///////////////快速傅立叶变换/////////////////////
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void FFT(double *ir,double *ii,double or[],double oi[],int l)
{
 int i,j,r,s,N,s0,m;
    double *kr,*ki,u,v,cc,cs,t;
 N=pow2(l);
 kr=new double[N];
 ki=new double[N];
 for(i=0;i<N;i++)
 {
  kr[i]=ir[rebit(i,l)];
        ki[i]=ii[rebit(i,l)];
 }
 for(i=1;i<=l;i++)
 {
  m=pow2(i);
  for(j=0;j<pow2(l-i);j++)
  {
   for(r=0;r<pow2(i-1);r++)
   {
    s=j*pow2(i)+r;
    s0=s+pow2(i-1);
    t=2*pi*r/m;
    cc=cos(t);
    cs=sin(t);
                u=kr[s0]*cc+ki[s0]*cs;
    v=ki[s0]*cc-kr[s0]*cs;
                kr[s0]=kr[s]-u;
    ki[s0]=ki[s]-v;
                kr[s]=kr[s]+u;
    ki[s]=ki[s]+v;
   }
  }
 }
    for(i=0;i<N;i++)
 {
  or[i]=kr[i];
        oi[i]=ki[i];
 }
 delete []kr;
    delete []ki;
}

///////////////快速傅立叶反变换程序/////////////////////
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M  8
////////////////取反函数//////////////////////////
int rebit(int num,int p)
{
 int i,rb=0,rb1,k,num1=num;
 for(i=1;i<=p;i++)
 {
  k=num&1;
  num=num1>>1;
  num1=num;
  rb=rb+k;
  rb1=rb<<1;
  rb=rb1;
 }
 return rb>>1;
}
///////////////2的次方函数/////////////////////
inline int pow2(int n)
{
 return 1<<n;
}
 
///////////////快速傅立叶反变换/////////////////////
/*
ir---输入实部指针
ii---输入虚部指针
or---输出实部指针
oi---输出虚部指针
l----数组长度=2的l次方
*/
void RFFT(double *ir,double *ii,double or[],double oi[],int l)
{
 int i,j,r,s,N,s0,m;
    double *kr,*ki,u,v,cc,cs,t;
 N=pow2(l);
 kr=new double[N];
 ki=new double[N];
 for(i=0;i<N;i++)
 {
  kr[i]=ir[rebit(i,l)];
        ki[i]=ii[rebit(i,l)];
 }
 for(i=1;i<=l;i++)
 {
  m=pow2(i);
  for(j=0;j<pow2(l-i);j++)
  {
   for(r=0;r<pow2(i-1);r++)
   {
    s=j*pow2(i)+r;
    s0=s+pow2(i-1);
    t=2*pi*r/m;
    cc=cos(-t);
    cs=sin(-t);
                u=kr[s0]*cc+ki[s0]*cs;
    v=ki[s0]*cc-kr[s0]*cs;
                kr[s0]=kr[s]-u;
    ki[s0]=ki[s]-v;
                kr[s]=kr[s]+u;
    ki[s]=ki[s]+v;
   }
  }
 }
    for(i=0;i<N;i++)
 {
  or[i]=kr[i]/N;
        oi[i]=ki[i]/N;
 }
 delete []kr;
    delete []ki;
}
/////////////////////////////////////////
int main(int argc, char* argv[])
{
 double f1[M],f2[M],g1[M],g2[M];
 int i;
 for(i=0;i<M;i++)
 {
        f1[i]=i;
       f2[i]=0;
 }
  RFFT(f1,f2,g1,g2,3);
 for(i=0;i<M;i++)
 {
        printf("%f+(%f)i/n",g1[i],g2[i]);
 }
 return 0;
}
 

相关文章推荐

采用OpenCV编写的傅立叶变换程序

  • 2010年03月24日 09:09
  • 128KB
  • 下载

快速傅立叶 哈尔滨理工ACM程序设计全国邀请赛(网络同步赛) D. Pairs

Pairs Description Given N integers,count the number of pairs of integers whose sum is less than K....

C语言编写傅立叶变换程序

  • 2009年04月17日 16:07
  • 542B
  • 下载

调频傅立叶变换的matlab程序

  • 2009年08月05日 19:25
  • 3KB
  • 下载

C#|图像快速傅立叶变换与反变换

C#实现图像快速傅立叶变换与反变换的原理与程序
  • zpfvs1
  • zpfvs1
  • 2016年11月01日 22:55
  • 1141

一维傅立叶变换演示程序

  • 2009年11月17日 14:52
  • 10KB
  • 下载

3D数学之快速傅立叶变换(Fast Fourier Transform-FFT)

最近写毕业论文,想做一个基于FFT的海洋,但是时间比较紧,不知道来不来得及去实现它,但是FFT从我研一开始就听说过了,一直没去特意去研究过它,趁此机会,我想在此把这个知识点搞定! 这篇文章可以耗时...
  • seamanj
  • seamanj
  • 2015年03月06日 01:20
  • 1190

C语言的快速傅立叶算法程序

  • 2013年03月23日 23:36
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速傅立叶变换程序与反变换程序
举报原因:
原因补充:

(最多只允许输入30个字)