Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.87 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import javax.swing.event.ChangeEvent;
  5. import javax.swing.event.ChangeListener;
  6.  
  7. class FourierPanel extends JPanel implements ActionListener, ChangeListener {
  8. /**
  9. *
  10. */
  11. private static final long serialVersionUID = 1L;
  12. private TraceV7 trace = new TraceV7(this);
  13. private JSlider sAmp = new JSlider(1, 50);
  14. private JSlider tfFreq = new JSlider(1, 10);
  15. private JSlider sHarm = new JSlider(1, 50);
  16. private JComboBox<String> chForm = new JComboBox<String>();
  17. private JButton btBerechne = new JButton("Berechne");
  18. private PlotPanel plotPanel = new PlotPanel();
  19. private double[] signal = {};
  20.  
  21. private static final int TRAPEZ = 0, DREIECK = 1, SAWTOOTH = 2, RECHTECK = 3, PULSE = 4;
  22.  
  23. /**
  24. * <pre>
  25. * - Baut GUI
  26. * - Registriert Listener
  27. * </pre>
  28. */
  29. public FourierPanel() {
  30. trace.constructorCall();
  31. setLayout(null);
  32.  
  33. add(new Label("Amplitude:")).setBounds(20, 20, 60, 20);
  34. add(sAmp).setBounds(100, 20, 100, 20);
  35. sAmp.addChangeListener(this);
  36.  
  37. add(new Label("Frequenz:")).setBounds(500, 20, 60, 20);
  38. add(tfFreq).setBounds(560, 20, 100, 20);
  39. tfFreq.addChangeListener(this);
  40. sHarm.addChangeListener(this);
  41. add(new Label("Form:")).setBounds(20, 50, 60, 20);
  42. add(chForm).setBounds(100, 50, 100, 20);
  43. add(new Label("Harmonics:")).setBounds(490, 50, 70, 20);
  44. add(sHarm).setBounds(560, 50, 100, 20);
  45.  
  46. add(btBerechne).setBounds(10, 650, 680, 20);
  47. btBerechne.addActionListener(this);
  48.  
  49. chForm.addItem("Trapez");
  50. chForm.addItem("Dreieck");
  51. chForm.addItem("Sawtooth");
  52. chForm.addItem("Rechteck");
  53. chForm.addItem("Pulse");
  54.  
  55. add(plotPanel).setBounds(25, 100, 695, 620);
  56. }
  57.  
  58. /**
  59. * <pre>
  60. * - Liest Information aus GUI aus und legt sie in entsprechenden lokalen Var. ab.
  61. * - Verzweigung chForm.getSelectedIndex():
  62. * - Fall 0:
  63. * - signal gleich berechneRechteck() mit entsprechenden Parametern berechnen.
  64. * - Fall 1:
  65. * - signal gleich berechneDreieck() mit entsprechenden Parametern berechnen.
  66. * - Fall 2:
  67. * - signal gleich berechneSaegezahn() mit entsprechenden Parametern berechnen.
  68. * - Fall 3:
  69. * - signal gleich berechneTrapez() mit entsprechenden Parametern berechnen.
  70. * - Fall 4:
  71. * - signal gleich berechnePulse() mit entsprechenden Parametern berechnen.
  72. * - Setzt Signal des PlotPanels mittels setSignal().
  73. * - Löst Neuzeichnen aus.
  74. * </pre>
  75. */
  76. @Override
  77. public void actionPerformed(ActionEvent e) {
  78. trace.eventCall();
  79. int N = 620; // Anzahl Punkte auf der x Achse
  80.  
  81. if(e.getSource()==btBerechne) {
  82.  
  83. //double ampli = Double.parseDouble(tfAmp.getText());
  84. int ampli = sAmp.getValue();
  85. int frequi = tfFreq.getValue();
  86. int harmoni = sHarm.getValue();
  87.  
  88. switch (chForm.getSelectedIndex()) {
  89. case RECHTECK:
  90. signal = berechneRechteck(ampli, frequi, harmoni, N);
  91. break;
  92.  
  93. case DREIECK:
  94. signal = berechneDreieck(ampli, frequi, harmoni, N);
  95. break;
  96.  
  97. case SAWTOOTH:
  98. signal = berechneSaegezahn(ampli, frequi, harmoni, N);
  99. break;
  100.  
  101. case TRAPEZ:
  102. signal = berechneTrapez(ampli, frequi, harmoni, N);
  103. break;
  104.  
  105. case PULSE:
  106. signal = berechnePulse(ampli, frequi, harmoni, N);
  107. break;
  108. }
  109. plotPanel.setSignal(signal);
  110. plotPanel.repaint();
  111. }
  112. }
  113.  
  114. private double[] berechnePulse(double amp, double freq, int nHarm, int N) {
  115. trace.methodeCall();
  116. double[] x = new double[N];
  117.  
  118. double omega = (Math.PI * 2.0 * freq)/620;
  119.  
  120. for (int harms = 1; harms<= nHarm; harms++) {
  121. for (int n = 0; n< N; n++) {
  122. x[n] += ((amp*2) * Math.sin(n*omega*harms));
  123. }
  124. }
  125.  
  126. return x;
  127. }
  128.  
  129. private double[] berechneTrapez(double amp, double freq, int nHarm, int N) {
  130. trace.methodeCall();
  131. double[] x = new double[N];
  132.  
  133. double beta = Math.PI / 3.0;
  134.  
  135. for (int n = 0; n < N; n++) {
  136. for ( int k = 1; k <= nHarm+1; k++) {
  137. x[n] += (8*amp/(Math.PI*beta))
  138. * Math.sin(beta*(2*k-1))
  139. * Math.sin(2.0*Math.PI*(2*k-1)*freq*n/N)
  140. / Math.pow(2*k-1,2.0);
  141. }
  142. }
  143. return x;
  144. }
  145.  
  146. /**
  147. * <pre>
  148. * -Berechnet aufgrund der Parameter Rechtecksignal
  149. * </pre>
  150. *
  151. * @param amp
  152. * @param freq
  153. * @param nHarm
  154. * @return
  155. */
  156. private double[] berechneRechteck(double amp, double freq, int nHarm, int N) {
  157. double[] x = new double[N];
  158. for (double n = 0; n < N; n++) {
  159. for (double k = 1; k <= nHarm; k++) {
  160.  
  161. x[(int) n] += (4.0 * amp / Math.PI)
  162. * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N)) / ((2.0 * k) - 1.0));
  163. }
  164. }
  165. return x;
  166. }
  167.  
  168. /**
  169. * <pre>
  170. * -Berechnet aufgrund der Parameter Dreiecksignal
  171. * </pre>
  172. *
  173. * @param amp
  174. * @param freq
  175. * @param nHarm
  176. * @return
  177. */
  178. private double[] berechneDreieck(double amp, double freq, int nHarm, int N) {
  179. //trace.methodeCall();
  180. double[] x = new double[N];
  181. for (double n = 0; n < N; n++) {
  182. for (double k = 1; k <= nHarm; k++) {
  183. if (k % 2 == 0) {
  184. x[(int) n] -= (4.0 * amp / Math.PI) * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N))
  185. / Math.pow(((2.0 * k) - 1.0), 2));
  186. } else {
  187. x[(int) n] += (4.0 * amp / Math.PI) * (Math.sin(2.0 * Math.PI * freq * ((2.0 * k) - 1.0) * (n / N))
  188. / Math.pow(((2.0 * k) - 1.0), 2));
  189. }
  190. }
  191. }
  192. return x;
  193. }
  194.  
  195. /**
  196. * <pre>
  197. * -Berechnet aufgrund der Parameter Sägezahnsignal
  198. * </pre>
  199. *
  200. * @param amp
  201. * @param freq
  202. * @param nHarm
  203. * @return
  204. */
  205. private double[] berechneSaegezahn(double amp, double freq, int nHarm, int N) {
  206. double[] x = new double[N];
  207.  
  208. double omega = (Math.PI * 2.0 * freq)/620;
  209.  
  210. for (int harms = 1; harms<= nHarm; harms++) {
  211. for (int n = 0; n< N; n++) {
  212. x[n] += ((amp*2) * Math.sin(n*omega*harms))/harms;
  213. }
  214. }
  215. return x;
  216. }
  217.  
  218. @Override
  219. public void stateChanged(ChangeEvent arg0) {
  220. // TODO Auto-generated method stub
  221. btBerechne.doClick();
  222. }
  223.  
  224. }
  225.  
  226. public class FourierPanelFrame extends JFrame {
  227.  
  228.  
  229. public static void main(String args[]) {
  230. TraceV7.mainCall();
  231. FourierPanelFrame frame = new FourierPanelFrame();
  232. frame.addWindowListener(new WindowAdapter() {
  233. public void windowClosing(WindowEvent e) {
  234. System.exit(1);
  235. }
  236. });
  237. FourierPanel view = new FourierPanel();
  238. frame.add(view);
  239. frame.setSize(720, 720); //720x720
  240. // frame.setLayout(null);
  241. //frame.setIconImage(icon);
  242. frame.setTitle("|FHNW|EIT|OOP|Fourier-Panel|");
  243. frame.setResizable(true);
  244. frame.setVisible(true);
  245.  
  246.  
  247. }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement