⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fourier.cpp

📁 一个Fourier变换的小程序;算法简单实用。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -