📄 fourier.cpp
字号:
int wp;
int hp;//2的指数
w=1; //赋初值
h=1;
wp=0;
hp=0;
while(w<lWidth)//计算进行傅立叶变换的宽度和高度(2的整数次方)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
//
float tempD; //临时变量
if(flag==2) //对行作fft
{
memset(FDresult,0,sizeof(complex<float>)*w*lHeight); //设置为0
//
complex<float>*TD=new complex<float>[w]; //分配内存存储时域数据
//
for(i=0;i<lHeight;i++)//行
{
memset(TD,0,sizeof(complex<float>)*w); //赋值0
//转移一行数据到TD
for(j=0;j<lWidth;j++)//列
{
tempD=TDdata[i*lWidth+j];
TD[j]=complex<float>(tempD,0);
}
//FFT
FFT(TD,wp);
//
for(j=0;j<w;j++)
{
FDresult[i*w+j]=TD[j];
}
}
//
delete[]TD;
}
else if(flag==1) //对列做fft
{
memset(FDresult,0,sizeof(complex<float>)*h*lWidth); //设置为0
//
complex<float>*TD=new complex<float>[h]; //分配内存存储时域数据
//
for(i=0;i<lWidth;i++)
{
memset(TD,0,sizeof(complex<float>)*h); //赋值0
//将一列数据存到TD中
for(j=0;j<lHeight;j++)
{
tempD=TDdata[j*lWidth+i];
TD[j]=complex<float>(tempD,0);
}
//对TD做FFT
FFT(TD,hp);
//将数据保存到FDresult
for(j=0;j<h;j++)
{
FDresult[j*lWidth+i]=TD[j];
}
}
//
delete[]TD;
}
return true;
}
/*******************************************************************
* 函数名:
* Fourier2()
* 参数:
* TDdata 时域数据
* lWidth 数据宽度
* lHeight 数据高度
* FDresult 频域结果
* flag =1,对列;=2对行
* 说明:
* 二维float数据中的一维fourier变换
*******************************************************************/
BOOL CFourier::Fourier2(float*TDdata,long lWidth,long lHeight,complex<float>*FDresult,int flag)
{
long i;
long j;//循环变量
int wp;
int hp;//2的指数
w=1; //赋初值
h=1;
wp=0;
hp=0;
while(w<lWidth)//计算进行傅立叶变换的宽度和高度(2的整数次方)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
if(flag==2) //对行作fft
{
memset(FDresult,0,sizeof(complex<float>)*w*lHeight); //设置为0
//
complex<float>*TD=new complex<float>[w]; //分配内存存储时域数据
//
for(i=0;i<lHeight;i++)//行
{
memset(TD,0,sizeof(complex<float>)*w); //赋值0
//转移一行数据到TD
for(j=0;j<lWidth;j++)//列
{
TD[j]=complex<float>(TDdata[i*lWidth+j],0);
}
//FFT
FFT(TD,wp);
//
for(j=0;j<w;j++)
{
FDresult[i*w+j]=TD[j];
}
}
//
delete[]TD;
}
else if(flag==1) //对列做fft
{
memset(FDresult,0,sizeof(complex<float>)*h*lWidth); //设置为0
//
complex<float>*TD=new complex<float>[h]; //分配内存存储时域数据
//
for(i=0;i<lWidth;i++)
{
memset(TD,0,sizeof(complex<float>)*h); //赋值0
//将一列数据存到TD中
for(j=0;j<lHeight;j++)
{
TD[j]=complex<float>(TDdata[j*lWidth+i],0);
}
//对TD做FFT
FFT(TD,hp);
//将数据保存到FDresult
for(j=0;j<h;j++)
{
FDresult[j*lWidth+i]=TD[j];
}
}
//
delete[]TD;
}
return true;
}
/*******************************************************************
* 函数名:
* Fourier2()
* 参数:
* TDdata 时域数据
* lWidth 数据宽度
* lHeight 数据高度
* FDresult 频域结果
* 说明:
* 二维complex<float>数据fourier变换
*******************************************************************/
BOOL CFourier::Fourier2(complex<float>*TDdata,long lWidth,long lHeight,complex<float>*FDresult)
{
long i;
long j; //循环变量
int wp;
int hp; //2的指数
w=1; //赋初值
h=1;
wp=0;
hp=0;
while(w<lWidth)//计算进行傅立叶变换的宽度和高度(2的整数次方)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
//
memset(FDresult,0,sizeof(complex<float>)*w*h); //设置为0
//先对行作FFT
complex<float>*TD=new complex<float>[w]; //分配内存存储时域数据
for(i=0;i<lHeight;i++)
{
memset(TD,0,sizeof(complex<float>)*w); //赋值0
for(j=0;j<lWidth;j++)
{
TD[j]=TDdata[i*lWidth+j];
}
//FFT
FFT(TD,wp); //TD数据的FFT就保存在TD中,
//
for(j=0;j<w;j++)
{
FDresult[i*w+j] = TD[j];
}
}
delete[] TD;
//
//再对列做FFT
TD=new complex<float>[h];
for(i=0;i<w;i++)
{
memset(TD,0,sizeof(complex<float>)*h);
//
for(j=0;j<h;j++)
{
TD[j]=FDresult[j*w+i];
}
//FFT
FFT(TD,hp);
//
for(j=0;j<h;j++)
{
FDresult[j*w+i]=TD[j];
}
}
delete[] TD;
//
return true;
}
/*******************************************************************
* 函数名:
* Fourier2()
* 参数:
* TDdata 时域数据
* lWidth 数据宽度
* lHeight 数据高度
* FDresult 频域结果
* flag =1,对列;=2对行
* 说明:
* 二维complex<float>数据中的一维fourier变换
*******************************************************************/
BOOL CFourier::Fourier2(complex<float>*TDdata,long lWidth,long lHeight,complex<float>*FDresult,int flag)
{
long i;
long j;//循环变量
int wp;
int hp;//2的指数
w=1; //赋初值
h=1;
wp=0;
hp=0;
while(w<lWidth)//计算进行傅立叶变换的宽度和高度(2的整数次方)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
if(flag==2) //对行作fft
{
memset(FDresult,0,sizeof(complex<float>)*w*lHeight); //设置为0
//
complex<float>*TD=new complex<float>[w]; //分配内存存储每行时域数据
//对每行处理
for(i=0;i<lHeight;i++)//行
{
memset(TD,0,sizeof(complex<float>)*w); //赋值0
//转移一行数据到TD
for(j=0;j<lWidth;j++)//列
{
TD[j]=TDdata[i*lWidth+j];
}
//FFT
FFT(TD,wp);
//
for(j=0;j<w;j++)
{
FDresult[i*w+j]=TD[j];
}
}
delete[]TD;
}
else if(flag==1) //对列做fft
{
memset(FDresult,0,sizeof(complex<float>)*h*lWidth); //设置为0
//
complex<float>*TD=new complex<float>[h]; //分配内存存储时域数据
//
for(i=0;i<lWidth;i++)
{
memset(TD,0,sizeof(complex<float>)*h); //赋值0
//将一列数据存到TD中
for(j=0;j<lHeight;j++)
{
TD[j]=TDdata[j*lWidth+i];
}
//对TD做FFT
FFT(TD,hp);
//将数据保存到FDresult
for(j=0;j<h;j++)
{
FDresult[j*lWidth+i]=TD[j];
}
}
delete[] TD;
}
return true;
}
/*******************************************************************
* 函数名:
* InFourier2()
* 参数:
* FDdata 频域数据
* lWidth 数据宽度
* lHeight 数据高度
* TDresult 时域结果
* 说明:
* 二维complex<float>数据infourier变换
*******************************************************************/
BOOL CFourier::InFourier2(complex<float>*FDdata,long lWidth,long lHeight,complex<float>*TDresult)
{
long i;
long j; //循环变量
int wp=0;
int hp=0; //指数
w=1;h=1; //赋初值
while(w<lWidth)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
//
memset(TDresult,0,sizeof(complex<float>)*w*h); //设置为0
//先对行作IFFT
complex<float>*FD=new complex<float>[w]; //分配频率缓存
for(i=0;i<lHeight;i++)
{
memset(FD,0,sizeof(complex<float>)*w); //赋值0
for(j=0;j<lWidth;j++)
{
FD[j]=FDdata[i*lWidth+j];
}
//IFFT
IFFT(FD,wp);
//
for(j=0;j<w;j++)
{
TDresult[i*w+j] = FD[j];
}
}
delete[] FD;
//
//再对列做FFT
FD=new complex<float>[h];
for(i=0;i<w;i++)
{
memset(FD,0,sizeof(complex<float>)*h);
//
for(j=0;j<h;j++)
{
FD[j]=TDresult[j*w+i];
}
//FFT
IFFT(FD,hp);
//
for(j=0;j<h;j++)
{
TDresult[j*w+i]=FD[j];
}
}
delete[] FD;
//
return true;
}
//结果直接保存在FDdata中
//要求lWidth和lHeight已经是2的幂次
BOOL CFourier::InFourier2(complex<float>*FDdata,long lWidth,long lHeight)
{
long i;
long j; //循环变量
int wp=0;
int hp=0; //指数
w=1;h=1; //赋初值
while(w<lWidth)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
//
//先对行作IFFT
complex<float>*FD=new complex<float>[w]; //分配频率缓存
for(i=0;i<lHeight;i++)
{
memset(FD,0,sizeof(complex<float>)*w); //赋值0
for(j=0;j<lWidth;j++)
{
FD[j]=FDdata[i*lWidth+j];
}
//IFFT
IFFT(FD,wp);
//
for(j=0;j<w;j++)
{
FDdata[i*lWidth+j] = FD[j];
}
}
delete[] FD;
//
//再对列做IFFT
FD=new complex<float>[h];
for(i=0;i<w;i++)
{
memset(FD,0,sizeof(complex<float>)*h);
//
for(j=0;j<h;j++)
{
FD[j]=FDdata[j*lWidth+i];
}
//FFT
IFFT(FD,hp);
//
for(j=0;j<h;j++)
{
FDdata[j*lWidth+i]=FD[j];
}
}
delete[] FD;
//
return true;
}
/*******************************************************************
* 函数名:
* InFourier2()
* 参数:
* FDdata 频域数据
* lWidth 数据宽度
* lHeight 数据高度
* TDresult 时域结果
* flag =1,对列;=2,对行;
* 说明:
* 二维complex<float>数据中的一维infourier变换
*******************************************************************/
BOOL CFourier::InFourier2(complex<float>*FDdata,long lWidth,long lHeight,complex<float>*TDresult,int flag)
{
long i;
long j; //循环变量
int wp;
int hp; //2的指数
w=1; //赋初值
h=1;
wp=0;
hp=0;
while(w<lWidth)//计算进行傅立叶变换的宽度和高度(2的整数次方)
{
w*=2;
wp++;
}
while(h<lHeight)
{
h*=2;
hp++;
}
if(flag==2) //对行作fft
{
memset(TDresult,0,sizeof(complex<float>)*w*lHeight); //设置为0
//
complex<float>*FD=new complex<float>[w]; //分配内存存储时域数据
//
for(i=0;i<lHeight;i++)
{
memset(FD,0,sizeof(complex<float>)*w);
//
for(j=0;j<lWidth;j++)
{
FD[j]=FDdata[i*lWidth+j];
}
//IFFT
IFFT(FD,wp);
//
for(j=0;j<w;j++)
{
TDresult[i*w+j]=FD[j];
}
}
delete[] FD;
}
else if(flag==1) //对列做fft
{
memset(TDresult,0,sizeof(complex<float>)*h*lWidth); //设置为0
//
complex<float>*FD=new complex<float>[h]; //分配内存存储时域数据
//
for(i=0;i<lWidth;i++)
{
memset(FD,0,sizeof(complex<float>)*h); //赋值0
//将一列数据存到TD中
for(j=0;j<lHeight;j++)
{
FD[j]=FDdata[j*lWidth+i];
}
//对TD做FFT
IFFT(FD,hp);
//将数据保存到FDresult
for(j=0;j<h;j++)
{
TDresult[j*lWidth+i]=FD[j];
}
}
delete[] FD;
}
//
return true;
}
//对二维数据在一维上的迁移
void CFourier::fftshift(complex<float>*Data,long lWidth,long lHeight,int flag)
{
long i;
long j;
complex<float> temp;
if(flag==1) //在列的方向做fft,虽然是二维的数据,不用担心lHeight的奇偶性:偶数
{
complex<float>*change=new complex<float>[lWidth*lHeight];
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
change[j*lHeight+i]=Data[i*lWidth+j]; //转置一下
}
}
for(i=0;i<lWidth;i++)
{
for(j=0;j<lHeight/2;j++)
{
temp=change[i*lHeight+j];
change[i*lHeight+j]=change[i*lHeight+j+lHeight/2];
change[i*lHeight+j+lHeight/2]=temp;
}
}
for(i=0;i<lHeight;i++) //转置回来
{
for(j=0;j<lWidth;j++)
{
Data[i*lWidth+j]=change[j*lHeight+i];
}
}
delete[]change;
}
else if(flag==2) //对行,不用担心lWidth的奇偶性:偶数
{
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth/2;j++)
{
temp=Data[i*lWidth+j];
Data[i*lWidth+j]=Data[i*lWidth+j+lWidth/2];
Data[i*lWidth+j+lWidth/2]=temp;
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -