快速傅立叶变换程序与反变换程序
来源:互联网 发布:unity3d ui 高科技 编辑:程序博客网 时间:2024/05/01 16:34
///////////////快速傅立叶变换程序/////////////////////
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M 8
#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;
}
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;
}
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];
/*
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)];
}
{
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;
{
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];
}
{
or[i]=kr[i];
oi[i]=ki[i];
}
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;
}
delete []ki;
}
///////////////快速傅立叶反变换程序/////////////////////
#include "stdafx.h"
#include <math.h>
#define pi 3.14159265359
#define M 8
#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;
}
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;
}
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];
/*
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)];
}
{
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;
{
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;
}
{
or[i]=kr[i]/N;
oi[i]=ki[i]/N;
}
delete []kr;
delete []ki;
}
/////////////////////////////////////////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;
}
- 快速傅立叶变换程序与反变换程序
- C#|图像快速傅立叶变换与反变换
- 傅立叶变换与傅立叶反变换的C语言实现
- 傅立叶变换与傅立叶反变换的C语言实现
- 多项式与快速傅立叶变换
- matlab快速傅立叶变换小程序(含GUI)
- 快速傅立叶变换原理
- 快速傅立叶变换原理
- 【FFT-快速傅立叶变换】
- 快速傅立叶变换
- 快速傅立叶变换的
- 快速傅立叶变换FFT
- 快速傅立叶变换 模板
- 傅立叶变换光谱程序开发设计
- QT 实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配
- QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配
- 卷积与傅立叶变换
- 二维傅立叶变换和二维傅立叶反变换
- 职业性格测试
- 求解三次方程
- 舍不得的地址
- Virtual PC 中安 装ms dos 6.22
- 重开博客
- 快速傅立叶变换程序与反变换程序
- 单反相机
- ERP面试题之解答[作者:Yuanhy]
- Guass消元法和Guass列主元素消元法解线性方程组
- 追赶法解三对角阵方程组
- 牛顿插值法
- 解决关于页面空间disable之后服务器端取值问题
- 最小二乘法程序
- 处理JQuery和My97DatePicker的冲突