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

📄 mainform.java

📁 Java实现的快速自相关算法:提供交互界面,可读入外部数据文件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import com.ms.wfc.app.*;
import com.ms.wfc.core.*;
import com.ms.wfc.ui.*;
import com.ms.wfc.html.*;
import com.ms.wfc.io.*;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.io.*;

/**
 * This class can take a variable number of parameters on the command
 * line. Program execution begins with the main() method. The class
 * constructor is not invoked unless an object of type 'Form1' is
 * created in the main() method.
 */
public class mainform extends Form
{
	
	boolean draw=false;
	int trial=10,electrade=16,datapoint=1200;
	int wintimelength=10,winfrqlength=5;
	double eeg[][][];
	double eegmean[][];
	double eegstd[][];
	double neeg[][][];
	double ave[][];
	double Sre[][][]=new double[1][1][1];
	double Sim[][][]=new double[1][1][1];
	double xianggan[];
	double xiangguan[];
	double C[];
	
	public mainform()
	{
		// Required for Visual J++ Form Designer support
		
		initForm();
		this.comboBox1.setSelectedIndex(0);
		this.comboBox2.setSelectedIndex(0);
		/*
		double re12=-49.39094605210731;
		double im12=23.21608944704515;
		double re11=-2998.422287813117;
		double im11=5487.2851057336775;
		double re22=-0.5815660533780922;
		double im22=-0.05978839135106076;
		double A12=re12*re12+im12*im12;
		double A11=Math.sqrt(re11*re11+im11*im11);
		double A22=Math.sqrt(re22*re22+im22*im22);
		System.out.print("FUCK="+A12/(A11*A22)+"");
		
		*/
		// TODO: Add any constructor code after initForm call
	}

	/**
	 * Form1 overrides dispose so it can clean up the
	 * component list.
	 */
	
	public boolean IsDoubleChar(char C){
		String S="0123456789.";
		for(int i=0;i<S.length();i++)
			if(C==S.charAt(i))return true;
		return false;
		
	}
	
	public int DoubleNumInFile(String Filename){
		try{
			RandomAccessFile myfile=new RandomAccessFile(Filename,"r");
			long filepointer=0;
			long filelength=myfile.length();
			String S="";
			String buffer="";
			int x=0;
			while(filepointer<filelength){
				S=myfile.readLine();
				buffer="";
				for(int i=0;i<S.length();i++){
					if(this.IsDoubleChar(S.charAt(i))){
						buffer+=S.valueOf(S.charAt(i));
						}
					else{
						if(buffer.equals("")==false){
							x+=1;
							}
							buffer="";
					}
				}
				if(buffer.equals("")==false){
					x+=1;
					}
				filepointer=myfile.getFilePointer();
				}//while :reading file
			myfile.close();
			return x;
		}catch(Exception e){
			return 0;
		}
	}
	
	public boolean ReadDoubleToEEG(String Filename){//成功为true,否则为false
		try{
			RandomAccessFile myfile=new RandomAccessFile(Filename,"r");
			long filepointer=0;
			long filelength=myfile.length();
			String S="";
			String buffer="";
			int x=0;
			while(filepointer<filelength){
				S=myfile.readLine();
				buffer="";
				for(int i=0;i<S.length();i++){
					if(this.IsDoubleChar(S.charAt(i))){
						buffer+=S.valueOf(S.charAt(i));
						}
					else{
						if(buffer.equals("")==false){
							x+=1;
							eeg[(x-1)%electrade+1][(x-1)/(electrade*datapoint)+1][(((x-1)%(electrade*datapoint))/electrade+1)]=Double.valueOf(buffer).doubleValue();
							}
							buffer="";
					}
				}
				if(buffer.equals("")==false){
					x+=1;
					eeg[(x-1)%electrade+1][(x-1)/(electrade*datapoint)+1][(((x-1)%(electrade*datapoint))/electrade+1)]=Double.valueOf(buffer).doubleValue();
					}
				filepointer=myfile.getFilePointer();
				}//while :reading file
			myfile.close();
			return true;
		}catch(Exception e){
			return false;
		}
	}
	
	public void ComputEEGMEAN(){
		double sum=0;
		for(int i=1;i<=electrade;i++)
			for(int j=1;j<=trial;j++){
				for(int k=1;k<=datapoint;k++)
					sum+=eeg[i][j][k];
				eegmean[i][j]=sum/(double)datapoint;
				sum=0;
			}//for j;for i
	}
	
	public void ComputEEGSTD(){
		double sum=0;
		for(int i=1;i<=electrade;i++)
			for(int j=1;j<=trial;j++){
				for(int k=1;k<=datapoint;k++){
					sum+=Math.pow(eegmean[i][j]-eeg[i][j][k],2);
					}
				eegstd[i][j]=Math.sqrt(sum/(double)datapoint);
				sum=0;
				}//for j;for i
	}
	
	public void ComputNEEG(){
		for(int i=1;i<=electrade;i++)
			for(int j=1;j<=trial;j++)
				for(int k=1;k<=datapoint;k++){
					neeg[i][j][k]=(eeg[i][j][k]-eegmean[i][j])/eegstd[i][j];
					}
	}
	
	public void ComputMEANofNEEG(){
		double sum=0;
		for(int i=1;i<=electrade;i++)
			for(int k=1;k<=datapoint;k++){
				for(int j=1;j<=trial;j++){
					sum+=neeg[i][j][k];
					}
				eegmean[i][k]=sum/(double)trial;
				sum=0;
				}
	}
	
	public void ComputSTDofNEEG(){
		double sum=0;
		for(int i=1;i<=electrade;i++)
			for(int j=1;j<=datapoint;j++){
				for(int k=1;k<=trial;k++)
					sum+=Math.pow(eegmean[i][j]-neeg[i][k][j],2);
				eegstd[i][j]=Math.sqrt(sum/(double)trial);
				sum=0;
				}
	}
	
	public void ComputNeegAve(){
		double sum=0;
		for(int i=1;i<=electrade;i++)
			for(int j=1;j<=datapoint;j++){
				for (int k=1;k<=trial;k++)
					sum+=neeg[i][k][j];
				ave[i][j]=sum/(double)trial;
				//System.out.print("aveY["+i+"]["+j+"]="+ave[i][j]+"\n");
				sum=0;
			}
	}
	
	public double ComputR(double X[],double Y[],int length){
		double sum1=0,sum2=0,sum3=0,avex=0,avey=0;
		for(int i=1;i<=length;i++){
			avex+=X[i];
		}
		avex/=length;
		for(int i=1;i<=length;i++){
			avey+=Y[i];
		}
		avey/=length;
		for(int i=1;i<=length;i++)
			sum1+=(X[i]-avex)*(Y[i]-avey);
		for(int i=1;i<=length;i++)
			sum2+=(X[i]-avex)*(X[i]-avex);
		for(int i=1;i<=length;i++)
			sum3+=(Y[i]-avey)*(Y[i]-avey);
		return sum1/Math.sqrt(sum2*sum3);
		
	}
	
	public void dft(double X[]){
		double midre=0,midim=0;
		double re[]=new double[X.length],im[]=new double[X.length];
		int N=X.length-1;
		for(int i=1;i<=N;i++){
			re[i]=0;im[i]=0;
			for(int j=1;j<=N;j++){
				midre=Math.cos(2*Math.PI*(i-1)*(j-1)/N);
				midim=Math.sin(2*Math.PI*(i-1)*(j-1)/N);
				re[i]+=X[j]*midre;
				im[i]+=X[j]*midim;
				}
			}//for i=1:N
		double sum=0;
		for (int i=1;i<=N;i++)
			sum+=Math.sqrt(re[i]*re[i]+im[i]*im[i]);
		for(int i=1;i<=N;i++)
			X[i]=Math.sqrt(re[i]*re[i]+im[i]*im[i])/sum;
	}
	
	
	public void dispose()
	{
		super.dispose();
		components.dispose();
	}
	


	private void button1_click(Object source, Event e)
	{
		//int iii=0;
	OpenFileDialog ofd = new OpenFileDialog();
	ofd.setFilter("EEG数据文件(*.eeg)|*.eeg|所有文件(*.*)|*.*\n");
	
	int OK = ofd.showDialog();
	if (OK==DialogResult.OK) {  
		
		try{
			trial=Integer.parseInt(this.edit2.getText());
			try{
				electrade=Integer.parseInt(this.edit1.getText());
				try{
					datapoint=Integer.parseInt(this.edit3.getText());
					this.label5.setText(String.valueOf(trial*electrade*datapoint));	
					this.label7.setText("testing......\n");	
					this.label8.setForeColor(Color.BLACK);
					this.label8.setText("格式检验......\n");
					
					int doublenuminfile=this.DoubleNumInFile(ofd.getFileName());
					this.label7.setText(String.valueOf(doublenuminfile));
					
					if(doublenuminfile==trial*electrade*datapoint){//检验通过
						this.label8.setForeColor(Color.BLACK);
						this.label8.setText("检验通过!正在数据初始化,请稍候......");
						
						eeg=new double[electrade+1][trial+1][datapoint+1];
						
						this.ReadDoubleToEEG(ofd.getFileName());
						
						this.label8.setText("数据初始化完成!正在进行数据规格化,请稍候......");
						//经检验,初始化无误!:)
						
						eegmean=new double[electrade+1][trial+1];//均值
						this.ComputEEGMEAN();
						
						eegstd=new double[electrade+1][trial+1];//偏移量
						this.ComputEEGSTD();
				
						neeg=new double[electrade+1][trial+1][datapoint+1];
						this.ComputNEEG();
						
						eegmean=new double[electrade+1][datapoint+1];
						this.ComputMEANofNEEG();
						
						eegstd=new double[electrade+1][datapoint+1];
						this.ComputSTDofNEEG();
						
						
						for(int i=1;i<=electrade;i++)
							for(int k=1;k<=datapoint;k++)
								for(int j=1;j<=trial;j++)
								{
									neeg[i][j][k]=(neeg[i][j][k]-eegmean[i][k])/eegstd[i][k];
									//System.out.print("neeg["+i+"]["+j+"]"+k+"]="+neeg[i][j][k]+"\n");
								}
						this.label8.setText("数据规格化完成!正在进行数据的相关/相干运算,请稍候......\n");		
						
						/////////////////////normalizing finished!Begin to coherence!/////////////////////////////////////
						ave=new double[electrade+1][datapoint+1];
						this.ComputNeegAve();
						draw=true;
						this.panel3.invalidate();
						int first=this.comboBox1.getSelectedIndex()+1;
						//System.out.print("first="+first+"\n");
						int second=this.comboBox2.getSelectedIndex()+1;
						
						wintimelength=datapoint/12;
						winfrqlength=12;
						double sigelX[]=new double[datapoint+1];
						double sigelY[]=new double[datapoint+1];
						for(int i=1;i<=datapoint;i++){
							sigelX[i]=ave[first][i];
							//System.out.print("sigelX["+i+"]="+sigelX[i]+"\n");
							sigelY[i]=ave[second][i];
							//System.out.print("sigelY["+i+"]="+sigelY[i]+"\n");
						}
						xiangguan=new double[datapoint+1-wintimelength];
						double midx[]=new double[wintimelength+1];
						double midy[]=new double[wintimelength+1];
						for(int i=1;i<xiangguan.length;i++){
							for(int j=1;j<=wintimelength;j++){
								midx[j]=sigelX[i+j];
								midy[j]=sigelY[i+j];
							}
							xiangguan[i]=this.ComputR(midx,midy,wintimelength);
							//System.out.print(xiangguan[i]+"\n");
						}
						draw=true;
						this.panel1.invalidate();
						
						this.dft(sigelX);
						this.dft(sigelY);
						midx=new double[winfrqlength+1];
						midy=new double[winfrqlength+1];
						xianggan=new double[73-winfrqlength+1];
						for(int i=1;i<xianggan.length;i++){
							for(int j=1;j<=winfrqlength;j++){
								midx[j]=sigelX[i+j];
								midy[j]=sigelY[i+j];
							}
							xianggan[i]=Math.abs(this.ComputR(midx,midy,winfrqlength));
							//System.out.print(xiangguan[i]+"\n");
						}
						this.panel4.invalidate();				
						
						
						
						 
						 this.label8.setText("计算结束!请观察输出结果。\n");
														
						}//检验通过
						else{//检验未通过
							this.label8.setForeColor(Color.RED);
							this.label8.setText("文件格式检验未通过!请检查输入的数据格式是否正确!\n");
						}
					}catch(NumberFormatException ee){
					this.label8.setForeColor(Color.RED);
					this.label8.setText("错误:datapoint处输入的不是整数!请检查后重新输入!\n");
					}
				}catch(NumberFormatException ee){
				this.label8.setForeColor(Color.RED);
				this.label8.setText("错误:electrade处输入的不是整数!请检查后重新输入!\n");
				}
			}catch(NumberFormatException ee){
			this.label8.setForeColor(Color.RED);
			this.label8.setText("错误:trail处输入的不是整数!请检查后重新输入!\n");
			}
		
		}
	}





	private void panel1_paint(Object source, PaintEvent e)
	{
		
		int x0=20,y0=this.panel1.getHeight()-20;
		e.graphics.setPen(new Pen(Color.DARKGRAY,PenStyle.DOT,1));
		for(int i=0;i<=10;i++)
			e.graphics.drawLine(x0,y0-(panel1.getHeight()-40)/10*i,panel1.getWidth()-20,y0-(panel1.getHeight()-40)/10*i);
		for(int i=0;i<=100;i++)
			e.graphics.drawLine(x0+(int)((double)(panel1.getWidth()-40)/100*i),y0,x0+(int)((double)(panel1.getWidth()-40)/100*i),20);
		y0-=(this.panel1.getHeight()-40)/2;
		e.graphics.setPen(new Pen(Color.WHITE,PenStyle.SOLID,2));
		e.graphics.drawLine(x0,y0,this.panel1.getWidth()-20,y0);
		e.graphics.setTextColor(Color.WHITE);
		e.graphics.drawString("0",x0-10,y0);
		e.graphics.drawString("1",x0-10,20);
		e.graphics.drawString("-1",x0-10,panel1.getHeight()-30);
		e.graphics.drawString("ms",panel1.getWidth()/2,panel1.getHeight()-15);
		e.graphics.drawString("1200",panel1.getWidth()-40,panel1.getHeight()-20);
		
		if(draw){
			double step=(double)(this.panel1.getWidth()-40)/(datapoint-wintimelength);
			e.graphics.setPen(new Pen(Color.RED,PenStyle.SOLID,2));
			for(int i=1;i<datapoint-wintimelength;i++){
				e.graphics.drawLine(x0+(int)(step*(i-1)),y0-(int)(xiangguan[i]*((this.panel1.getHeight()-40)/2)),x0+(int)(step*i),y0-(int)(xiangguan[i+1]*((this.panel1.getHeight()-40)/2)));
				}
		}
		
	}

	private void button2_click(Object source, Event e)
	{
		if(draw){
		int first=this.comboBox1.getSelectedIndex()+1;
		int second=this.comboBox2.getSelectedIndex()+1;
		//this.wintimelength=Integer.parseInt(edit2.getText());
		//this.winfrqlength=Integer.parseInt(edit1.getText());
		double sigelX[]=new double[datapoint+1];
		double sigelY[]=new double[datapoint+1];
		for(int i=1;i<=datapoint;i++){
			sigelX[i]=ave[first][i];
			//System.out.print("sigelX["+i+"]="+sigelX[i]+"\n");
			sigelY[i]=ave[second][i];
			//System.out.print("sigelY["+i+"]="+sigelY[i]+"\n");
			}
			xiangguan=new double[datapoint+1-wintimelength];
			double midx[]=new double[wintimelength+1];
			double midy[]=new double[wintimelength+1];
			for(int i=1;i<xiangguan.length;i++){
				for(int j=1;j<=wintimelength;j++){
					midx[j]=sigelX[i+j];
					midy[j]=sigelY[i+j];
					}
				xiangguan[i]=this.ComputR(midx,midy,wintimelength);
				//System.out.print(xiangguan[i]+"\n");
				}
			this.panel1.invalidate();
			this.dft(sigelX);
			this.dft(sigelY);
			midx=new double[winfrqlength+1];
			midy=new double[winfrqlength+1];
			xianggan=new double[73-winfrqlength+1];
			for(int i=1;i<xianggan.length;i++){

⌨️ 快捷键说明

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