Bu Blogda Ara

15 Kasım 2009 Pazar

Kare Dalga Üretimi / Java

Fourier Açılımı (Detaylı bilgi...) ile kare dalga üretimi yapan java uygulaması. Veri iletişiminde kusursuza yakın kare dalgalar üretiminde kullanılmaktadır. Kare dalganın sinüs bileşenleri çıkartılır ve ardından bu dalgaların birbiriyle toplanmasıyla kare dalgaya yaklaşılabilir. Uygulamayı ilgili dersin ödevi için hazırlamıştım.

Ekran görüntüsü:



Uygulama Kodları:


/*
* Ramazan Bellek
*
* Sakarya University Computer Engineering Department
* Data Communication / Signal Generator Application
*
* File: Grafik.java
*
* 2009
*/

package dataComm;


import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JPanel;

class Koordinat
{
public Koordinat(int x,int y,Color c)
{
this.x=x;
this.y=y;
this.c=c;
}
public int x,y;
public Color c;
}

class Yazi
{
public String yazi;
public Koordinat k;
public Yazi(String yazi, Koordinat k)
{
this.yazi=yazi;
this.k=k;
}
}

public class Grafik extends JPanel {

private ArrayList<Koordinat> koordinatlar;
private ArrayList<Yazi> yazilar;
private Color c;

public Grafik()
{
super();
koordinatlar = new ArrayList<Koordinat>();
yazilar = new ArrayList<Yazi>();
c=Color.BLUE;
}


@Override
public void paint(Graphics g)
{
g.setColor(Color.BLACK);
g.fill3DRect(0, 0, 800, 400, false);

for(Koordinat k : koordinatlar)
{
g.setColor(k.c);
g.fillOval(k.x, k.y, 1, 1); // Windows için g.fillOval(k.x, k.y, 2, 2);
// Mac OSX (Unix) için g.fillOval(k.x, k.y, 1, 1);
}
for(Yazi y : yazilar)
{
g.setColor(y.k.c);
g.drawString(y.yazi, y.k.x, y.k.y);
}

}

public void noktaCiz(int x, int y,Color c)
{
koordinatlar.add(new Koordinat(x,y,c));
}


public void yaziYaz(String yazi, int x, int y, Color c)
{
yazilar.add(new Yazi(yazi,new Koordinat(x,y,c)));
}
public void yenile()
{
repaint();
}

public void temizle()
{
koordinatlar.clear();
}

public void renkSec(Color c)
{
this.c=c;
}
}







/*
* Ramazan Bellek
*
* Sakarya University Computer Engineering Department
* Data Communication / Signal Generator Application
*
* File: Sinyal.java
*
* 2009
*/

package dataComm;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Sinyal extends JFrame{

public static float PI = 3.14159265358979323846f;
public static int freq = 1;
public static int amp = 10;
public static int har = 1;
public static boolean goster = false;
private JButton btnCiz;

private JPanel pnlKontrol;
private JPanel pnlBilgi;
private JPanel pnlTuslar;
private Grafik grafik;
private JTextField tfAmp;
private JLabel lbAmp;
private JTextField tfFreq;
private JLabel lbFreq;
private JTextField tfHar;
private JLabel lbHar;
private JCheckBox cbGoster;
private JLabel lbGoster;
private JLabel lbBilgi;

public static void main(String[] args)
{
new Sinyal("Data Communication / Sinyal Generator");
}

public Sinyal(String baslik)
{
super(baslik);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
Dimension ebat = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds(ebat.width/2-400,ebat.height/2-300,800,600);
setDefaultLookAndFeelDecorated(true);
setLayout(new BorderLayout());

initComponents();


setVisible(true);
}

private void initComponents()
{
pnlKontrol = new JPanel();
pnlKontrol.setPreferredSize(new Dimension(800,200));
pnlKontrol.setLayout(new BorderLayout());
this.getContentPane().add(pnlKontrol,BorderLayout.SOUTH);
pnlTuslar = new JPanel();
pnlTuslar.setPreferredSize(new Dimension(800,100));
pnlTuslar.setLayout(new FlowLayout());
pnlKontrol.add(pnlTuslar,BorderLayout.NORTH);
pnlBilgi = new JPanel();
pnlBilgi.setPreferredSize(new Dimension(800,100));
pnlKontrol.add(pnlBilgi,BorderLayout.SOUTH);

btnCiz = new JButton("ReDraw");
btnCiz.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {
try
{
grafik.temizle();
Sinyal.amp=Integer.parseInt(tfAmp.getText());
Sinyal.freq=Integer.parseInt(tfFreq.getText());
Sinyal.har=Integer.parseInt(tfHar.getText());
if (cbGoster.isSelected())
goster=true;
else goster=false;
}catch(Exception e)
{
Sinyal.amp=10;
Sinyal.freq=1;
Sinyal.har=1;
System.err.println(e.getMessage());
}
drawCoordinates();
generateSinus();
}
});

tfAmp=new JTextField(5);
tfAmp.setText("10");
lbAmp=new JLabel("Amplitude:");
pnlTuslar.add(lbAmp);
pnlTuslar.add(tfAmp);

tfFreq=new JTextField(5);
tfFreq.setText("1");
lbFreq = new JLabel("Frequency:");
pnlTuslar.add(lbFreq);
pnlTuslar.add(tfFreq);

lbHar = new JLabel("Harmonics:");
tfHar = new JTextField(5);
tfHar.setText("1");

pnlTuslar.add(lbHar);
pnlTuslar.add(tfHar);

lbGoster = new JLabel("Show sinus elements?");
pnlTuslar.add(lbGoster);

cbGoster = new JCheckBox();
cbGoster.setSelected(false);

pnlTuslar.add(cbGoster);

pnlTuslar.add(btnCiz);

lbBilgi=new JLabel("Ramazan Bellek / 2009");
pnlBilgi.add(lbBilgi);

grafik = new Grafik();
grafik.setPreferredSize(new Dimension(800,400));
grafik.setBackground(Color.BLACK);
drawCoordinates();
generateSinus();
this.getContentPane().add(grafik,BorderLayout.CENTER);

}

private void drawCoordinates()
{
for(int i=0; i<800; i++)
{
grafik.noktaCiz(i, 200,Color.BLUE);
if (i%10==0)
{
grafik.noktaCiz(i+50, 50, Color.BLUE);
grafik.noktaCiz(i+50, 100, Color.BLUE);
grafik.noktaCiz(i+50, 150, Color.BLUE);
grafik.noktaCiz(i+50, 200, Color.BLUE);
grafik.noktaCiz(i+50, 250, Color.BLUE);
grafik.noktaCiz(i+50, 300, Color.BLUE);
grafik.noktaCiz(i+50, 350, Color.BLUE);

}
}
for(int i=0; i<400; i++)
grafik.noktaCiz(50, i,Color.RED);
grafik.yaziYaz("+15", 15, 50, Color.RED);
grafik.yaziYaz("+10", 15, 100, Color.RED);
grafik.yaziYaz("+5", 15, 150, Color.RED);
grafik.yaziYaz("0", 15, 200, Color.RED);
grafik.yaziYaz("-5", 15, 250, Color.RED);
grafik.yaziYaz("-10", 15, 300, Color.RED);
grafik.yaziYaz("-15", 15, 350, Color.RED);
grafik.yenile();

}

private void generateSinus()
{
double toplam=0;
double gecici=0;

for(double i=0.1; i<800; i+=1)
{
for(int j=1; j<=Sinyal.har; j+=2)
{

gecici=4*Sinyal.amp/(Sinyal.PI*j)*10*Math.sin(2*Sinyal.PI*Sinyal.freq*j*i/360);
toplam+=gecici;
if (goster)
grafik.noktaCiz((int)(50+i),(int)(200-gecici),Color.CYAN);

}
grafik.noktaCiz((int)(50+i),(int)(200-toplam),Color.MAGENTA);
toplam=0;
}


grafik.yenile();
}

}

2 yorum:

Burs gibi Ek İŞ!!! dedi ki...

Hocam oncelikle kod icin tesekkurler. program calisyor ama cizim yapmiyor.yardim edermisiniz

Ramazan Bellek dedi ki...

Eğer Windows üzerinde çalışıyorsanız, Grafik.java (yukarıda verdiğim kodların ilki) dosyasındaki 68. satıra dikkat etmenizi rica ediyorum.

g.fillOval(k.x, k.y, 1, 1); // Windows için g.fillOval(k.x, k.y, 2, 2);
// Mac OSX (Unix) için g.fillOval(k.x, k.y, 1, 1);


Windows sistemleri için g.fillOval(k.x, k.y, 2, 2); yapmanız gerekiyor aksi takdirde maalesef ekranda çizgileri göremiyoruz. Ben bu kodu Mac OS X üzerinde yazdığım için bu şekilde kalmış.

Böyle yaptığınız halde görüntü alamıyorsanız, sisteminize mahsus başka bir problem olabilir.