资源简介
快速傅里叶变换的C++源代码。用matlab自带的fft进行了测试,结果数据非常吻合。最后用FFT处理了一幅位图。
代码片段和文件信息
#pragma pack(1)
#include
#include
#include“BMPStruct.h“
#define Double_PI 6.283185307//2*PI
#define NUM_ZERO 1e-10//浮点数0
using namespace std;
class complex
{
public:
complex(){real=0;imag=0;}
complex(double rdouble i):real(r)imag(i){}
complex(double x){real=x;imag=0.0;}
friend complex operator +(complex xcomplex y);
friend complex operator -(complex xcomplex y);
friend complex operator *(complex xcomplex y);
friend complex operator /(complex xcomplex y);
friend ostream& operator <<(ostream &outcomplex &x);
void operator=(complex x){real=x.real;imag=x.imag;}
inline double length(){return sqrt(real*real+imag*imag);}//复数的模长
//friend istream& operator >>(istream &incomplex x);
public:
double real;//复数的实部
double imag;//复数的虚部
};
complex operator+(complex xcomplex y)
{
return complex(x.real+y.realx.imag+y.imag);
}
complex operator-(complex xcomplex y)
{
return complex(x.real-y.realx.imag-y.imag);
}
complex operator*(complex xcomplex y)
{
return complex(x.real*y.real-x.imag*y.imagx.real*y.imag+x.imag*y.real);
}
complex operator/(complex xcomplex y)
{
return complex((x.real*y.real+x.imag*y.imag)/(y.real*y.real+y.imag*y.imag)
(x.imag*y.real-x.real*y.imag)/(y.real*y.real+y.imag*y.imag));
}
ostream& operator<<(ostream &outcomplex &x)
{
out< if(x.imag>0)
out<<“+“< else if(abs(x.imag)<=NUM_ZERO)
return out;
else
out< return out;
}
void bitReverse(complex *aint r)
{//码位倒置函数,将输入的序号直接按照二进制码为倒置
int len=1< int ijkt;
complex b;//作为交换源数据的中间变量
for(i=0;i {
k=i;//存放当前序号
t=0;//存放当前序号的二进制逆序数
for(j=0;j {
t<<=1;
t|=(k&1);
k>>=1;
}
if(i {
b=a[i];
a[i]=a[t];
a[t]=b;
}
}
}
void FFT(complex *resultcomplex *xint r)
{
//参数说明:result存放傅里叶变换后的结果,x是源数据,r是源数据的长度以2为底的对数
int N=1< int wLen=N>>1;//加权系数的长度
complex *w=new complex[wLen];//w是加权系数
int ik;
double angle;
for(i=0;i {
angle=-i*Double_PI/N;
w[i].real=cos(angle);
w[i].imag=sin(angle);
}
memcpy_s(resultN*sizeof(complex)xN*sizeof(complex));//将时域信号复制到频域信号里
bitReverse(resultr);//先进行码位倒置,保证输出按照顺序输出
complex x1x2;//取上一次的计算结果
int level;//蝶形算法当前的级数
int groups;//当前级上的蝶形组数
int count;//当前组上的相邻蝶形数目
int p;//指示当前计算的组的首行
for(level=0;level {
groups=1<<(r-level-1);
for(i=0;i {
count=1< p=(i<<1)*(1< for(k=0;k {
x1=result[p+k];
x2=result[p+k+count];//count=1< result[p+k]=x1+x2*w[k*(1<<(r-level-1))];
result[p+k+count]=x1-x2*w[k*(1<<(r-level-1))];
}
}
}
delete []w;
}
void AnalyzeBmpWithFFT(const char *bmpfilenamechar*resultfile)//用离散傅里叶变换分析一幅位图
{
FILE *fin;
if(fopen_s(&finbmpfilename“r“)!=0)
{
cout<<“Cannot open t
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 789 2013-10-08 14:44 FFT\BMPStruct.h
文件 66718 2013-10-08 19:48 FFT\效果图.bmp
文件 6182 2013-10-08 19:48 FFT\源.cpp
文件 143478 2013-10-08 19:14 FFT\源图像.bmp
目录 0 2013-10-08 20:00 FFT
----------- --------- ---------- ----- ----
217167 5
相关资源
- USB CAN Tool 源代码(LabVIEW 2011环境)
- 超声波水表源代码
- 一个模糊PID温度控制算法源代码
- 数据结构 图的遍历源代码
- 数据结构实验源代码集
- TCP/IP客户端和服务器端源代码,好用
- 交互式计算机图形学 第六版 OpenGL源代
- 数据结构教程李春葆第五版书中例题
- 三次样条插值类源代码!
- diy写字机grbl v1.1源代码
- C语言常用算法源代码
- 关于LED制作的源代码合集(38套)
-
STM32-ba
se64加密源代码 - 51超声波避障源代码
- 一个C++实现的源代码行数统计工具
- ZZULIOJ部分答案C语言免费.7z
- 吉他调音软件源代码
- 连连看源代码C语言版
- FFT(快速傅里叶变换)C++源程序
- AVR单片机SPI通讯程序 (C语言源代码)
- Visual+C++数字图像处理-谢凤英-源代码
- 大富翁源代码
- VC++ 中国象棋经典游戏源代码
- C语言斗地主源代码
- C++程序源代码--21点的扑克牌游戏
- 循环冗余校验码(CRC)计算源代码合
- 可解码所有jpeg格式图片的开源JPEG解码
- 通用弹道仿真计算程序(简版)V1.0
- 数据结构算法与应用--C++语言描述 书
- c++ 飞机订票系统设计及分析包含源代
评论
共有 条评论