import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import static java.lang.Math.*;
public class Fourier extends Applet implements AdjustmentListener
{
Scrollbar rollX;
int Kurven = 1;
int KoordinatenX[];
//Linienart
BasicStroke strokewidth = new BasicStroke (3);
BasicStroke strokeReset = new BasicStroke();
public void init()
{
setLayout(null);
rollX = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, 21);
rollX.addAdjustmentListener(this);
rollX.setBounds(200, 90, 150, 20);
add(rollX);
KoordinatenX = new int [400];
for(int cnt = 0;cnt < 400; cnt++)
KoordinatenX[cnt] = cnt + 50;
}
public void paint (Graphics g)
{
Graphics2D g2 = (Graphics2D) g; //erweiterte Grafik
g.drawLine(50, 175, 50, 475);
g.drawLine(50, 325, 500, 325);
g.fillPolygon(new int[]{47,50,53}, new int[]{175,170,175}, 3);
g.fillPolygon(new int[]{47,50,53}, new int[]{470,475,470}, 3);
g.fillPolygon(new int[]{495,500,495}, new int[]{322,325,328}, 3);
g.drawString("Anzahl Kurven: " + Kurven, 225, 80);
g.drawString("Javaprojekt Fourieranalyse 'Hochgeklappter Sinus'", 145, 30);
g.drawString("Rote Kurve = resultierende Schwingung", 280, 400);
g.drawString("Blaue Kurven = einzelne Oberschwingungen", 280, 420);
g.drawString("© by D. Eschler", 445, 495);
double zähler = 0;
double nenner = 0;
double klirrfaktor = 0;
double fourier[] = new double[400];
for(int cnt = 0;cnt < 400; cnt++)
fourier[cnt] = 0;
g.setColor(Color.BLUE);
for (int cnt = 0, x = 1; cnt < Kurven; cnt++, x=x+2)
{
double amplitude = 4 / (PI * x * (x + 2)); //Berechnung der Amplitude
double faktor = x + 1.0;
double Cosinus[] = calculateCosinus(amplitude, faktor);
for(int cnt1 = 0; cnt1 < 400; cnt1++)
fourier[cnt1] += Cosinus[cnt1];
g.drawPolyline(KoordinatenX, toYKoordinate(Cosinus), 400);
if (cnt != 0)
zähler += amplitude * amplitude;
nenner += amplitude * amplitude;
}
g.setColor(Color.RED);
g2.setStroke(strokewidth); //Linienart ändern
g.drawPolyline(KoordinatenX, toYKoordinate(fourier), 400); //zeichnen der Resultierenden
klirrfaktor = sqrt(zähler/nenner);
g.setColor(Color.BLACK);
klirrfaktor = round(klirrfaktor * 1000) / 1000.0;
g.drawString("Klirrfaktor: " + klirrfaktor, 230, 140);
g2.setStroke(strokeReset); //Linienart default
}
public void adjustmentValueChanged (AdjustmentEvent e)
{
Kurven = rollX.getValue();
repaint();
}
public double[] calculateCosinus (double amplitude, double Frequenzfaktor)
{
double freq = Frequenzfaktor * 2*PI; //Frequenz
double y[] = new double [400];
//Cosinus berechnen
for(int cnt = 0;cnt < 400; cnt++)
y[cnt] = cos(cnt/400.0*freq)*amplitude;
return y;
}
public int[] toYKoordinate(double x[])
{
double y;
int i[] = new int[400];
for(int cnt = 0;cnt < 400; cnt++)
{
y = x[cnt];
y *=100;
y = (int)(2/PI*100)-y; // fourier offset
y = 325 - y; // y-offset
i[cnt] = (int)y;
}
return i;
}
}