Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 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. double[] x = new double[N];
  180. double omega = (Math.PI * 2.0 * freq)/620;
  181. int zweiteungerade = 0;
  182.  
  183. x[0] = Math.sin(1*omega);
  184.  
  185. for (int harms = 1; harms<= nHarm; harms++) {
  186. for (int n = 0; n< N; n++) {
  187. if(zweiteungerade == 0) {
  188. x[n] -= ((amp*2) * Math.sin(n*omega*harms))/Math.pow(n, 2.0);
  189. }
  190. else if(zweiteungerade == 1) {
  191. x[n] += ((amp*2) * Math.sin(n*omega*harms))/Math.pow(n, 2.0);
  192. }
  193. zweiteungerade = 1;
  194. }
  195. }
  196. return x;
  197. }
  198.  
  199. /**
  200. * <pre>
  201. * -Berechnet aufgrund der Parameter Sägezahnsignal
  202. * </pre>
  203. *
  204. * @param amp
  205. * @param freq
  206. * @param nHarm
  207. * @return
  208. */
  209. private double[] berechneSaegezahn(double amp, double freq, int nHarm, int N) {
  210. double[] x = new double[N];
  211.  
  212. double omega = (Math.PI * 2.0 * freq)/620;
  213.  
  214. for (int harms = 1; harms<= nHarm; harms++) {
  215. for (int n = 0; n< N; n++) {
  216. x[n] += ((amp*2) * Math.sin(n*omega*harms))/harms;
  217. }
  218. }
  219. return x;
  220. }
  221.  
  222. @Override
  223. public void stateChanged(ChangeEvent arg0) {
  224. // TODO Auto-generated method stub
  225. btBerechne.doClick();
  226. }
  227.  
  228. }
  229.  
  230. public class FourierPanelFrame extends JFrame {
  231.  
  232.  
  233. public static void main(String args[]) {
  234. TraceV7.mainCall();
  235. FourierPanelFrame frame = new FourierPanelFrame();
  236. frame.addWindowListener(new WindowAdapter() {
  237. public void windowClosing(WindowEvent e) {
  238. System.exit(1);
  239. }
  240. });
  241. FourierPanel view = new FourierPanel();
  242. frame.add(view);
  243. frame.setSize(720, 720); //720x720
  244. // frame.setLayout(null);
  245. //frame.setIconImage(icon);
  246. frame.setTitle("|FHNW|EIT|OOP|Fourier-Panel|");
  247. frame.setResizable(true);
  248. frame.setVisible(true);
  249.  
  250.  
  251. }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement