import java.awt.*; import java.applet.*; public class AliasingDemo extends Applet implements Runnable { Thread runner; boolean isStandalone = false; BorderLayout borderLayout1 = new BorderLayout(); Panel pnlDisplay = new Panel(); Panel pnlControls = new Panel(); BorderLayout borderLayout2 = new BorderLayout(); FlowLayout flowLayout1 = new FlowLayout(); Label lblFrequency = new Label(); TextField tfFrequency = new TextField("7000", 5); Label lblFreqUnit = new Label(); Button btnPlot = new Button(); AliasPlot ap = new AliasPlot(); float rate = 8000.0f; int plotPts = 500; float sampleLength = 0.004f; // 4 ms sample length float dt = sampleLength / plotPts; float pi = (float)Math.PI; float f; Checkbox chbSignal = new Checkbox(); Checkbox chbSamples = new Checkbox(); Checkbox chbAlias = new Checkbox(); Checkbox chbGrid = new Checkbox(); //Get a parameter value public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //Construct the applet public AliasingDemo() { } public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } } public void stop() { if (runner != null) { runner.stop(); runner = null; } } public void run() { } //Initialize the applet public void init() { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } //Component initialization public void jbInit() throws Exception{ Font font = new Font("Dialog", 0, 11); lblFrequency.setFont(font); lblFrequency.setAlignment(2); lblFrequency.setText("Input frequency:"); tfFrequency.setFont(font); lblFreqUnit.setFont(font); lblFreqUnit.setText("Hz"); btnPlot.setFont(font); btnPlot.setLabel("Plot"); chbSamples.setFont(font); chbSamples.setLabel("Sample points"); chbSignal.setState(true); chbAlias.setFont(font); chbAlias.setLabel("Alias frequency"); chbGrid.setFont(font); chbGrid.setLabel("Grid"); chbSignal.setFont(font); chbSignal.setLabel("Input signal"); pnlControls.setLayout(flowLayout1); pnlDisplay.setLayout(borderLayout2); this.setLayout(borderLayout1); this.add("Center", pnlDisplay); pnlDisplay.add("Center", ap); this.add("South", pnlControls); pnlControls.add(lblFrequency); pnlControls.add(tfFrequency); pnlControls.add(lblFreqUnit); pnlControls.add(btnPlot); pnlControls.add(chbSignal); pnlControls.add(chbGrid); pnlControls.add(chbSamples); pnlControls.add(chbAlias); } //Get Applet information public String getAppletInfo() { return "Applet Information"; } //Get parameter info public String[][] getParameterInfo() { return null; } public boolean action(Event evt, Object arg) { if (evt.target == btnPlot) { float[] signal = new float[plotPts]; float theta, phi; f = Float.valueOf(tfFrequency.getText()).floatValue(); theta = 2.0f*pi*f*dt; for (int p = 0; p < plotPts; p++) signal[p] = (float)Math.sin(p*theta); ap.setYmax(1.2f); ap.setSignalData(signal); int nSamples = Math.round(rate*sampleLength); float[] samples = new float[nSamples]; phi = 2.0f*pi*f/rate; for (int i = 0; i < nSamples; i++) samples[i] = (float)Math.sin(i*phi); ap.setSamples(samples); float fa; boolean aliased = f > rate/2; chbAlias.hide(); if (aliased) { chbAlias.show(); while (f > rate) f -= rate; // shift frequency down to sampling rate band int sign = 1; fa = f; if (f > rate/2) { fa = rate - f; // alias frequency sign = -1; } theta = 2.0f*pi*fa*dt; float[] alias = new float[plotPts]; for (int p = 0; p < plotPts; p++) alias[p] = sign * (float)Math.sin(p*theta); ap.setAliasData(alias); } ap.setSignalVisibility(chbSignal.getState()); ap.setAliasVisibility(aliased && chbAlias.getState()); ap.setSamplesVisibility(chbSamples.getState()); ap.repaint(); return true; } if (evt.target == chbSignal) { ap.setSignalVisibility(chbSignal.getState()); ap.repaint(); return true; } if (evt.target == chbSamples) { ap.setSamplesVisibility(chbSamples.getState()); ap.repaint(); return true; } if (evt.target == chbAlias) { ap.setAliasVisibility(chbAlias.getState()); ap.repaint(); return true; } if (evt.target == chbGrid) { ap.setGridVisibility(chbGrid.getState()); ap.repaint(); return true; } // otherwise ... return false; } }