el3110_02_13213107
DESCRIPTION
llalalTRANSCRIPT
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 1
MODUL II SIMULASI FILTER FIR REALTIME
Yunita Deasy Simatupang Asisten: Rizky Indra Syafrian/13212049
Tanggal Percobaan: 22/09/2015 EL3110-Praktikum Pengolahan Sinyal Digital
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Percobaan modul ini, praktikan diperkenalkan filter FIR realtime. Pada percobaan modul ini, praktikan menggunakan bahasa C++ yang dicompile di Dev C++ dan akan menggunakan Microsoft excel untuk menghasilkan gambar plot filternya. Praktikan diharuskan untuk membuat kode yang source codenya ada di modul, sedangkan untuk buffer circuar dan fraktional circular, praktikan diminta untuk mengedit sebahagian kode program.
Kata kunci: FIR Real-time, Fraksional, Filter .
1. PENDAHULUAN
Percobaan yang dilakukan pada modul dua ini, memberikan tinjauan mengenai filter FIR realtime dapat diimplementasikan. Pada modul ini, praktikan akan membuat dan melakukan simulasi untuk implementasi filter realtime dengan menggunakan Dev-C++. Pada modul ini juga dikenalkan isu numeric yang dihadapi ketika menggunakan prosesor DSP fixed point.
Adapun tujuan dari percobaan modul 2 ini adalah :
1. Mempelajari bagaimana mengimplementasikan dan melakukan simulasi filter FIR realtime menggunakan Dev-C++
2. Mengenal model bilangan fraksional untuk prosesor DSP fixed point.
3. Mengimplementasikan dan melakukan simulasi filter FIR realtime dengan bilangan fraksional menggunakan Dev-C++
2. STUDI PUSTAKA
2.1 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 tugas spesifik dapat dikerjakan pada waktu spesifik dengan sistem clock sistem.
Ide dasar dari algoritma realtime adalah hanya input saat ini dan yang tealh lewat yang tersedia.
Kita tidak memeiliki akses kepada input yang akan datang berikutnya.
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
2.2 ISU NUMERIK
Kebanyakan prosesor DSP merupakan prosesor fixed point. Prosesor fixed point secara natural set intruksi dasar matematikanya hanya mendukung operasi bilangan bulat (integer). Namun permasalahannya adalah kebanyakan sinyal dan koefisiennya bernilai bilangan real. Sehingga operasi yang dilakukan terhadap sinyal melibatkan bilangan real.
Konversi bilangan real ke bilangan fraksional dilakukan dengan persamaan:
Konversi bilangan fraksional ke bilangan real dilakukan dengan persamaan:
3. METODOLOGI
Peralatan yang digunakan:
1 unit computer dengan software Dev-C++ terinstall
Langkah – langkah percobaan:
3.1 Percobaan membuat m-file untuk simulasi pem-filter-an realtime FIR
Simpan hasilnya pada microsoft excel lalu analisis
Ketik source code sesuai dengan yang terdapat pada modul dimana bufferlength dan koef. filter diganti sesuai yang diminta
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2
3.2 Percobaan membuat m-file untuk simlasi pem-filter-an realtime FIR dengan buffer silkular
3.3 Percobaan membuat m-file untuk simulasi pem-filter-an realtime FIR dengan bilangan fraksional
4. HASIL DAN ANALISIS
4.1 MEMBUAT M-FILE UNTUK SIMULASI PEM-FILTER-AN REALTIME FIR
1. Low Pass
Gambar 1. Filter realtime dari fungsi low pass filter (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
Analisis :
Gambar di atas merupakan hasil konvolusi dari kedua gambar dibawah
(gambar superposisi dari ketiga gelobang sinus yang berbeda frekuensi dalam domain waktu)
(gambar plot filter lowpass yang terdapat di modul satu dan gambar tersebut dalam domain waktu)
2. High Pass
Gambar 2. Filter realtime dari fungsi high pass filter (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
Analisis :
Bandingkan hasil yang didapat dengan hasil sebelumnya
Gunakan referensi file dari source code sebelumnya
Buat kode untuk simulasi pem-filter-an realtime FIR dengan buffer sirkular
Bandingkan hasil yang didapat dengan hasil sebelumnya
Gunakan referensi file dari source code sebelumnya
Buat kode untuk simulasi pem-filter-an realtime FIR dengan bilangan fraksional
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0 50 100 150
Series1-0,1
-0,05
0
0,05
0,1
0 50 100 150
Series1
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 3
Gambar di atas merupakan hasil konvolusi dari kedua gambar dibawah
(gambar superposisi dari ketiga gelobang sinus yang berbeda frekuensi dalam domain waktu)
(gambar plot filter highpass yang terdapat di modul satu dan gambar tersebut dalam domain waktu)
3.Bandpass
Gambar 3. Filter realtime dari fungsi Band Pass filter (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
Analisis :
Gambar di atas merupakan hasil konvolusi dari kedua gambar dibawah
(gambar superposisi dari ketiga gelobang sinus yang berbeda frekuensi dalam domain waktu)
(gambar plot filter bandpass yang terdapat di modul satu dan gambar tersebut dalam domain waktu)
Analisis:
Dari algoritma pada bagian filternya dapat kita lihat bahwa konvolusi dilakukan antara masukan filter (yaitu lowpass, highpass dan bandpass) dengan perjumlahan gelombang sin seperti modul 1 sebelumnya dimana frekuensi yang digunakan di syntax belum dinormalisasi atau memakai f1/fs dst, kita dapat melihatnya pada kode yang terdapat di modul ini (dapat kita lihat dari kodenya). Konvolusi dilakukan dengan mengalikan impuls respon terhadap input yang digeser (time shifting) . Time shifting dilakukan pada bagian buffering di blok program prosedur filter, yaitu menggeser nilai-nilai yang ada pada array satu kotak ke kanan. Namun terdapat pola yang terlihat jelas dimana filter tersebut bekerja sesuai dengan jenis filternya.
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0 50 100 150
Series1
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 4
4.2 MEMBUAT M-FILE UNTUK SIMULASI
PEM-FILTER-AN REALTIME FIR
DENGAN BUFFER SIRKULAR
1. Low Pass
Gambar 4. Filter realtime dari fungsi low pass filter yang didapat dari simulasi dengan buffer sirkular (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
2. High Pass
Gambar 5. Filter realtime dari fungsi high pass filter yang didapat dari simulasi dengan buffer sirkular (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
3. BandPass
Gambar 6. Filter realtime dari fungsi Band Pass filter yang didapat dari simulasi dengan buffer sirkular (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
4. Perubahan pada bagian algoritma filter untuk simulasi dengan buffer sirkular
float filter(float input) {
float hasil;
//buffering
//for(k = BUFFERLENGTH - 1; k > 0; k--) {
//buffer[j] = buffer[j-1];
//}
//input disimpan di buffer 0
buffer[k] = input;
// perhitungan filter
hasil = 0;
for(j = 0; j < BUFFERLENGTH; j++) {
hasil = hasil + buffer[(j+k)%BUFFERLENGTH] * koef_filter[j];
}
Gambar 5. Perubahan pada fungsi filter
Analisis:
Dalam code yang terdapat di atas, terlihat bahwa code mengadopsi direct form dari FIR. Disini kita menggunakan array sebagai alat untuk menyimpan input (memori). Kemudian dengan fungsi mod, kita akan membuat input akan masuk ke array selanjutnya seiring clock namun perkaliannya dengan koefisien filternya yang diubah urutannya. Jika fungsi pada percobaan sebelumnya memindahkan input, yang dilakukan pada fungsi ini adalah memindahkan koefisien filternya. Hal tersebut mengacu kepada teori konvolusi dimana a*b = b*a.
4.3 PERCOBAAN MEMBUAT M-FILE
UNTUK SIMULASI PEM-FILTER-AN
REALTIME FIR DENGAN BILANGAN
FRAKSIONAL
1. Low Pass
Gambar 7. Filter realtime dari fungsi low pass filter yang didapat dari simulasi dengan bilangan fraksional (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
-10000000000000,0
-5000000000000,0
0,0
5000000000000,0
10000000000000,0
0 100
Series1
-3000000000000,0000
-2000000000000,0000
-1000000000000,0000
0,0000
1000000000000,0000
2000000000000,0000
0 100 Series1
-15000000000000,0000
-10000000000000,0000
-5000000000000,0000
0,0000
5000000000000,0000
10000000000000,0000
15000000000000,0000
0 100
Series1
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0 50 100 150
Series1
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 5
2. High Pass
Gambar 8. Filter realtime dari fungsi high pass filter yang didapat dari simulasi dengan bilangan fraksional (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
3. Band Pass
Gambar 9. Filter realtime dari fungsi high pass filter yang didapat dari simulasi dengan bilangan fraksional (koefisien di ambil pada hasil di percobaan FIR1 pada modul 1)
4. Perubahan pada bagian algoritma filter untuk simulasi dengan bilangan fraksional
float filter (float input)
{
float hasil;
// meletakkan input pada buffer
buffer[k]=input*32767;
hasil=0;
// perhitungan filter
for(j=0;j<BUFFERLENGTH; j++)
{ hasil=hasil+koef_filter[j]*
buffer[(j+k)%BUFFERLENGTH];
}
k=(k+BUFFERLENGTH-1)%BUFFERLENGTH;
hasil=hasil/32767;
return hasil;
}
Analisis:
Dari kode di atas kita tahu bahwa Input yang awalanya berupa bilangan fraksional atau bilangan float diubah menjadi bilangan integer dengan melakukan perkalian dengan 32767. Dengan melakukan perkalian tersebut perhitungan filter akan memproses serangkaian bilangan integer (bukan bilangan floating point). Sehingga akan terdapat beberapa daerah dimana hasil filternya akan datar / sejajar dengan sumbu x. Sehingga terlihat bahwa cara menggunakan bilangan fraksional memang akan mengurangi memori yang digunakan namun akan berimbas besar pada hasil filter terutama jika hasilnya akan inputnya bilangan negative dan outputnya tidak presisi (menggunakan metode rounding).
Analisis Tambahan :
Circular buffer dipakai karena Time shifting yang ada pada konvolusi linear membuat program kompleksitas program menjadi besar. Untuk itu, dengan metoda cicrular buffer maka memungkinkan melakukan konvolusi tanpa melakukan time shifting, melainkan hanya mengatur indeks/kursor array yang digunakan sehingga lebih cepat dalam memprosesnya.
Metode dengan bilangan fraksional digunakan karena lebih cepat dibandingkan dua metode lainnya dimana input yang awalnya berupa bilangan fraksional atau bilangan float diubah menjadi bilangan integer dengan melakukan perkalian dengan 32767. Dengan melakukan perkalian tersebut perhitungan filter akan memproses serangkaian bilangan integer (bukan bilangan floating point). Tentu nantinya prosesor akan lebih cepat memproses filter ini.
Ketiga metode diatas menghasilkan gambar plot sama persis dikarenakan sama-sama memproses hal yang sama walaupun dengan cara proses yang berbeda.
5. KESIMPULAN
1. Pada filter realtime, akan terlihat bahwa pem-filter-an terdapat time shifting.
-0,1
-0,05
0
0,05
0,1
0 50 100 150
Series1
-0,6
-0,4
-0,2
0
0,2
0,4
0,6
0 50 100 150
Series1
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 6
2. Buffer sirkular merupakan salah satu metode untuk menciptakan FIR Realtime dengan kelebihan kecepatan dari kerja fungsinya.
3. Penggunaaan metode bilangan fraksional lebih cepat dari dua metode lainnya tetapi metode ini memiliki kelemahan dalam hal konversinya. Apabila input negative akan dikonversi ke nol sedangkan untuk output menjadi tidak presisi karena di rounding.
DAFTAR PUSTAKA
[1] Mervin T. Hutabarat dan tim, Petunjuk Praktikum Pengolahan Sinyal Digital, Sekolah Teknik Elektro dan Informatika, Bandung, 2013.
[2] Proakis G. John dan Monolakis G. Dimitris, Digital Signal Processing Principles, Algorithms, and Applications Fourth Edition, Pearson Prentice Hall, New Jersey, 2007.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 7
Lampiran Kode :
1. Sesuai dengan modul dimana
Bufferlength diganti sesuai koefisien
filter
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define BUFFERLENGTH 33
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] =
{Koefisien filter pada yang didapat modul 1};
float buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j;
float filter(float input)
{
float hasil;
for (j=BUFFERLENGTH - 1; j>0; j--)
{
buffer[j] = buffer[j-1];
}
buffer[0] = input;
hasil = 0;
for (j=0; j<BUFFERLENGTH; j++)
{
hasil = hasil +
buffer[j]*koef_filter[j];
}
return hasil;
}
int main(int argc, char *argv[])
{
FILE *pFile;
for (i=0; i<LENGTH; i++)
{
x[i] =
(sin(2*PI*200/16000*i)+sin(2*PI*1000/1600
0*i)+sin(2*PI*5000/16000*i))/3;
}
for (i=0; i<BUFFERLENGTH; i++)
{
buffer[i] = 0;
}
for (i=0; i< LENGTH; i++)
{
y[i] = filter(x[i]);
}
pFile = fopen("output.txt", "w");
for (i=0; i<LENGTH; i++)
{
fprintf(pFile,"%4.4f\n", y[i]);
}
fclose(pFile);
system("PAUSE");
return EXIT_SUCCESS;
}
2. Buffer Circular
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
// panjang tap filter
#define BUFFERLENGTH 33
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] =
{Koefisien filter pada yang didapat
modul 1};
float buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j, k;
float filter(float input) {
float hasil;
//buffering
//for(k = BUFFERLENGTH - 1; k > 0;
k--) {
//buffer[j] = buffer[j-1];
//}
//input disimpan di buffer 0
buffer[k] = input;
// perhitungan filter
hasil = 0;
for(j = 0; j < BUFFERLENGTH; j++)
{
hasil = hasil +
buffer[(j+k)%BUFFERLENGTH] *
koef_filter[j];
}
// kembalikan hasil pemfilteran
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 8
k=(k+BUFFERLENGTH-
1)%BUFFERLENGTH;
return hasil;
}
int main(int argc, char *argv[])
{
FILE *pFile;
//siapkan input
for(i=0; i < BUFFERLENGTH; i++){
koef_filter[i]=round(koef_filter[i]*po
w(2,31));
}
for(i=0; i < LENGTH; i++) {
x[i] =
(sin(2*PI*200/16000*i)+sin(2*PI*100
0/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);
system("PAUSE");
return EXIT_SUCCESS;
}
3. Circular Fraksional
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
// panjang tap filter
#define BUFFERLENGTH 33
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] =
{Koefisien filter pada yang didapat
modul 1};
float buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j, k;
float filter (float input)
{
float hasil;
// meletakkan input pada buffer
buffer[k]=input*32767;
hasil=0;
// perhitungan filter
for(j=0;j<BUFFERLENGTH;
j++)
{
hasil=hasil+koef_filter[j]*
buffer[(j+k)%BUFFERLENGT
H];
}
k=(k+BUFFERLENGTH-
1)%BUFFERLENGTH;
hasil=hasil/32767;
return hasil;
}
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*100
0/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("output2.txt", "w");
for(i=0; i < LENGTH; i++) {
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 9
fprintf(pFile,"%4.4f\n", y[i]);
}
fclose(pFile);
system("PAUSE");
return EXIT_SUCCESS;
}