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

📄 analyzepan.java

📁 很好的播放软件可以用FFT算法计算波形 有点像media9 不过完整程序有两个部分
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.Line2D;
import java.util.Vector;

public class AnalyzePan extends JPanel implements ComponentListener,Runnable
{
	private Thread thread;
	private DFT dft;
	private int n;
	private Vector lines=new Vector();

	public AnalyzePan(int[] data,int n)
	{
		this.n=n;
		dft=new DFT(data,n);
		addComponentListener(this);
	}
	public AnalyzePan(){}
	
	//获得被采样数据
	public void setSampleData(int[] data)
	{
		dft.setSampleData(data);
	}
	//设置采样数
	public void setSampleNumber(int n)
	{
		dft.setSampleNumber(n);
	}
	
	//进行DFT运算并将其曲线写入Vector容器内
	public void createWaveForm()
	{
		//获得JPanel的高和宽
		Dimension d = getSize();
        int w = d.width;
        int h = d.height;
       	//lines里保存着每次根据采样点值画的连续曲线
     	//所以要先清空,以便以后载入新的连续曲线
     	lines.removeAllElements();
        
        double[] dftData=dft.getDFT();
        double max=0;
        
        //获取运算数据最大值        
        for(int i=0;i<dftData.length;i++)
        {
        	if(dftData[i]>max)max=dftData[i];
        }
        
        //声明画线坐标
        double x_new=0,x_old=0,y_new=0,y_old=0;
         
        //将DFT数据转换为曲线,并存入Vector容器内
        for(int i=0;i<dftData.length;i++)
        {
        	x_new=(double)i/dftData.length*w;
        	y_new=h*(dftData[i]/max);
        	lines.add(new Line2D.Double(x_old,y_old,x_new,y_new));
        	y_old=y_new;
        	x_old=x_new;
        }
                
        repaint();
	}
	
	public void paint(Graphics g)
	{
        Dimension d = getSize();
        int w = d.width;
        int h = d.height;
        //清屏
        Graphics2D g2 = (Graphics2D) g;
        g2.setBackground(Color.black);
        g2.clearRect(0, 0, w, h);
		//画十字格
		for(int i=0;i<10;i++)
		{
			Shape l=new Line2D.Float(w/10*i,0,w/10*i,h);
			g2.setColor(Color.GRAY);
			g2.draw(l);
			l=new Line2D.Float(0,h/10*i,w,h/10*i);
			g2.draw(l);
		}
		//画频谱分析曲线
        g2.setColor(Color.CYAN);
        if(dft != null)
        {
        	for (int i = 1; i < lines.size(); i++) 
        	{
            	g2.draw((Line2D) lines.get(i));
        	}
        }
    }
    
    public void start() 
    {
        thread = new Thread(this);
        thread.setName("AnalyzePan");
        thread.start();
    }

    public void stop() 
    {
        if (thread != null) 
        {
            thread.interrupt();
        }
        thread = null;
    }
    
	public void run()
	{
		while (thread != null) 
        {
            try { thread.sleep(100); } catch (Exception e) { break; }

            repaint();
        }
	}
	//实现当Panle大小改变时,里面内容自动重绘
	public void componentResized(ComponentEvent e)
	{
		createWaveForm();
	}
	public void componentMoved(ComponentEvent e){}
	public void componentShown(ComponentEvent e){}
	public void componentHidden(ComponentEvent e){}
}

⌨️ 快捷键说明

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