Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.event.ChangeEvent;
- import javax.swing.event.ChangeListener;
- class FourierPanel extends JPanel implements ActionListener, ChangeListener {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private TraceV7 trace = new TraceV7(this);
- private JSlider sAmp = new JSlider(1, 50);
- private JSlider tfFreq = new JSlider(1, 10);
- private JSlider sHarm = new JSlider(1, 50);
- private JComboBox<String> chForm = new JComboBox<String>();
- private JButton btBerechne = new JButton("Berechne");
- private PlotPanel plotPanel = new PlotPanel();
- private double[] signal = {};
- private static final int TRAPEZ = 0, DREIECK = 1, SAWTOOTH = 2, RECHTECK = 3, PULSE = 4;
- /**
- * <pre>
- * - Baut GUI
- * - Registriert Listener
- * </pre>
- */
- public FourierPanel() {
- trace.constructorCall();
- setLayout(null);
- add(new Label("Amplitude:")).setBounds(20, 20, 60, 20);
- add(sAmp).setBounds(100, 20, 100, 20);
- sAmp.addChangeListener(this);
- add(new Label("Frequenz:")).setBounds(500, 20, 60, 20);
- add(tfFreq).setBounds(560, 20, 100, 20);
- tfFreq.addChangeListener(this);
- sHarm.addChangeListener(this);
- add(new Label("Form:")).setBounds(20, 50, 60, 20);
- add(chForm).setBounds(100, 50, 100, 20);
- add(new Label("Harmonics:")).setBounds(490, 50, 70, 20);
- add(sHarm).setBounds(560, 50, 100, 20);
- add(btBerechne).setBounds(10, 650, 680, 20);
- btBerechne.addActionListener(this);
- chForm.addItem("Trapez");
- chForm.addItem("Dreieck");
- chForm.addItem("Sawtooth");
- chForm.addItem("Rechteck");
- chForm.addItem("Pulse");
- add(plotPanel).setBounds(25, 100, 695, 620);
- }
- /**
- * <pre>
- * - Liest Information aus GUI aus und legt sie in entsprechenden lokalen Var. ab.
- * - Verzweigung chForm.getSelectedIndex():
- * - Fall 0:
- * - signal gleich berechneRechteck() mit entsprechenden Parametern berechnen.
- * - Fall 1:
- * - signal gleich berechneDreieck() mit entsprechenden Parametern berechnen.
- * - Fall 2:
- * - signal gleich berechneSaegezahn() mit entsprechenden Parametern berechnen.
- * - Fall 3:
- * - signal gleich berechneTrapez() mit entsprechenden Parametern berechnen.
- * - Fall 4:
- * - signal gleich berechnePulse() mit entsprechenden Parametern berechnen.
- * - Setzt Signal des PlotPanels mittels setSignal().
- * - Löst Neuzeichnen aus.
- * </pre>
- */
- @Override
- public void actionPerformed(ActionEvent e) {
- trace.eventCall();
- int N = 620; // Anzahl Punkte auf der x Achse
- if(e.getSource()==btBerechne) {
- //double ampli = Double.parseDouble(tfAmp.getText());
- int ampli = sAmp.getValue();
- int frequi = tfFreq.getValue();
- int harmoni = sHarm.getValue();
- switch (chForm.getSelectedIndex()) {
- case RECHTECK:
- signal = berechneRechteck(ampli, frequi, harmoni, N);
- break;
- case DREIECK:
- signal = berechneDreieck(ampli, frequi, harmoni, N);
- break;
- case SAWTOOTH:
- signal = berechneSaegezahn(ampli, frequi, harmoni, N);
- break;
- case TRAPEZ:
- signal = berechneTrapez(ampli, frequi, harmoni, N);
- break;
- case PULSE:
- signal = berechnePulse(ampli, frequi, harmoni, N);
- break;
- }
- plotPanel.setSignal(signal);
- plotPanel.repaint();
- }
- }
- private double[] berechnePulse(double amp, double freq, int nHarm, int N) {
- trace.methodeCall();
- double[] x = new double[N];
- double omega = (Math.PI * 2.0 * freq)/620;
- for (int harms = 1; harms<= nHarm; harms++) {
- for (int n = 0; n< N; n++) {
- x[n] += ((amp*2) * Math.sin(n*omega*harms));
- }
- }
- return x;
- }
- private double[] berechneTrapez(double amp, double freq, int nHarm, int N) {
- trace.methodeCall();
- double[] x = new double[N];
- double beta = Math.PI / 3.0;
- for (int n = 0; n < N; n++) {
- for ( int k = 1; k <= nHarm+1; k++) {
- x[n] += (8*amp/(Math.PI*beta))
- * Math.sin(beta*(2*k-1))
- * Math.sin(2.0*Math.PI*(2*k-1)*freq*n/N)
- / Math.pow(2*k-1,2.0);
- }
- }
- return x;
- }
- /**
- * <pre>
- * -Berechnet aufgrund der Parameter Rechtecksignal
- * </pre>
- *
- * @param amp
- * @param freq
- * @param nHarm
- * @return
- */
- private double[] berechneRechteck(double amp, double freq, int nHarm, int N) {
- double[] x = new double[N];
- for (double n = 0; n < N; n++) {
- for (double k = 1; k <= nHarm; k++) {
- x[(int) n] += (4.0 * amp / Math.PI)
- * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N)) / ((2.0 * k) - 1.0));
- }
- }
- return x;
- }
- /**
- * <pre>
- * -Berechnet aufgrund der Parameter Dreiecksignal
- * </pre>
- *
- * @param amp
- * @param freq
- * @param nHarm
- * @return
- */
- private double[] berechneDreieck(double amp, double freq, int nHarm, int N) {
- //trace.methodeCall();
- double[] x = new double[N];
- for (double n = 0; n < N; n++) {
- for (double k = 1; k <= nHarm; k++) {
- if (k % 2 == 0) {
- x[(int) n] -= (4.0 * amp / Math.PI) * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N))
- / Math.pow(((2.0 * k) - 1.0), 2));
- } else {
- x[(int) n] += (4.0 * amp / Math.PI) * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N))
- / Math.pow(((2.0 * k) - 1.0), 2));
- }
- }
- }
- return x;
- }
- /**
- * <pre>
- * -Berechnet aufgrund der Parameter Sägezahnsignal
- * </pre>
- *
- * @param amp
- * @param freq
- * @param nHarm
- * @return
- */
- private double[] berechneSaegezahn(double amp, double freq, int nHarm, int N) {
- double[] x = new double[N];
- double omega = (Math.PI * 2.0 * freq)/620;
- for (int harms = 1; harms<= nHarm; harms++) {
- for (int n = 0; n< N; n++) {
- x[n] += ((amp*2) * Math.sin(n*omega*harms))/harms;
- }
- }
- return x;
- }
- @Override
- public void stateChanged(ChangeEvent arg0) {
- // TODO Auto-generated method stub
- btBerechne.doClick();
- }
- }
- public class FourierPanelFrame extends JFrame {
- public static void main(String args[]) {
- TraceV7.mainCall();
- FourierPanelFrame frame = new FourierPanelFrame();
- frame.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- System.exit(1);
- }
- });
- FourierPanel view = new FourierPanel();
- frame.add(view);
- frame.setSize(720, 720); //720x720
- // frame.setLayout(null);
- //frame.setIconImage(icon);
- frame.setTitle("|FHNW|EIT|OOP|Fourier-Panel|");
- frame.setResizable(true);
- frame.setVisible(true);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement