// autocorr.java (2002.1.8 Shinji Nagashima) // import java.applet.Applet; import java.awt.*; import java.io.*; import java.lang.*; import java.net.URL; import java.util.*; import java.applet.*; import java.awt.event.*; public class autocorr extends Applet { TextArea ta1,ta2,ta3; // Button b1 = new Button(""); // Button b2 = new Button(""); Button b1; Button b2; Choice mychoice; Button b3; int d; int dn; int pow; int m; int j1; int j2; int exp2; int j; int k; int ndv2; double w; double arg; double c; double s; double t1; double t2; int n_data=0; int flag=1; int dnumb; int nf; int jk; double t0; double dt; double xr[]; double xi[]; double x_data[]; double y_data[]; double x_data2[]; double y_data2[]; int MouseX; int MouseY; double x_max; double y_max; double x_min; double y_min; boolean drawn = false; boolean flag_exec=false; int xx1; int xx2; int yy1; int yy2; double xg1; double xg2; double yg1; double yg2; double x1; double y1; double x2; double y2; Labo_Util labo; int nn; // 初めに一度だけ実行するメソッド public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); ta1 = new TextArea("",10,60); ta2 = new TextArea("",10,60); ta2.setEditable(false); ta2.setBackground(new Color(255,255,232)); ta3 = new TextArea("",10,60); ta3.setEditable(false); ta3.setBackground(new Color(255,255,232)); mychoice = new Choice(); mychoice.setBackground(Color.white); mychoice.addItem("X(linear)-Y(linear)"); mychoice.addItem("X(log) -Y(linear)"); mychoice.addItem("X(linear)-Y(log) "); mychoice.addItem("X(log) -Y(log) "); add(mychoice); add(ta1); add(b1=new Button("<実行>")); add(b2=new Button("<再描画>")); add(b3=new Button("<データ表示>")); b1.addActionListener(new MyListener()); b2.addActionListener(new MyListener()); b3.addActionListener(new MyListener()); // add(b1); // add(b2); add(ta2); add(ta3); setBackground(new Color(147,176,255)); setLayout((LayoutManager)null); ta1.setBounds(10,40,250,200); ta2.setBounds(10,265,250,130); ta3.setBounds(10,420,250,60); b1.setBounds(580,10,60,20); b2.setBounds(450,210,70,20); b3.setBounds(80,243,90,20); mychoice.setBounds(530,210,110,20); xr = new double[65540]; xi = new double[65540]; x_data = new double[65540]; y_data = new double[65540]; x_data2 = new double[65540]; y_data2 = new double[65540]; labo = new Labo_Util(); ta3.replaceRange("τ(sec)..."+"\n",0,500); //Mouse addMouseListener( new MouseAdapter(){ public void mouseClicked(MouseEvent e){ MouseX=e.getX(); MouseY=e.getY(); if((MouseX>=xx1) && (MouseX<=xx2) && (MouseY>=yy1) && (MouseY<=yy2)) { double freq=(double)( (double)(x2-x1)/(int)(xx2-xx1)*(MouseX-xx1)+x1); if ((mychoice.getSelectedIndex()==1) || (mychoice.getSelectedIndex()==3)) { freq=Math.exp(freq); }; ta3.append("Lag..."+String.valueOf(freq)+" sec"+"\n"); } } } ); // } /* public boolean mouseDown(Event evt, int x, int y) { MouseX = x; MouseY = y; if((MouseX>=xx1) && (MouseX<=xx2) && (MouseY>=yy1) && (MouseY<=yy2)) { double freq=(double)( (double)(x2-x1)/(int)(xx2-xx1)*(MouseX-xx1)+x1); if ((mychoice.getSelectedIndex()==1) || (mychoice.getSelectedIndex()==3)) { freq=Math.exp(freq); }; ta3.append("frequency..."+String.valueOf(freq)+"Hz"+"\n"); } return true; } */ // Graphicsクラスを用いて文字を描画 public void paint(Graphics g) { Font f_TimesRoman; f_TimesRoman = new Font("TimesRoman",Font.ITALIC,12); g.setFont(f_TimesRoman); g.drawString("Data Window",10,35); g.drawString("Answer...",10,260); g.drawString("Graph time(sec) - y",280,35); g.drawString("Graph τ(sec) - R",280,235); g.drawString("Lag Point",10,415); f_TimesRoman = new Font("TimesRoman",Font.ITALIC,15); g.setColor(Color.green); g.drawString("Auto-Correlation Analyzer",250,20); g.setColor(Color.green); g.drawString("2007 N Labo.",530,495); // グラフィック // 変動データ表示 xx1=280; xx2=640; yy1=40; yy2=200; g.setColor(new Color(255,255,232)); g.fillRect(xx1,yy1,xx2-xx1,yy2-yy1); if (drawn) { // データの最大値および最小値の計算 g.setColor(Color.gray); x_max=x_data[1]; x_min=x_data[1]; y_max=y_data[1]; y_min=y_data[1]; for (int i=1; i<=n_data; i++) { if (x_max < x_data[i]){x_max = x_data[i];}; if (y_max < y_data[i]){y_max = y_data[i];}; if (x_min > x_data[i]){x_min = x_data[i];}; if (y_min > y_data[i]){y_min = y_data[i];}; } double x1=(x_min+x_max)*0.5-(x_max-x_min)*0.5; double y1=(y_min+y_max)*0.5-(y_max-y_min)*0.8; double x2=(x_min+x_max)*0.5+(x_max-x_min)*0.5; double y2=(y_min+y_max)*0.5+(y_max-y_min)*0.8; xg1=x_min; yg1=(y_min+y_max)*0.5-(y_max-y_min)*0.6; xg2=x_max; yg2=(y_min+y_max)*0.5+(y_max-y_min)*0.6; for (int i=1; i<=n_data-1; i++) { g.drawLine(labo.mapping_x(x_data[i],x1,x2,xx1,xx2), labo.mapping_y(y_data[i],y1,y2,yy1,yy2), labo.mapping_x(x_data[i+1],x1,x2,xx1,xx2), labo.mapping_y(y_data[i+1],y1,y2,yy1,yy2)); } g.setColor(Color.black); int y10=yy1+(yy2-yy1)/2; g.drawLine(xx1,y10,xx2,y10); double dx=labo.round((xg2-xg1)/5); int i1=(int)Math.round(xg1/dx)-2; int i2=(int)Math.round(xg2/dx)+2; int p=labo.power(xg2); g.drawString("*10",labo.mapping_x(xg1+(xg2-xg1)*0.85,x1,x2,xx1,xx2), labo.mapping_y(yg1+(yg2-yg1)*0.25,y1,y2,yy1,yy2)); g.drawString("t (sec)",labo.mapping_x(xg1+(xg2-xg1)*0.45,x1,x2,xx1,xx2), labo.mapping_y(yg1+(yg2-yg1)*0.25,y1,y2,yy1,yy2)); g.drawString(String.valueOf(p),labo.mapping_x(xg1+(xg2-xg1)*0.9,x1,x2,xx1,xx2), labo.mapping_y(yg1+(yg2-yg1)*0.33,y1,y2,yy1,yy2)); for (int i=i1; i<=i2; i++) { double xxx=i*dx; if((xxx>xg1) && (xxx x_data2[i]){x_min = x_data2[i];} if (y_min > y_data2[i]){y_min = y_data2[i];} } x1=(x_min+x_max)*0.5-(x_max-x_min)*0.8; y1=(y_min+y_max)*0.5-(y_max-y_min)*0.8; x2=(x_min+x_max)*0.5+(x_max-x_min)*0.8; y2=(y_min+y_max)*0.5+(y_max-y_min)*0.8; xg1=x_min; yg1=(y_min+y_max)*0.5-(y_max-y_min)*0.6; xg2=x_max; yg2=(y_min+y_max)*0.5+(y_max-y_min)*0.6; // 枠線表示 g.setColor(Color.gray); g.drawRect(labo.mapping_x(xg1,x1,x2,xx1,xx2), labo.mapping_y(yg2,y1,y2,yy1,yy2), Math.abs(labo.mapping_x(xg2,x1,x2,xx1,xx2) -labo.mapping_x(xg1,x1,x2,xx1,xx2)), Math.abs(labo.mapping_y(yg2,y1,y2,yy1,yy2) -labo.mapping_y(yg1,y1,y2,yy1,yy2))); g.drawString("τ(sec)",labo.mapping_x(xg1+(xg2-xg1)*0.5,x1,x2,xx1,xx2), labo.mapping_y(yg1-(yg2-yg1)*0.12,y1,y2,yy1,yy2)); f_TimesRoman = new Font("TimesRoman",Font.ITALIC,12); g.setFont(f_TimesRoman); // X Label Linear if ( (mychoice.getSelectedIndex()==0) || (mychoice.getSelectedIndex()==2) ) { double dx=labo.round((xg2-xg1)/5); int i1=(int)Math.round(xg1/dx)-2; int i2=(int)Math.round(xg2/dx)+2; int p=labo.power(xg2); g.drawString("*10",labo.mapping_x(xg2,x1,x2,xx1,xx2), labo.mapping_y(yg1-(yg2-yg1)*0.12,y1,y2,yy1,yy2)); g.drawString(String.valueOf(p),labo.mapping_x(xg2+(xg2-xg1)*0.08,x1,x2,xx1,xx2), labo.mapping_y(yg1-(yg2-yg1)*0.09,y1,y2,yy1,yy2)); for (int i=i1; i<=i2; i++) { double xxx=i*dx; if((xxx>xg1) && (xxxxg1) && (xxxyg1) && (yyyyg1) && (yyy1) { i=i+1; d=d/2; } return i; } // main_calc void main_calc() { double c1; double c2; double c3; double m1; double m2; nn=labo.Trunc(n_data*0.6); for(int k=1; k<=nn; k++){ ta2.replaceRange("計算中: "+k+"/"+nn+"\n",0,30000); xi[k]=k*dt; m1=0; for (int i=1; i<=n_data-k; i++){ m1=m1+y_data[i]; } m1=m1/(n_data-k); m2=0; for (int i=1; i<=n_data-k; i++){ m2=m2+y_data[i+k]; } m2=m2/(n_data-k); c1=0; for (int i=1; i<=n_data-k; i++){ c1=c1+(y_data[i]-m1)*(y_data[i+k]-m2); } c1=c1; c2=0; for (int i=1; i<=n_data-k; i++){ c2=c2+(y_data[i]-m1)*(y_data[i]-m); } c2=c2; c3=0; for (int i=1; i<=n_data-k; i++){ c3=c3+(y_data[i+k]-m2)*(y_data[i+k]-m2); } c3=c3; xr[k]=c1/Math.sqrt(c2*c3); // ta2.append(labo.double2String(xi[k],4)+','+labo.double2String(xi[k],4)+"\n"); } } // ボタンを押したら実行するメソッド class MyListener implements ActionListener{ public void actionPerformed(ActionEvent e) { if((e.getSource()==b1) || (e.getSource()==b2) || (e.getSource()==b3)){ if(e.getSource()==b1) { flag_exec=true; // データ取得 String instr = ta1.getText(); //テキストエリア1よりStringをゲット if (instr.charAt(instr.length()-1) != '\n') { instr=instr+"\n"; } ta2.replaceRange("τ(sec) , R"+"\n",0,30000); data_aqui(instr); dnumb=n_data; // FFT ta2.replaceRange("計算中"+"\n",0,30000); main_calc(); ta2.replaceRange("計算終了"+"\n",0,30000); // 結果表示 // kiroku(); } if(e.getSource()==b3){ ta2.replaceRange("表示準備中",0,30000); String instr_tmp="τ(sec) , R"+"\n"; String instr_out=""; int count=0; for(int k=1; k<=nn; k++){ count=count+1; instr_tmp=instr_tmp+labo.double2String(xi[k],4)+','+labo.double2String(xr[k],4)+"\n"; if (count>1000){ instr_out=instr_out+instr_tmp; instr_tmp=""; count=0; } ta2.replaceRange("表示準備中: "+k+"/"+nn+"\n",0,30000); } instr_out=instr_out+instr_tmp; ta2.replaceRange("",0,30000); ta2.append(instr_out); } // グラフ表示 if( ( (e.getSource()==b2) && (flag_exec) ) || (e.getSource()==b1) ) { for(int i=1; i<=nn; i++) { ta2.replaceRange("グラフ表示準備中: "+i+"/"+nn+"\n",0,30000); if (mychoice.getSelectedIndex()==0) { x_data2[i]=xi[i]; y_data2[i]=xr[i]; } if (mychoice.getSelectedIndex()==1) { x_data2[i]=Math.log(xi[i]); y_data2[i]=xr[i]; } if (mychoice.getSelectedIndex()==2) { x_data2[i]=xi[i]; y_data2[i]=Math.log(xr[i]); } if (mychoice.getSelectedIndex()==3) { x_data2[i]=Math.log(xi[i]); y_data2[i]=Math.log(xr[i]); } } drawn = true; repaint(); } } } } }