?? 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 + -