import java.awt.*;
import java.applet.Applet;
// JDK 1.02 version
public class FIRDigitalFilterDemo extends Applet
{
float[] ipSignal, opSignal;
static float ampl = 1.0f; // default amplitude = 1.0 V
static float rate = 8000.0f; // default sampling rate = 8000 samples/s
int nSamples;
float maxValue;
GraphPlot plotInput, plotOutput;
Choice chWaveform, chSamples;
TextField tfFreq, tfDCLevel, tfNoise;
Checkbox cbAddDCLevel, cbAddNoise;
Button btnSignal, btnLPFilter, btnBPFilter, btnHPFilter;
FIRFilterImplementation fir = new FIRFilterImplementation();
public void init()
{
setLayout(new GridLayout(3, 1));
plotInput = new GraphPlot();
plotOutput = new GraphPlot();
add(plotInput); // Input signal plot
add(plotOutput); // Output signal plot
// Control panel
Panel pnlControls = new Panel();
add(pnlControls);
pnlControls.setLayout(new GridLayout(3, 2));
// Waveform selection
Panel pnlWaveform = new Panel();
pnlWaveform.setLayout(new FlowLayout(FlowLayout.LEFT));
Label lblWaveform = new Label("Waveform");
chWaveform = new Choice();
chWaveform.addItem("Sine");
chWaveform.addItem("Cosine");
chWaveform.addItem("Square");
chWaveform.addItem("Triangular");
chWaveform.addItem("Sawtooth");
chWaveform.select("Sine"); // default waveform
pnlWaveform.add(lblWaveform);
pnlWaveform.add(chWaveform);
pnlControls.add(pnlWaveform);
// Added DC level setting
Panel pnlAddDCLevel = new Panel();
pnlAddDCLevel.setLayout(new FlowLayout(FlowLayout.LEFT));
cbAddDCLevel = new Checkbox("Add DC level");
tfDCLevel = new TextField("0", 5);
Label lblDCLevelUnit = new Label("V");
pnlAddDCLevel.add(cbAddDCLevel);
pnlAddDCLevel.add(tfDCLevel);
pnlAddDCLevel.add(lblDCLevelUnit);
pnlControls.add(pnlAddDCLevel);
// Signal frequency setting
Panel pnlFrequency = new Panel();
pnlFrequency.setLayout(new FlowLayout(FlowLayout.LEFT));
Label lblFreq = new Label("Frequency");
tfFreq = new TextField("1000", 8);
Label lblFreqUnit = new Label("Hz");
pnlFrequency.add(lblFreq);
pnlFrequency.add(tfFreq);
pnlFrequency.add(lblFreqUnit);
pnlControls.add(pnlFrequency);
// Added random noise setting
Panel pnlAddNoise = new Panel();
pnlAddNoise.setLayout(new FlowLayout(FlowLayout.LEFT));
cbAddNoise = new Checkbox("Add random noise");
tfNoise = new TextField("0", 5);
Label lblNoiseUnit = new Label("V");
pnlAddNoise.add(cbAddNoise);
pnlAddNoise.add(tfNoise);
pnlAddNoise.add(lblNoiseUnit);
pnlControls.add(pnlAddNoise);
// Number of samples
Panel pnlSamples = new Panel();
pnlSamples.setLayout(new FlowLayout(FlowLayout.LEFT));
Label lblSamples = new Label("Number of samples");
chSamples = new Choice();
chSamples.addItem("32");
chSamples.addItem("64");
chSamples.addItem("128");
chSamples.addItem("256");
chSamples.addItem("512");
chSamples.select("256");
pnlSamples.add(lblSamples);
pnlSamples.add(chSamples);
pnlControls.add(pnlSamples);
Panel pnlButtons = new Panel();
btnSignal = new Button("Plot signal");
btnLPFilter = new Button("LP Filter");
btnBPFilter = new Button("BP Filter");
btnHPFilter = new Button("HP Filter");
btnLPFilter.disable();
btnBPFilter.disable();
btnHPFilter.disable();
pnlButtons.setLayout(new FlowLayout(FlowLayout.LEFT));
pnlButtons.add(btnSignal);
pnlButtons.add(btnLPFilter);
pnlButtons.add(btnBPFilter);
pnlButtons.add(btnHPFilter);
pnlControls.add(pnlButtons);
}
public boolean action(Event evt, Object obj)
{
if (evt.target == btnSignal)
{
nSamples = Integer.parseInt(chSamples.getSelectedItem());
ipSignal = new float[nSamples];
SignalGenerator sg = new SignalGenerator();
sg.setWaveform(chWaveform.getSelectedItem());
sg.setAmplitude(ampl);
sg.setSamplingRate(rate);
sg.setFrequency(Float.valueOf(tfFreq.getText()).floatValue());
sg.setSamples(nSamples);
boolean addDC = cbAddDCLevel.getState();
sg.setDCLevelState(addDC);
if (addDC)
{
sg.setDCLevel(Float.valueOf(tfDCLevel.getText()).floatValue());
}
boolean addNoise = cbAddNoise.getState();
sg.setNoiseState(addNoise);
if (addNoise)
{
sg.setNoise(Float.valueOf(tfNoise.getText()).floatValue());
}
ipSignal = sg.generate();
btnLPFilter.enable();
btnBPFilter.enable();
btnHPFilter.enable();
maxValue = 0.0f;
for (int i = 0; i < nSamples; i++)
{
maxValue = Math.max(maxValue, Math.abs(ipSignal[i]));
}
maxValue *= 1.5f; // allow 50% overrange on vertical axis
plotInput.setYmax(maxValue);
plotInput.setPlotValues(ipSignal);
repaint();
return true;
}
else if (evt.target == btnLPFilter)
{
fir.setFilterType(FIRFilterImplementation.LP);
opSignal = new float[nSamples];
opSignal = fir.filter(ipSignal);
plotOutput.setYmax(maxValue);
plotOutput.setPlotValues(opSignal);
repaint();
return true;
}
else if (evt.target == btnBPFilter)
{
fir.setFilterType(FIRFilterImplementation.BP);
opSignal = new float[nSamples];
opSignal = fir.filter(ipSignal);
plotOutput.setYmax(maxValue);
plotOutput.setPlotValues(opSignal);
repaint();
return true;
}
else if (evt.target == btnHPFilter)
{
fir.setFilterType(FIRFilterImplementation.HP);
opSignal = new float[nSamples];
opSignal = fir.filter(ipSignal);
plotOutput.setYmax(maxValue);
plotOutput.setPlotValues(opSignal);
repaint();
return true;
}
else
{
return false;
}
}
}