Anda di halaman 1dari 18

LAPORAN TUGAS DASAR PENGOLAHAN SINYAL

DIGITAL
ANALIS DOMAIN FREKUENSI

OLEH :

MA’ISYATUL IHSANIYAH

2615100017

TEKNIK BIOMEDIK
FAKULTAS TEKNOLOGI INDUSTRI
INSTITUT TEKNOLOGI SEPULUH NOPEMBER
DASAR TEORI
Untuk melakukan analisis frekuensi dari sinyal waktu diskrit x(n) maka perlu
mendapatkan representasi domain frekuensi dari sinyal yang biasanya dinyatakan dalam
domain waktu. DFT digunakan untuk melakukan analisa frekuensi dari sinyal waktu diskrit.

DFT dihitung dengan menggunakan persamaan :


𝑁−1 2πnk
𝑋(𝑥) = ∑ (x(n). e−j N ) (k 0,1,...,N-1)
𝑛=0


Sedangkan e−j N juga bisa disebut dengan W. Atau apabila diubah kedalam bentuk
trigonometri maka akan dijabarkan seperti dibawah ini:

𝜋 𝜋
e−j N = 𝑐𝑜𝑠2 𝑁 − 𝑗𝑠𝑖𝑛2 𝑁

Dimana dapat dipisahkan apabila suatu bialangan yang tidak mengandung “j” maka
tergolong bilangan real, dan apabila disuatu bilangan tersebut terdapat “j” maka termasuk
imajiner.

Apabila dijabarkan kedalam rumus DFT maka :


𝑁−1
𝜋𝑘𝑛 𝜋𝑘𝑛
𝑋(𝑥) = ∑ (x(n). (𝑐𝑜𝑠2 − 𝑗𝑠𝑖𝑛2 ))
𝑁 𝑁
𝑛=0

𝑁−1 𝑁−1
𝜋𝑘𝑛 𝜋𝑘𝑛
𝑋(𝑥) = ∑ (x(n). 𝑐𝑜𝑠2 ) − ∑ (x(n). 𝑗𝑠𝑖𝑛2 )
𝑁 𝑁
𝑛=0 𝑛=0

Seperti yang sudah dijelaskan bahwasannya yang dalam persamaan tersebut dapat
dipisahkan real dan imajiner. Sehingga dengan memisahkannya maka akan mudah dalam
menentukan nilai magnitude nya. Untuk mencari nilai magnitude yaitu :

Magnitude = √𝑟𝑒𝑎𝑙2 + 𝑖𝑚𝑎𝑗𝑖𝑛𝑒𝑟 2

Dengan diketauhinya magnitude maka akan didapatkan pula nilai amplitudo


spektrumnya yaitu :
1 1
Amplitudo spektrum = 𝑁
√𝑟𝑒𝑎𝑙 2 + 𝑖𝑚𝑎𝑗𝑖𝑛𝑒𝑟 2 , atau amplitudo spektrum = 𝑁
×
𝑚𝑎𝑔𝑛𝑖𝑡𝑢𝑑𝑒.

Setelah diketahui semuanya maka kita dapat membuat grafik DFT yang dimanna
sumbu(x) merupakan frekuensi sample/2 atau N-1, sedangkan sumbu (x) merupakan
amplitudo spektrum. Sehingga sinyal yang merupakan domain waktu akan diubah menjadi
sebuah sinyal domain frekuensi.
Transformasi Fourier cepat (Bahasa Inggris: Fast Fourier Transform, biasa disingkat FFT)
adalah suatu algoritma untuk menghitung transformasi Fourier diskrit (Bahasa Inggris:
Discrete Fourier Transform, DFT) dengan cepat dan efisien. Transformasi Fourier Cepat
diterapkan dalam beragam bidang, mulai dari pengolahan sinyal digital,
memecahkan persamaan diferensial parsial, dan untuk algoritma untuk mengalikan bilangan
bulat besar.
Misalkan ''x0, ...., xN-1 merupakan bilangan kompleks. Transformasi Fourier Diskret
didefinisikan oleh rumus:
𝑁−1 −2πi
nk
𝑋𝑘 = ∑ (𝑥𝑛 e N ) k = 0,...,N-1
𝑛=0
Menghitung deret ini secara langsung memerlukan operasi aritmetika sebanyak
O(N2). Sebuah algoritma FFT hanya memerlukan operasi sebanyak O(N log N) untuk
menghitung deret yang sama. Secara umum algoritma tersebut tergantung
pada pemfaktoran N.
Setiap algoritma FFT, dengan penyesuaian, dapat diterapkan pula untuk menghitung
DFT invers. Ini karena DFT invers adalah sama dengan DFT, namun dengan tanda eksponen
berlawanan dan dikalikan dengan faktor 1/N.
Sedangkan untuk rumus genap FFT yaitu :
𝑁
𝑋(2𝑚) = 𝐷𝐹𝑇 {𝑎(𝑛)} ≫ 𝑎(𝑛) = 𝑥(𝑛) + 𝑥(𝑛 + )
2
Untuk rumus ganjil yaitu :
𝑁
𝑋(2𝑚 + 1) = 𝐷𝐹𝑇 {𝑏(𝑛)𝑊𝑁 𝑘 } ≫ 𝑏(𝑛) = 𝑥(𝑛) − 𝑥(𝑛 − )
2
PERMASALAHAN
Mencari DFT dari persamaan suatu sinyal dengan menggunakan suatu aplikasi (lazarus,
delphi) yaitu dengan menggunakan bahasa pemrograman sehingga dapat menentukan
amplitudo spektrum, magnitudo dengan mudah dan diperoleh sinyal DFT yang akurat.

Setelah menemukan dft, dari dft tersebut kami invers kan sehingga menemukan idft nya.

Untuk soal yang ketiga yaitu mencari fast fourier transform dari sebuah data yang telah
diambil.
HASIL DAN ANALISA
1. Cara menampilkan sinyal dari suatu fungsi

procedure TForm1.sinyal;
begin
f1:=strtoint(Edit1.Text);
f2:=strtoint(Edit3.Text);
a1:=strtoint(Edit2.Text);
a2:=strtoint(Edit4.Text);
Chart1LineSeries1.clear;
Chart1LineSeries2.clear;
Chart1LineSeries3.clear;
for n:=0 to m-1
do
begin
Chart1LineSeries1.AddXY(N,a1*sin(2*pi*f1*n/m));
Chart1LineSeries2.AddXY(N,a2*cos(2*pi*f2*n/m));
Chart1LineSeries3.AddXY(N,randg(0,0.5));
end;
end;

Dalam source code tersebut dapat diartikan bahwa saya memiliki 2 fungsi
sinyal yaitu 𝐴𝑠𝑖𝑛2𝜋𝑓0 𝑛/𝑁 dan 𝐴𝑐𝑜𝑠2𝜋𝑓0 𝑛/𝑁, namun disini saya membedakan
amplitudo dan frekuensi dari kedua fungsi tersebut. Dimana pengguna bisa bebas
untuk memasukkan amplitudo maupun frekuensi yang diinginkan. Oleh sebab itu saya
menggunakan Tedit dimana ini berfungsi untuk memasukkan nilai tertentu. Pada
procedure saya menggunakan perintah untuk mengisi Tedit tersebut yaitu strtoint,
dimana awalnya yang muncul yaitu Edit1 namun disini pengguna akan mengubah
dengan memasukkan integer ataupun angka. Dalam program ini saya menggunakan
for karena berfungsi untuk melooping fungsi tersebut hingga sample yang telah
ditentukan. Untuk menampilkan sinyal tersebut dalam chart maka saya menggunakan
perintah chart..lineseries...AddXY(x,y), maksudnya yaitu saya akan menampilkan
sinyal tersebut dalam chart berapa dan line series ke berapa. Sedangkan AddXY disini
maksudnya dia menampilkan sinyal dengan sumbu x dan sumbu y atau 2 dimensi.
Dalam penampilan sinyal ini maka grafik kedua sinyal akan bertumpukan. Namun
disini saya juga menampilkan sinyal selain “sin” dan “cos” yaitu randg dimana randg
ini berhubungan dengan mean dan standard deviasi. Namun,untuk menampilkan
sinyal tersebut ke chart maka saya bisa memanfaatkan buttonclick1, dimana dalam
procedure buttonclick 1 hanya memanggil prosedure sinyal yang telah saya buat
diatas.
procedure TForm1.Button1Click(Sender: TObject);
begin
sinyal;
end;

2. Cara menampilkan penjumlahan sinyal

procedure TForm1.jumlahsinyal;
begin
f1:=strtoint(Edit1.Text);
f2:=strtoint(Edit3.Text);
a1:=strtoint(Edit2.Text);
a2:=strtoint(Edit4.Text);
Chart2LineSeries1.clear;
for n:=0 to m-1
do
begin
b[n] := a1*sin(2*pi*f1*n/m)+a2*cos(2*pi*f2*n/m)+randg(0,0.5);
Chart2LineSeries1.AddXY(N,b[n]);
end;
end;

Pada langkah kedua ini sama halnya dengan langkah pertama tetapi bedanya
penampilan sinyal akhirnya yaitu dengan menjumlahkan sinyal yang pertama, sinyal
yang kedua, dan sinyal ketiga. Sehinggal hansilnya yaitu kombinasi antara sinyal 1,
sinyal 2, dan sinyal 3 yang telah dijumlahkan. Pada procedure ini untuk
menampilkannya yaitu dengan procedure buttonclick2 yang telah memanggil
procedure jumlah sinyal. Dalam setiap procedur saya menggunaka perintah
charlineseries.clear, ini maksudnya agar pada saat pengguna mengganti nilai frekuensi
dan amplitudo yang lain maka hasilnya tidak bertumpukan dengan yang pernah
dijalankan.
procedure TForm1.Button2Click(Sender: TObject);
begin
jumlahsinyal;
end;

3. Cara menampilkan sinyal DFT

procedure TForm1.dft;

var

k : integer;

amp : array [0..m] of double;

begin

f1:=strtoint(Edit1.Text);

f2:=strtoint(Edit3.Text);

a1:=strtoint(Edit2.Text);

a2:=strtoint(Edit4.Text);

Chart3BarSeries1.clear;

for k :=0 to m-1 do

begin

r[k]:=0;

i[k]:=0;
for n:=0 to m-1 do

begin

r[k] := r[k]+ b[n]*cos(2*3.14*k*n/m);

i[k] := i[k]- b[n]*sin(2*3.14*k*n/m);

amp[k] := (sqrt (sqr(r[k]) + sqr (i[k])))/m;

end;

Chart3BarSeries1.AddXY(k,amp[k]);

end;

end;

Seperti yang kita ketahui, source code diatas merupakan program yang dimana
untuk menampilkan DFT dari sinyal-sinyal yang telah diketahui pada awalnya. Di
source code tersebut saya memisahkan antara bilangan integer dan real seperti yang
dijelaskan didalam dasar teori. Setelah itu saya melooping fungsi array tersebut. Pada
awalnya melooping k-nya karena k juga berjalan dari 0 hingga N-1 atau sample-1.
Namun didalam looping ada looping lagi yaitu looping untuk nilai n. Namun sebelum
looping n, disitu saya memberikan declare bahwa real[k] dan imajiner[k] sama dengan
0. Maksudnya nilai awal sebelum looping yaitu 0. Setelah itu, didalam looping n juga
terdapat fungsi array untuk menentukan magnitude dan amplitudo spektrum. Kerena
apabila diletakkan di luar looping n maka error. Disitu sqr merupakan kuadrat dan sqrt
merupakan akar. Untuk menampilkan sinyal DFT tersebut yaitu ada perintah
chart..BarSeries.. dimana sumbu(x) nya yaitu k dan sumbu(y) nya yaitu amplitudo
spektrum. Untuk b[n] merupakan fungsi sinyal awal domain waktu. Sedangkan untuk
menampilkan fungsi dft, saya menggunakan procedure buttonclick3 yang dimana ia
hanya memanggil procedur dft yang telah say buat sebelumnya.

procedure TForm1.Button3Click(Sender: TObject);

begin

dft;

end;
4. Cara menampilkan sinyal invers dari DFT

procedure TForm1.idft;
var
k, n : integer;
rh : array [0..m] of double;
ih : array [0..m] of double;
x : array [0..m] of double;
begin
f1:=strtoint(Edit1.Text);
f2:=strtoint(Edit3.Text);
a1:=strtoint(Edit2.Text);
a2:=strtoint(Edit4.Text);
Chart4LineSeries1.clear;
for n:=0 to m-1 do
begin
rh[n]:=0;
ih[n]:=0;
for k :=0 to m-1 do
begin
rh[n] :=rh[n]+r[k]*cos(2*3.14*k*n/m);
ih[n] :=ih[n]-i[k]*sin(2*3.14*k*n/m);
x[n] := 1/m*(rh[n]+ih[n]);
end;
Chart4LineSeries1.AddXY(n,x[n]);
end;
end;

Pada source code diatas, saya menggunakan seperti halnya rumus DFT, namun
bedanya disini yaitu pada saat imajiner, saya mengubah tanda (-) menjadi (+) seperti
halnya dirumus aslinya. Selain saya mengubah hal tersebut, saya juga mengubah for
nya, dimana untuk for yang awal yang ngelooping untuk nilai n nya dan di dalam for
n ada for lagi yaitu untuk melooping nilai k nya. Namun ketika saya run maka
hasilnya sinyalnya terbalik. Oleh sebab itu tanda yang awalnya saya ganti (+) , saya
ubah lagi menjadi (-). Selain itu, IDFT ini berfungsi untuk mencari x(n) jadi untuk
rumus x(n) sendiri, disini saya memakai rumus 1/sample * (real+imajiner).
Sedangkan untuk menampilkan grafiknya, saya menggunakan procedure buttonclick4
yang dimana didalamnya hanya memanggil procedure idft.

procedure TForm1.Button4Click(Sender: TObject);

begin

idft;

end;

Perlu diketahui bahwa hasil sinyal idft sama dengan sinyal yang telah saya jumlahkan.

5. Cara menampilkan sinyal FFT

Pada program ini, yang pertama saya memerintahkan untuk open data yaitu
dengan menggunakan open dialog. Disini berfungsi untuk menghitung jumlah data
yang ada di dalam data text dan menampilkan yang ada di dalam data text sebagai
bentuk sinyal awal.

procedure TForm1.membacadata;
begin
if OpenDialog1.Execute then
begin
i :=0;
AssignFile(filename, OpenDialog1.FileName);
reset (filename);
while not Eof (filename) do
begin
Readln (filename, i, data[i]);
Chart1LineSeries1.AddXY(i, data[i]);
Inc (i);

end;
CloseFile (filename);
ndat := i;
Edit1.Text := IntToStr(ndat);
end;
end;

Seperti yang sebelumnya, untuk menampilkannya, saya menggunakan


procedure buttonclick1 yaitu memanggil procedure membaca data.

procedure TForm1.Button1Click(Sender: TObject);

begin
membacadata;
end;

Sehingga hasil yang didapatkan apabila dijalankan yaitu untuk kotak Tedit
terisi jumlah data dan untuk chartnya terisi sinyal awal.
LAMPIRAN

Source code dft dan idft

unit dftidft1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,

Dialogs, StdCtrls, math;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Chart1: TChart;

Chart1LineSeries1: TLineSeries;

Chart1LineSeries2: TLineSeries;

Chart1LineSeries3: TLineSeries;

Chart2: TChart;

Chart2LineSeries1: TLineSeries;
Chart3: TChart;

Chart3BarSeries1: TBarSeries;

Chart4: TChart;

Chart4LineSeries1: TLineSeries;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

sinyal2: TLabel;

sinyal1: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

procedure sinyal;

procedure jumlahsinyal;

procedure dft;

procedure idft;

end;

const

pi = 3.14;

m = 600;

fs = m;
var

Form1: TForm1;

f1,f2,a1,a2,n : integer;

b : array [0..m] of double;

r : array [0..m] of double;

i : array [0..m] of double;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.sinyal;

begin

f1:=strtoint(Edit1.Text);

f2:=strtoint(Edit3.Text);

a1:=strtoint(Edit2.Text);

a2:=strtoint(Edit4.Text);

Chart1LineSeries1.clear;

Chart1LineSeries2.clear;

Chart1LineSeries3.clear;

for n:=0 to m-1

do

begin

Chart1LineSeries1.AddXY(N,a1*sin(2*pi*f1*n/m));

Chart1LineSeries2.AddXY(N,a2*cos(2*pi*f2*n/m));
Chart1LineSeries3.AddXY(N,randg(0,0.5));

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

sinyal;

end;

procedure TForm1.jumlahsinyal;

begin

f1:=strtoint(Edit1.Text);

f2:=strtoint(Edit3.Text);

a1:=strtoint(Edit2.Text);

a2:=strtoint(Edit4.Text);

Chart2LineSeries1.clear;

for n:=0 to m-1

do

begin

b[n] := a1*sin(2*pi*f1*n/m)+a2*cos(2*pi*f2*n/m)+randg(0,0.5);

Chart2LineSeries1.AddXY(N,b[n]);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

jumlahsinyal;
end;

procedure TForm1.dft;

var

k : integer;

amp : array [0..m] of double;

begin

f1:=strtoint(Edit1.Text);

f2:=strtoint(Edit3.Text);

a1:=strtoint(Edit2.Text);

a2:=strtoint(Edit4.Text);

Chart3BarSeries1.clear;

for k :=0 to m-1 do

begin

r[k]:=0;

i[k]:=0;

for n:=0 to m-1 do

begin

r[k] := r[k]+ b[n]*cos(2*3.14*k*n/m);

i[k] := i[k]- b[n]*sin(2*3.14*k*n/m);

amp[k] := (sqrt (sqr(r[k]) + sqr (i[k])))/m;

end;

Chart3BarSeries1.AddXY(k,amp[k]);

end;

end;

procedure TForm1.Button3Click(Sender: TObject);


begin

dft;

end;

procedure TForm1.idft;

var

k, n : integer;

rh : array [0..m] of double;

ih : array [0..m] of double;

x : array [0..m] of double;

begin

f1:=strtoint(Edit1.Text);

f2:=strtoint(Edit3.Text);

a1:=strtoint(Edit2.Text);

a2:=strtoint(Edit4.Text);

Chart4LineSeries1.clear;

for n:=0 to m-1 do

begin

rh[n]:=0;

ih[n]:=0;

for k :=0 to m-1 do

begin

rh[n] :=rh[n]+r[k]*cos(2*3.14*k*n/m);

ih[n] :=ih[n]-i[k]*sin(2*3.14*k*n/m);

x[n] := 1/m*(rh[n]+ih[n]);

end;

Chart4LineSeries1.AddXY(n,x[n]);
end;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

idft;

end;

end.

Anda mungkin juga menyukai