📄 fftlab.java
字号:
package Applet小程序;
/////////////////////////////////////////////////////////////////////////////
// Fast Fourier transform laboratory.
// Dave Hale, Landmark Graphics, 01/24/96
/////////////////////////////////////////////////////////////////////////////
import java.awt.*;
import java.util.*;
public class FftLab extends java.applet.Applet {
MainPanel mainPanel;
ControlPanel controlPanel;
public void init() {
FftLabController controller = new FftLabController();
setLayout(new BorderLayout());
mainPanel = new MainPanel(controller.fRealView,
controller.fImagView,
controller.gRealView,
controller.gImagView);
add("Center",mainPanel);
controlPanel = new ControlPanel(controller);
add("South",controlPanel);
}
public void start() {
mainPanel.enable();
controlPanel.enable();
}
public void stop() {
mainPanel.disable();
controlPanel.disable();
}
public boolean handleEvent(Event e) {
if (e.id==Event.WINDOW_DESTROY) {
System.exit(0);
}
return false;
}
public static void main(String args[]) {
Frame frame = new Frame("FFT Laboratory");
FftLab fftLab = new FftLab();
fftLab.init();
fftLab.start();
frame.add("Center",fftLab);
frame.resize(600,400);
frame.show();
}
}
/////////////////////////////////////////////////////////////////////////////
// Main panel for FftLab contains samples views.
class MainPanel extends Panel {
public MainPanel(SamplesView fRealView, SamplesView fImagView,
SamplesView gRealView, SamplesView gImagView) {
setLayout(new GridLayout(2,1,1,1));
add(new ComplexSamplesPanel(fRealView,
fImagView,
"f(x)"));
add(new ComplexSamplesPanel(gRealView,
gImagView,
"F(k)"));
}
public void paint(Graphics g) {
Dimension d = size();
g.setColor(Color.blue);
g.draw3DRect(0,0,d.width-1,d.height-1,true);
}
public Insets insets() {
return new Insets(1,1,1,1);
}
}
class ComplexSamplesPanel extends Panel {
public ComplexSamplesPanel(SamplesView realView,
SamplesView imagView,
String label) {
setLayout(new BorderLayout());
add("North",new Label(label,Label.CENTER));
Panel panel = new Panel();
panel.setLayout(new GridLayout(1,2,1,1));
panel.add(new SamplesPanel(realView,"Real"));
panel.add(new SamplesPanel(imagView,"Imaginary"));
add("Center",panel);
}
public void paint(Graphics g) {
Dimension d = size();
g.setColor(Color.blue);
g.draw3DRect(0,0,d.width-1,d.height-1,true);
}
public Insets insets() {
return new Insets(1,1,1,1);
}
}
class SamplesPanel extends Panel {
public SamplesPanel(SamplesView view, String label) {
setLayout(new BorderLayout());
add("North",new Label(label,Label.CENTER));
add("Center",view);
}
public void paint(Graphics g) {
Dimension d = size();
g.setColor(Color.blue);
g.draw3DRect(0,0,d.width-1,d.height-1,true);
}
public Insets insets() {
return new Insets(1,1,1,1);
}
}
/////////////////////////////////////////////////////////////////////////////
// Control panel for FftLab.
class ControlPanel extends Panel {
public ControlPanel(FftLabController c) {
this.c = c;
add(new Checkbox("Origin Centered"));
length = new LabeledChoice("Length:");
length.choice.addItem("16");
length.choice.addItem("32");
length.choice.addItem("128");
length.choice.select("32");
add(length);
mode = new LabeledChoice("Editing:");
mode.choice.addItem("Draw");
mode.choice.addItem("Negate");
mode.choice.addItem("Zero");
mode.choice.addItem("Shift");
mode.choice.addItem("None");
mode.choice.select("Draw");
add(mode);
add(new Button("Zero All"));
}
public void paint(Graphics g) {
Dimension d = size();
g.setColor(Color.blue);
g.draw3DRect(0,0,d.width-1,d.height-1,true);
}
public Insets insets() {
return new Insets(1,1,1,1);
}
public boolean handleEvent(Event e) {
if (e.target instanceof Button) {
c.zeroAll();
return true;
} else if (e.target instanceof Checkbox) {
Checkbox cb = (Checkbox)e.target;
c.setOriginCentered(cb.getState());
return true;
} else if (e.target instanceof Choice) {
if (e.target==length.choice) {
String item = length.choice.getSelectedItem();
c.setLength(Integer.parseInt(item));
return true;
} else if (e.target==mode.choice) {
String item = mode.choice.getSelectedItem();
if (item=="None") {
c.setEditMode(SamplesView.EDIT_NONE);
} else if (item=="Draw") {
c.setEditMode(SamplesView.EDIT_DRAW);
} else if (item=="Negate") {
c.setEditMode(SamplesView.EDIT_NEGATE);
} else if (item=="Zero") {
c.setEditMode(SamplesView.EDIT_ZERO);
} else if (item=="Shift") {
c.setEditMode(SamplesView.EDIT_SHIFT);
}
return true;
}
}
return false;
}
private FftLabController c;
private LabeledChoice length;
private LabeledChoice mode;
}
class LabeledChoice extends Panel {
public Choice choice;
public LabeledChoice(String label) {
add(new Label(label,Label.RIGHT));
choice = new Choice();
add(choice);
}
}
/////////////////////////////////////////////////////////////////////////////
// Controller creates and keeps Samples and SamplesViews consistent.
class FftLabController implements Observer {
public Samples fReal,fImag,gReal,gImag;
public SamplesView fRealView,fImagView,gRealView,gImagView;
public FftLabController() {
int origin = (originCentered)?length/2:0;
fReal = new Samples(length,origin);
fImag = new Samples(length,origin);
gReal = new Samples(length,origin);
gImag = new Samples(length,origin);
initSamples();
fReal.addObserver(this);
fImag.addObserver(this);
gReal.addObserver(this);
gImag.addObserver(this);
fRealView = new SamplesView(fReal);
fImagView = new SamplesView(fImag);
gRealView = new SamplesView(gReal);
gImagView = new SamplesView(gImag);
updateSampleValues(fRealView,fImagView);
updateSampleValues(gRealView,gImagView);
}
public int getEditMode() {
return editMode;
}
public void setEditMode(int mode) {
editMode = mode;
fRealView.setEditMode(mode);
fImagView.setEditMode(mode);
gRealView.setEditMode(mode);
gImagView.setEditMode(mode);
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
updateLengths();
updateOrigins();
initSamples();
updateSampleValues(fRealView,fImagView);
updateSampleValues(gRealView,gImagView);
repaintViews();
}
public boolean getOriginCentered() {
return originCentered;
}
public void setOriginCentered(boolean centered) {
if (centered==originCentered) return;
originCentered = centered;
updateOrigins();
repaintViews();
}
public void zeroAll() {
fReal.zero();
fImag.zero();
gReal.zero();
gImag.zero();
repaintViews();
}
public void update(Observable o, Object arg) {
Samples s = (Samples)o;
if (s==fReal || s==fImag) {
transform(1,fReal,fImag,gReal,gImag);
updateSampleValues(gRealView,gImagView);
gRealView.repaint();
gImagView.repaint();
} else {
transform(-1,gReal,gImag,fReal,fImag);
updateSampleValues(fRealView,fImagView);
fRealView.repaint();
fImagView.repaint();
}
}
private int editMode = SamplesView.EDIT_DRAW;
private int length = 32;
private boolean originCentered = false;
private float computeSampleValue(Samples real, Samples imag) {
float sv = 0.0f;
float v[];
v = real.values;
for (int i=0; i<length; ++i) {
float si = v[i];
if (-si>sv) sv = -si;
else if (si>sv) sv = si;
}
v = imag.values;
for (int i=0; i<length; ++i) {
float si = v[i];
if (-si>sv) sv = -si;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -