Anda di halaman 1dari 8

MODUL II SIMULASI FILTER FIR REALTIME

Rosana Dewi Amelinda (13213060)


Asisten : Kalam A. L.(13212090)
Tanggal Percobaan: 21/9/2015
EL3110-Praktikum Pengolahan Sinyal Digital

Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Abstrak Pada praktikum Modul II ini dilakukan beberapa
percobaan yaitu melakukan pem-filter-an FIR realtime
dengan 3 buah metode yang berbeda memanfaattkan aplikasi
Dec-C++. Cara pertama yaitu membuat m-file untuk
simulasi filter realtime FIR dengan metoda biasa, kedua yaitu
membuat m-file untuk simulasi filter realtime FIR dengan
buffer sirkular, dan ketiga yaitu membuat m-file untuk
simulasi filter realtime FIR dengan bilangan fraksional.

Tujuan yang ingin dicapai dari percobaan II ini


antara lain :

Kata kunci : Dev-C++, Buffer sirkular, Bilangan


fraksional.
1.

a.

Mempelajari
bagaimana
mengimplementasikan dan melakukan
simulasi filter FIR realtime menggunakan
Dev-C++.

b.

Mengenal model bilangan fraksional


untuk prosesor DSP fixed point.

c.

Mengimplementasikan dan melakukan


simulasi filter FIR realtime dengan
bilangan fraksional menggunakan DevC++.

PENDAHULUAN

Filter FIR adalah salah satu tipe dari filter digital


yang dipakai pada aplikasi Digital Signal
Processing (DSP). FIR kepanjangan dari Finite
Impulse Response. Disebut respons impulsnya
terbatas (finite) karena tidak ada feedback didalam
filter, jika anda memasukkan sebuah impulse
(yaitu sebuah sinyal 1 diikuti dengan banyak
sinyal 0), sinyal nol akan keluar setelah sinyal 1
melewati semua delay line dengan koefisiennya.
Keuntungan filter FIR antara lain adalah stabil dan
memiliki
phasa
yang
linier.
Sedangkan
kerugiannya
adalah
filter
FIR terkadang
membutuhkan lebih banyak memory dan/atau
perhitungan untuk mencapai karakteristik respon
filter yang diberikan. Dan juga, respon tertentu
tidak
mudah
dilaksanakan
untuk
diimplementasikan dengan filter FIR.

2.

STUDI PUSTAKA
a.

FILTER FIR REALTIME

Sistem realtime disebut juga dengan sistem waktu


nyata. Sistem realtime harus dapat memberikan
respon yang tepat dalam batasan waktu yang
ditentukan. Realtime adalah metode realisasi,
sehingga setiap tugas spesifik dapat dikerjakan
pada waktu spesifik dengan siklus clock sistem.
Pada modul sebelumnya kita menggunakan filter
FIR offline (non realtime). Terdapat pebedaaan di
antara algoritma sistem realtime dan algoritma
sistem offline. Ide dasar dari algoritma realtime
adalah hanya input saat ini dan yang telah lewat
yang tersedia. Kita tidak memiliki akses kepada
input yang akan datang berikutnya. Pada modul
sebelumnya fungsi filter yang digunakan memiliki
akses kepada keseluruhan sampel pada sinyal
input.
Algoritma filter realtime diperlukan untuk
implementasi filter realtime dengan hardware
DSP. Untuk keperluan ini maka diperlukan
simulasi algoritma filter realtime-like dan
dibandingkan hasilnya dengan algoritma filter
offline.
Sistem DSP adalah sistem waktu diskrit yang
mengambil sampel sinyal input dan menghasilkan
sampel sinyal output dengan frekuensi sampling
tertentu yang konstan. Artinya pada sistem DSP
realtime, pada rentang waktu antar sampling,
haruslah dapat dilakukan proses perhitungan

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

sampel output yang merupakan hasil pengolahan


sinyal digital (bisa berupa filter). Artinya proses
komputasi pengolahan sinyal digital untuk tiap
sampel haruslah dapat diselesaikan sebelum
sampel berikutnya diambil.
Karakteristik simulasi realtime-like adalah sebagai
berikut:
1. Loop untuk kesesuaian dengan kelakuan clock
2. Akses hanya kepada input yang telah ada pada
array input
3. Update output setiap siklus loop
b.

ISU NUMERIK

Kebanyakan prosesor DSP merupakan prosesor


fixed point. Prosesor floating point jauh lebih
rumit dari prosesor fixed point sehingga
membutuhkan harga yang lebih mahal. Untuk
membuat sistem yang cost effective maka prosesor
DSP direalisasikan dengan prosesor fixed point.
Prosesor fixed point secara natural set intruksi
dasar matematiknya hanya mendukung operasi
bilangan bulat (integer)
Memahami isu numerik adalah sangat penting
untuk memperoleh performansi terbaik dari
sebuah prosesor fixed-point. Masalahnya adalah
kebanyakan sinyal dan juga koefisien bernilai
bilangan real. Sehingga operasi pengolahan sinyal
merupakan operasi perkalian dan penjumlahan
bilangan real. Namun DSP yang kita gunakan
merupakan prosesor fixed point.

Pada format ini, MSB adalah sign bit yang diikuti


oleh suatu titik imajiner, dan kemudian 31 bit atau
mantisa yang dinormalisasi ke 1. Bilangan Q31
memiliki kisaran desimal antara 1 sampai 0.9999
(0x8000h sampai 0x7FFFh). Bilangan fraksional h
dapat direpresentasikan sebagai atau h= -b020+
b12-1 + b22-2 + ... + bN2-N, dimana h adalah
bilangan fraksional dan b adalah biner 1 atau 0.
Konversi bilangan real ke bilangan fraksional
dilakukan dengan
koef=round(2^31*koef);
Untuk konversi bilangan fraksional ke bilangan
real dilakukan dengan
koef=koef / 2^31;
Sub-bab pada percobaan ini, yaitu :

3.

Percobaan membuat m-file untuk


simulasi pem-filter-an realtime FIR.

Percobaan membuat m-file untuk


simulasi pem-filer-an realtime FIR
dengan buffer sirkular.

Percobaan membuat m-file untuk


simulasi pem-filter-an realtime FIR
dengan bilangan fraksional.

METODOLOGI

Pada percobaan 1 ini, alat dan bahan yang


digunakan yaitu :
1.

1 unit computer

2.

Software MATLAB

Memulai percobaan

Dari
percobaan
sebelumnya
Anda
telah
memperoleh koefisien filter untuk melakukan pemfilter-an. Kita akan menggunakannya sebagai
koefisien filter yang akan diterapkan di BF561.
Nantinya kita akan mencoba program filter dalam
bahasa pemograman C ataupun Assembly, jadi
kita dapat menuliskan koefisien tersebut di
program kita, seperti berikut :
int koef={a1,a2,a3,a4};
Perhatikan bahwa koefisien harus ditulis dalam
format Q32 dan jangan lupa bahwa prosesor yang
kita gunakan adalah prosesor fixed-point 32 bit
sehingga setiap bilangan direpresentasikan dalam
32 bit dengan kisaran 2-31 sampai 231-1 atau
2147483648 2147483647 untuk 1 sampai 1.
Q31 adalah salah satu contoh format Q, yaitu
penulisan bilangan untuk bilangan fixed-point.
Pada BF561 yang merupakan prosesor fixed-point
32 bit, maka untuk N=32, digunakan format Q31.
Format Q31 ini merepresentasikan fraksional 31
bit.

Pastikan komputer yang akan


digunakan berfungsi dengan normal
dan tidak ada masalah apapun.

Software Matlab sudah terinstal


dalam komputer.

1.

Percobaan membuat m-file untuk simulasi


pem-filter-an realtime FIR.

Pada bagian ini dibuat m-file untuk melakukan


pemfilteran realtime FIR dengan Dev-C++. Fungsi
internal filter menggunakan metoda non relatime,
karena menghitung sinyall output dengan sinyal input
yang lengkap. Kemudian dibandingkan hasil simuasi
dengan fungsi internal filter

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

2.

Percobaan membuat m-file untuk simulasi


pem-filter-an realtime FIR dengan buffer
sirkular.

selanjutnya dilakukan plot grafik dengan


menggunakan Microsoft Office Excel. Hasilnya
yaitu sebagai berikut :
Gambar 1 Filter FIR realtime

Pada bagian ini dilakukan modfikasi hasil percobaan


sebelumnya menggunakan metode buffering sirkular.
dengan metode ini maka setiap kali didapatkan sampel
input, maka sampel-sampel terdahulu pada buffer
tidak perlu digeser. Setelah diperoleh hasilnya
kemudian dibandingkan hasil simulasi dengan hasil
sebelumnya.
3.

Percobaan membuat m-file untuk simulasi


pem-filter-an
realtime
FIR
dengan
bilangan fraksional.

Pada bagian ini dilakukan modfikasi hasil percobaan


sebelumnya menggunakan bilangan fraksional 32 bit.
Semua koefisien filter direpresentaiskan dengan
bilangan fraksional. Buffer diisi dengan sampel input
yang telah dikonversikan dari bilangan real menjad
bilangan fraksional. Dilakukan modifikasi perkalian
bilangan real menjadi perkalian bilangan fraksional. Lalu
disimpan sampel dinyal output yang dihasilkan dengan
terlebih dahulu mengonversikan bilangan fraksional
menjadi bilanga real. Setelah diperoleh hasilnya
kemudian dibandingkan hasil simulasi dengan hasil
sebelumnya.
Mengakhiri Percobaan
Sebelum keluar dati ruang praktikum, dirapikan meja
praktikum dan dimatikan komuter dati jala-jala listrik.

Gambar 2 Filter FIR realtime dengan MATLAB

Dapat terlihat bahwa hasil sinyal hasil konvolusi


yang diperoleh dari source code (Dev-C++)
dengan hasil konvolusi yang diperoleh dari
MATLAB. Hal ini membuktikan bahwa source
code yang telah dibuat benar.

Dimatikan MCB dimeja praktikum sebelum


meninggalkan ruangan.

Diperiksa lembar penggunaan meja.

Dipastikan asisten telah menandatangani catatan


percobaan kali ini pada Buku Catatan Laboratorium.

4.

HASIL DAN ANALISIS

Percobaan membuat m-file untuk simulasi


pem-filer-an realtime FIR.

Pada percobaan ini dibuat terlebih dahulu m-file


untuk filter FIR realtime dengan mengcopy source
code yang sudah ada pada modul praktikum.
Source kode tersebut berisi fungsi konvolusi dari
sinyal total (modul 1) dengan filter low-pass.
Kemudian dijalankan dengan aplikasi Dev-C++.
Hasilnya yaitu berupa file text yang berisi nilainilai koefisien filter. Dari koefisien filter tersebut

Percobaan membuat m-file untuk simulasi


pem-filer-an realtime FIR dengan buffer
sirkular.

Pada praktikum ini dilakukan modifikasi hasil


percobaan pertama dengan menggunakan metode
buffering sirkular. Dengan metoda ini setiap kali
didapatkan sampel input, maka sampe-sampel
terdahulu pada buffer yang tidak perlu digeser.
Hasil nilai-nilai pada file text dari program
kemudian dibuat kedalam grafik dengan
menggunakan Excel.
Perbedaan source code untuk buffer sirkular
dengan source code sebelumnya yaitu adanya
variable k yang di assign dengan nilai 0 serta
adanya perhitungan filter dengan circular buffer.
Berikut cuplikan source code :
int i,j,k=0;
float filter(float input) {
float hasil;
//buffering
buffer[k] = input;
((perhitungan filter dengan circular
buffer))

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

hasil = 0;
for(j=0; j<BUFFERLENGHT; j++) {
hasil = hasil +
buffer[(j+k)%BUFFERLENGHT] *
koef_filter[j];
}
if (k<=0) {
k=k+BUFFERLENGHT-1;
}
else {
k--;
};

hasil = hasil +
buffer[(j+k)%BUFFERLENGHT] *
round(koef_filter[j]*pow(2,31));
}
if (k<=0) {
k=k+BUFFERLENGHT-1;
}
else {
k--;
};
return hasil;
}

return hasil;
}

Setelah dilakukan penambahan source code diatas,


maka diperoleh plot grafik sebagai berikut :

Setelah
ditambahkan
source
code
menghasilkan plot grafik sebagai berikut :

diatas

Gambar 4 Filter FIR realtime dengan metode bilangan


fraksional

Gambar 3 Filter FIR realtime dengan metoda buffer


sirkular

Terlihat bahwa grafik filter yang dihasilkan


dengan metoda buffer sirkular sama dengan grafik
filter dengan sebelumnya. Hal ini mengindikasikan
bahwa source code yang dibuat telah benar.

Percobaan membuat m-file untuk simulasi


pem-filter-an realtime FIR dengan bilangan
fraksional.

Pada percobaan ketiga ini dilakukan modifikasi


dari source code percobaan sebelumnya dengan
menggunakan bilangan fraksional 32 bit. Semua
koefisien filter direpresentasikan dengan bilangan
fraksional. Dilakukan peng-edit-an source code
pada bagian sebelumnya dengan mengubah isi
fungsi filter, koefisien serta buffer menjadi tipe
integer. Hasil nilai-nilai pada file text dari program
kemudian dibuat kedalam grafik dengan
menggunakan excel. Metode bilangan yang
digunakan pada percobaan ini yaitu dengan
mengedit soutce code yang telah ada. Yaitu
menambahkan perhitungan filter dengan bilangan
fraksional sebagai berikut :
((perhitungan filter dengan bilangan
fraksional))

Terlihat bahwa plot grafik filter yang dihasilkan


dengan metoda bilangan fraksional sama dengan
grafik filter dengan sebelumnya. Hal ini
mengindikasikan bahwa source code yang dibuat
telah benar.

5.

KESIMPULAN

Dari percobaan didapatkan kesimpulan :

Filter FIR realtime dapat disimulasikan


dan dapat diimplementasikan dengan
membuat source code menggunakan DevC++.

Filter FIR realtime yang diperoleh dengan


MATLAB, Dev-C++, metoda buffer
sirkular, dan metode bilangan fraksioal
menampilkan output hasil konvolusi yang
sama.

Kelebihan penggunaan filter dengan


metoda buffer sirkular yaitu dapat
menghemat
memori.
Sedangkan
penggunaan metode bilangan fraksional
digunakan karena adanya isu numeric
pada prosessor fixed point.

hasil = 0;
for(j=0; j<BUFFERLENGHT; j++) {

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

DAFTAR PUSTAKA
[1]. Mervin T Hutabarat, Praktikum Pengolahan Sinyal
Digital Laboratorium Dasar Teknik Elektro
ITB,Bandung, 2015.

[2]. Proakis, Jhon. Manolakis, Dimitris, Digital Signal


Processing, principles, algoritm, and application,
Prentice Hall, 1998

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

LAMPIRAN
Source code

Percobaan 1

//input disimpan di buffer 0


buffer[0] = input;

#include
#include
#include
#include

<cstdlib>
<iostream>
<stdio.h>
<math.h>

// perhitungan filter
hasil = 0;
for(j = 0; j < BUFFERLENGTH;
j++) {

using namespace std;

hasil = hasil + buffer[j]


* koef_filter[j];
}

// panjang tap filter


#define BUFFERLENGTH 33
#define LENGTH 100
#define PI 3.14159265

// kembalikan hasil pemfilteran


return hasil;

//definisi koefisien fllter


float koef_filter[BUFFERLENGTH] = {0.00152884475502033, 0.00190413765156085
, 0.00251201020053917
, 0.00315172285923541
,0.00338157483002662,
0.00256899869677061,
1.43303986898520e-18,
0.00497037076557457
,
0.0127558532986817,
0.0233996310513060
,0.0364901801525690
,0.0511553725692717 ,
0.0661431077396454
,
0.0799794721992498
,0.0911792726013163
,0.0984722196424889
,0.101003617946099
,0.0984722196424889
,0.0911792726013163
,0.0799794721992498
,0.0661431077396454
,0.0511553725692717
,0.0364901801525690
,0.0233996310513060
,0.0127558532986817
,0.00497037076557457
,1.43303986898520e-18
,0.00256899869677061
,0.00338157483002662
,0.00315172285923541
,0.00251201020053917
,0.00190413765156085
,0.00152884475502033};

}
int main(int argc, char *argv[])
{
FILE *pFile;
//siapkan input
for(i=0; i < LENGTH; i++) {
x[i] =
(sin(2*PI*200/16000*i)+sin(2*PI*1000/
16000*i)+sin(2*PI*5000/16000*i)) / 3;
}
//inisialisasi buffer dengan
nol
for(i=0; i < BUFFERLENGTH; i++)
{
buffer[i] = 0;
}
//loop mengambil input tiap
sampel dan menaruhnya pada output
for(i=0; i < LENGTH; i++) {
y[i] = filter(x[i]);
}
//tulis output ke file
pFile = fopen("output.txt",
"w");
for(i=0; i < LENGTH; i++) {
fprintf(pFile,"%4.4f\n",
y[i]);
}
fclose(pFile);
return EXIT_SUCCESS;
}

float buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j;
float filter(float input) {
float hasil;
//buffering
for(j = BUFFERLENGTH - 1; j >
0; j--) {
buffer[j] = buffer[j-1];
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Percobaan 2
#include
#include
#include
#include

//perhitungan filter dengan


circular buffer
hasil = 0;
for(j=0; j<BUFFERLENGHT; j++) {
hasil = hasil +
buffer[(j+k)%BUFFERLENGHT] *
koef_filter[j];
}
if (k<=0) {
k=k+BUFFERLENGHT-1;
}
else {
k--;
};

<cstdlib>
<iostream>
<stdio.h>
<math.h>

using namespace std;


//panjang tap filter
#define BUFFERLENGHT 33
#define LENGHT 100
#define PI 3.14159265
//definisi koefisien filter
float koef_filter [BUFFERLENGHT] = {0.00152884475502033,
0.00190413765156085
, 0.00251201020053917
, 0.00315172285923541
,0.00338157483002662,
0.00256899869677061,
1.43303986898520e-18,
0.00497037076557457
,
0.0127558532986817,
0.0233996310513060
,0.0364901801525690
,0.0511553725692717 ,
0.0661431077396454
,
0.0799794721992498
,0.0911792726013163
,0.0984722196424889
,0.101003617946099
,0.0984722196424889
,0.0911792726013163
,0.0799794721992498
,0.0661431077396454
,0.0511553725692717
,0.0364901801525690
,0.0233996310513060
,0.0127558532986817
,0.00497037076557457
,1.43303986898520e-18
,0.00256899869677061
,0.00338157483002662
,0.00315172285923541
,0.00251201020053917
,0.00190413765156085
,0.00152884475502033};
float
float
float
float

return hasil;
}
int main(int argc, char *argv[]) {
FILE *pFILE;
//siapkan input
for(i=0; i<LENGHT; i++) {
x[i] =
(sin(2*PI*i*200/16000) +
sin(2*PI*i*1000/16000) +
sin(2*PI*i*5000/16000))/3;
}
//inisialisasi buffer dengan nol
for(i=0; i<BUFFERLENGHT; i++) {
buffer[i] = 0;
}
//loop ambil input tial sampel
dan menaruhnya pada output
for(i=0; i<LENGHT; i++) {
y[i] = filter(x[i]);
}
//tulis ouput ke file
pFILE = fopen("output2.txt","w");
for(i = 0; i < LENGHT; i++) {
fprintf(pFILE,"%4.4f\n",y[i]);
}
fclose(pFILE);
return EXIT_SUCCESS;
}

buffer[BUFFERLENGHT];
x[LENGHT];
y[LENGHT];
yr[LENGHT];

int i,j,k=0;
float filter(float input) {
float hasil;
//buffering
buffer[k] = input;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Percobaan 3
#include
#include
#include
#include

//perhitungan filter dengan


bilangan fraksional
hasil = 0;
for(j=0; j<BUFFERLENGHT; j++) {
hasil = hasil +
buffer[(j+k)%BUFFERLENGHT] *
round(koef_filter[j]*pow(2,31));
}
if (k<=0) {
k=k+BUFFERLENGHT-1;
}
else {
k--;
};

<cstdlib>
<iostream>
<stdio.h>
<math.h>

using namespace std;


//panjang tap filter
#define BUFFERLENGHT 33
#define LENGHT 100
#define PI 3.14159265
//definisi koefisien filter
float koef_filter [BUFFERLENGHT] = {0.00152884475502033,
0.00190413765156085
, 0.00251201020053917
, 0.00315172285923541
,0.00338157483002662,
0.00256899869677061,
1.43303986898520e-18,
0.00497037076557457
,
0.0127558532986817,
0.0233996310513060
,0.0364901801525690
,0.0511553725692717 ,
0.0661431077396454
,
0.0799794721992498
,0.0911792726013163
,0.0984722196424889
,0.101003617946099
,0.0984722196424889
,0.0911792726013163
,0.0799794721992498
,0.0661431077396454
,0.0511553725692717
,0.0364901801525690
,0.0233996310513060
,0.0127558532986817
,0.00497037076557457
,1.43303986898520e-18
,0.00256899869677061
,0.00338157483002662
,0.00315172285923541
,0.00251201020053917
,0.00190413765156085
,0.00152884475502033};
float
float
float
float

buffer[BUFFERLENGHT];
x[LENGHT];
y[LENGHT];
yr[LENGHT];

return hasil;
}
int main(int argc, char *argv[]) {
FILE *pFILE;
//siapkan input
for(i=0; i<LENGHT; i++) {
x[i] =
(sin(2*PI*i*200/16000) +
sin(2*PI*i*1000/16000) +
sin(2*PI*i*5000/16000))/3;
}
//inisialisasi buffer dengan nol
for(i=0; i<BUFFERLENGHT; i++) {
buffer[i] = 0;
}
//loop ambil input tial sampel
dan menaruhnya pada output
for(i=0; i<LENGHT; i++) {
y[i] = filter(x[i]);
}
//konversi output menjadi float
for(i=0; i<LENGHT; i++) {
yr[i] = y[i];
yr[i] = yr[i]/pow(2,31);
}
//tulis ouput ke file
pFILE = fopen("output3.txt","w");
for(i = 0; i < LENGHT; i++) {
fprintf(pFILE,"%4.4f\n",yr[i]);
}
fclose(pFILE);
return EXIT_SUCCESS;
}

int i,j,k=0;
float filter(float input) {
float hasil;
//buffering
buffer[k] = input;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB