/* A0730.java 7章3.の解答 * 同期加算による正弦波信号の分離 * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class A0730 extends Applet implements ActionListener { double X0 = 0.3 ; /* 信号の振幅 */ double OMEGA = 2.0*Math.PI*2.0 ; /* 信号の角周波数 */ 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) + X0 * Math.sin(OMEGA * i * DT); 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(); } } /* ガウス雑音 */ 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)); } }