/* S0740.java * 同期加算による信号の分離 * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S0740 extends Applet implements ActionListener { double X0 = 0.5; /* 信号のピーク値 */ double W = 0.1; /* 信号の幅 */ double NOISE = 0.50; /* 雑音の標準偏差 */ double T_END = 10.0; /* シミュレーションの終了時刻 */ double DT = 0.01; /* シミュレーションのキザミ */ int M = 1000; /* memの大きさ T_END/DT */ int N = 4; /* 加算回数が0,3,15,63のときに表示 */ int N_END = 64 ; /* 加算回数の最大 */ Button button0; Button button1; boolean sw = false; public void init() { button0 = new Button(" 実行 "); button1 = new Button("クリア"); add(button0); add(button1); button0.addActionListener(this); button1.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); if (label.equals(" 実行 ")) sw = true; else sw = false; repaint(); } public void paint(Graphics g) { Window w; w = new Window(); int height; int width; int SPACE = 30; int m; /* 加算回数 */ int mm = 1; /* 表示する加算回数 */ int j = 0; /* 表示するウィンドの番号 */ double x = 0.0; /* 信号+雑音 */ double mem[] = new double [M]; /* 加算メモリ */ int i; /* スクリーンの大きさを読み取る */ width = getSize().width; height = getSize().height; /* グラフィックの準備 */ w.setWindow(0, 0.0,-2.0,T_END,2.0, SPACE,height/4-SPACE,width-SPACE,0); w.axis(0, "", 1.0, "m=0", 2.0, g); w.moveTo(0, 0.0, 0.0, g); w.setWindow(1, 0.0,-2.0,T_END,2.0, SPACE,height/2-SPACE,width-SPACE,height/4); w.axis(1, "", 1.0, "m=3", 2.0, g); w.moveTo(1, 0.0, 0.0, g); w.setWindow(2, 0.0,-2.0,T_END,2.0, SPACE,height/4*3-SPACE,width-SPACE,height/2); w.axis(2, "", 1.0, "m=15", 2.0, g); w.moveTo(2, 0.0, 0.0, g); w.setWindow(3, 0.0,-2.0,T_END,2.0, SPACE,height-SPACE,width-SPACE,height/4*3); w.axis(3, "", 1.0, "m=63", 2.0, g); w.moveTo(3, 0.0, 0.0, g); /* メイン */ if (sw == true) { for (m = 0; m <= N_END; m ++) { for (i = 0; i < T_END / DT; i ++) { x = noise(NOISE) + signal(i * DT, X0, W); mem[i] = (mem[i] * m + x) / (m + 1); } if (m == mm - 1) { for (i = 0; i < T_END / DT; i ++) { g.setColor(Color.blue); w.lineTo(j, i * DT, mem[i], g); /* jのウィンドウに表示 */ } mm = mm * N; j = j + 1; } } stop(); } } /* 信号パルス 大きさpeak パルス幅p_width */ double signal(double t, double peak, double p_width) { double t0 = 1.7; /* パルスの始まり時刻 */ if (t0 <= t && t <= t0 + p_width) { return(peak); } else { return(0.0); } } /* ガウス雑音 */ double noise(double sd) { double xw = 0.0; long i; for (i = 1; i <= 12; i ++){ xw = xw + Math.random(); } return(sd * (xw - 6.0)); } }