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

📄 fft2.java

📁 java 实现的 快速傅立叶变换
💻 JAVA
字号:
//FFT2.java
/*
	程序说明:
	
	程序修改:
	
	最后修改时间:2008-11
	
	作者:朱磊
	
*/

public class FFT2 {
	
	int iw;
	int ih;
	double []pixels;
	Complex []td;
	Complex []fd;
	
	FFT1 fft1;
	
	// 进行付立叶变换的宽度和高度(2的整数次方)
	// 赋初值
	int w = 1;
	int h = 1;
	int wp=0;
	int hp=0;
	
	//构造函数
	public FFT2()
	{
		System.out.println("FFT2()");
	}
	
	//传递数据
	public void setData(int iw,int ih,double []pixels){
			
			this.iw=iw;
			this.ih=ih;
			
			this.pixels=new double[iw*ih];
			this.pixels=pixels;
			
		//计算进行付立叶变换的宽度和高度(2的整数次方)
		while(w*2<=iw)
		{
			w*=2;
			wp++;
		}
		while(h*2<=ih)
		{
			h*=2;
			hp++;
		}
		
		td=new Complex[h*w];
		fd=new Complex[h*w];
		
		//初始化fd,td
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				fd[i*w+j]=new Complex();
				td[i*w+j]=new Complex(pixels[i*w+j],0);
			}
		}
		
		//在y方向上进行快速傅立叶变换
		for(int i=0;i<h;i++)
		{
			//每一行做傅立叶变换
			Complex [] tempW1=new Complex[w];
			Complex [] tempW2=new Complex[w];
			for(int j=0;j<w;j++)
			{
				tempW1[j]=new Complex(0,0);
				tempW2[j]=new Complex(0,0);
			}
			
			for(int j=0;j<w;j++)
			{
				tempW1[j]=td[i*w+j];
			}
			
			fft1=new FFT1();
			fft1.setData(tempW1,wp);
			
			tempW2=fft1.getData();
			
			for(int j=0;j<w;j++)
			{
				fd[i*w+j]=tempW2[j];
			}
		}
		
		//保存变换结果
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				td[j*h+i]=fd[i*w+j];
			}
		}
		
		
		//对x方向进行傅立叶变换
		for(int i=0;i<w;i++)
		{
			//每一列做傅立叶变换
			Complex [] tempW1=new Complex[h];
			Complex [] tempW2=new Complex[h];
			
			for(int j=0;j<h;j++)
			{
				tempW1[j]=new Complex(0,0);					
				tempW2[j]=new Complex(0,0);
			}
			
			for(int j=0;j<h;j++)
			{
				tempW1[j]=td[i*h+j];
			}
		
			fft1.setData(tempW1,hp);
			
			tempW2=fft1.getData();
			
			for(int j=0;j<h;j++)
			{
				fd[i*h+j]=tempW2[j];
			}
		}
		
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				td[i*w+j]=fd[j*h+i];
			}
		}
	}	
		
	//返回FFT变换后的值	
	public Complex [] getComplex(){
		
		return td;
	
	}
	
	public double []getPixels(){
		
		//获得频谱
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)
			{
				double re=td[i*w+j].re;
				double im=td[i*w+j].im;
				
				double temp=Math.sqrt(re*re+im*im)/100.0;
				
				if(temp>255) { temp=255;}
				
				//第i行,j列,变为:ii行,第jj列
				/*
				int ii=0,jj=0;
				
				if(i<h/2) { ii=i+h/2;} else {ii=i-h/2;}
				if(j<w/2) {jj=j+w/2;} else { jj=j-w/2;}
				
				pixels[ii*w+jj]=temp;
				*/
				pixels[i*w+j]=temp;
			}
		}
		return pixels;
	}
		
	public static void main(String []args)
	{
		new FFT2();
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -