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

📄 fft.java

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

import java.applet.Applet;
import java.awt.*;
//import java.awt.event.*;
import java.awt.image.*;

import javax.swing.*;

public class FFT extends Applet {
	Image im;
	Image tmp;
	int iw;
	int ih;
	int[] pixels;
	int [] newPixels;
	boolean flagLoad=false;
	
	FFT1 of;
	
	//构造方法
	public FFT(Image im,boolean flag){
		if(im==null)
		{
			 JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                     "Alert",JOptionPane.WARNING_MESSAGE);
			 
		}
		this.im = im;
		this.iw = im.getWidth(null);
		this.ih = im.getHeight(null);
		pixels=new int [iw*ih];
		// this.pixels=pixels;
		this.flagLoad = flag;

		try {
			PixelGrabber pg = new PixelGrabber(im, 0, 0, iw, ih, pixels, 0, iw);
			pg.grabPixels();
		} catch (InterruptedException e3) {
			e3.printStackTrace();
		}
	}
	
	private void transform(int[] pixels,int[] newpixels)
	{
		for(int i=0;i<iw*ih;i++)
		{
			pixels[i]=newpixels[i];
		}
	}
		
	public  Image jFFT_ActionPerformed(){
	//必须先加载图像,然后才可以进行FFT变换
	if(flagLoad){
		try{
			PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
			pg.grabPixels();
			}catch (InterruptedException e3) {
				e3.printStackTrace();
			}
		
	//保存图像的原始数据,后面transform方法会把它覆盖掉
//	int[] tmpPixels=new int[iw*ih];
//	transform(tmpPixels,pixels);
			
	//对图像进行傅立叶变换
	ColorModel cm=ColorModel.getRGBdefault();
	
	// 赋初值
	int w = 1;
	int h = 1;
	int wp=0;
	int hp=0;
	
	//计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w*2<=iw)
	{
		w*=2;
		wp++;
	}
	while(h*2<=ih)
	{
		h*=2;
		hp++;
	}
	
	//分配内存
	Complex [] td=new Complex[h*w];
	Complex [] fd=new Complex[h*w];
	
	newPixels=new int[h*w];
	
	//初始化newPixels
	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w;j++)
		{
			newPixels[i*w+j]=pixels[i*iw+j]&0xff;
		}
	}
	
	//初始化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(newPixels[i*w+j],0);
		}
	}
	
	//初始化中间变量
	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);
	}
	
	//在y方向上进行快速傅立叶变换
	for(int i=0;i<h;i++)
	{
		//每一行做傅立叶变换
		for(int j=0;j<w;j++)
		{
			tempW1[j]=td[i*w+j];
		}
		
		//进行一维FFT变换
		of=new FFT1();
		of.setData(tempW1,wp);
		tempW2=of.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];
		}
	}
	
	//初始化中间变量
	tempW1=new Complex[h];
	tempW2=new Complex[h];
	for(int j=0;j<h;j++)
	{
		tempW1[j]=new Complex(0,0);					
		tempW2[j]=new Complex(0,0);
	}
		
	//对x方向进行傅立叶变换
	for(int i=0;i<w;i++)
	{
		//每一列做傅立叶变换
		for(int j=0;j<h;j++)
		{
			tempW1[j]=td[i*h+j];
		}
		
		//进行一维FFT变换
		of=new FFT1();
		of.setData(tempW1,hp);
		tempW2=of.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++)
		{
			double re=fd[j*h+i].re;
			double im=fd[j*h+i].im;
			
			int ii=0,jj=0;
			int temp=(int)(Math.sqrt(re*re+im*im)/100);
			if(temp>255) { temp=255; }
			
			//第i行,j列,变为:ii行,第jj列
			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; }
			
			newPixels[ii*w+jj]=temp;
		}
	}
	
	for(int i=0;i<w*h;i++)
	{
		int alpha=cm.getAlpha(pixels[i]);
		int x=newPixels[i];
		newPixels[i]=alpha<<24|x<<16|x<<8|x;
	}
	
	//将数组中的象素产生一个图像
	ImageProducer ip=new MemoryImageSource(w,h,newPixels,0,w);
	transform(pixels,newPixels);
	tmp=createImage(ip);
//	jtpxsPanel.createImage(ip);
//	tmp.drawImage(tmp,100,150,this);
//	repaint();
//	transform(pixels,tmpPixels);
}else{
	 JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                     "Alert",JOptionPane.WARNING_MESSAGE);
	}
	return tmp;
}

	
	//定义main方法,设置窗口的大小,显示窗口
/*	public static void main(String[] args) {
		FFT fft = new FFT();
		fft.setLocation(50,50);
		fft.setSize(500,400);
		fft.show();
	}   */
}

⌨️ 快捷键说明

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