Anda di halaman 1dari 9

MODUL 2 SIMULASI FILTER REALTIME

Rafid Muhammad (13218045)


Asisten: Wilfrid Azariah (13217071)
Tanggal Percobaan: 20/11/2020
EL3010-Pengenalan Signal Digital
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

Abstrak Pada modul sebelumnya kita menggunakan filter


FIR offline (non realtime). Terdapat pebedaaan di
Abstrak pada praktikum ini terdapat tiga percobaan yang
antara algoritma sistem realtime dan algoritma
menggunakan bahasa C++ dalam melakukan pemfilteran.
sistem offline. Ide dasar dari algoritma realtime
Pada percobaan pertama diterapkan sistem buffer yang
adalah hanya input saat ini dan yang telah lewat
menggeser semua sinyal masukan. Praktikan diminta untuk
yang tersedia. Kita tidak memiliki akses kepada
mengubah kode tersebut menjadi buffer sirkular dan
input yang akan datang berikutnya. Pada modul
melakukan simulasi realtime dengan bilangan fraksional.
sebelumnya fungsi filter yang digunakan memiliki
Kata kunci: buffer, buffer sirkular, bilangan fraksional akses kepada keseluruhan sampel pada sinyal
input.
1. PENDAHULUAN
Algoritma filter realtime diperlukan untuk
Pada praktikum ini praktikan diharapkan dapat implementasi filter realtime dengan hardware DSP.
mencapai tujuan-tujuan sebagai berikut. Untuk keperluan ini maka diperlukan simulasi
algoritma filter realtime-like dan dibandingkan
• Mempelajari bagaimana
hasilnya dengan algoritma filter offline.
mengimplementasikan dan melakukan
simulasi filter FIR realtime menggunakan Sistem DSP adalah sistem waktu diskrit yang
Dev-C++ mengambil sampel sinyal input dan menghasilkan
sampel sinyal output dengan frekuensi sampling
• Mengenal model bilangan fraksional untuk
tertentu yang konstan. Artinya pada sistem DSP
prosesor DSP fixed point
realtime, pada rentang waktu antar sampling,
• Mengimplementasikan dan melakukan haruslah dapat dilakukan proses perhitungan
simulasi filter FIR realtime dengan sampel output yang merupakan hasil pengolahan
bilangan fraksional menggunakan Dev- sinyal digital (bisa berupa filter). Artinya proses
C++ komputasi pengolahan sinyal digital untuk tiap
sampel haruslah dapat diselesaikan sebelum
Terdapat empat percobaan yang harus dilakukan
sampel berikutnya diambil.
oleh praktikan. Antara lain,
Karakteristik simulasi realtime-like adalah sebagai
• Percobaan membuat m-file untuk simulasi
berikut:
pem-filter-an realtime FIR
1. Loop untuk kesesuaian dengan kelakuan
• Percobaan membuat m-file untuk simulasi
clock
pem-filter-an realtime FIR dengan buffer
sirkular 2. Akses hanya kepada input yang telah ada
pada array input
• Percobaan membuat m-file untuk simulasi
pem-filter-an realtime FIR dengan 3. Update output setiap siklus loop
bilangan fraksional

2. STUDI PUSTAKA 2.2 ISU NUMERIK


2.1 FILTER FIR REALTIME
[1]Sistem realtime disebut juga dengan sistem Kebanyakan prosesor DSP merupakan prosesor
waktu nyata. Sistem realtime harus dapat fixed point. Prosesor floating point jauh lebih rumit
memberikan respon yang tepat dalam batasan dari prosesor fixed point sehingga membutuhkan
waktu yang ditentukan. Realtime adalah metode harga yang lebih mahal. Untuk membuat sistem
realisasi, sehingga setiap tugas spesifik dapat yang cost effective maka prosesor DSP
dikerjakan pada waktu spesifik dengan siklus clock direalisasikan dengan prosesor fixed point.
sistem. Prosesor fixed point secara natural set intruksi

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 1


dasar matematiknya hanya mendukung operasi
bilangan bulat (integer). mengubah
koefisien
Memahami isu numerik adalah sangat penting Menyalin filter
untuk memperoleh performansi terbaik dari kode pada
modul
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 membuat
merupakan prosesor fixed point. grafik
dengan
Dari percobaan sebelumnya Anda telah ms excel
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
Gambar 3-1 Diagram Percobaan 1
bahasa pemograman C ataupun Assembly, jadi kita
dapat menuliskan koefisien tersebut di program
kita, seperti berikut (contoh)
int koef={a1,a2,a3,a4}; Mengubah
kode
Perhatikan bahwa koefisien harus ditulis dalam sebelumnya
format Q32 dan jangan lupa bahwa prosesor yang menjadi buffer
kita gunakan adalah prosesor fixed-point 32 bit circular
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. membuat
Pada BF561 yang merupakan prosesor fixed-point grafik
32 bit, maka untuk N=32, digunakan format Q31. dengan
ms excel
Format Q31 ini merepresentasikan fraksional 31 bit.
Pada format ini, MSB adalah sign bit yang diikuti
oleh suatu titik imajiner, dan kemudian 31 bit atau Gambar 3-2 Diagram Percobaan 2
mantisa yang dinormalisasi ke 1. Bilangan Q31
memiliki kisaran desimal antara –1 sampai 0.9999.
Konversi bilangan real ke bilangan fraksional Mengubah kode
dilakukan dengan sebelumnya
menjadi
koef=round(2^31*koef); bilangan
fraksional 32 bit
Untuk konversi bilangan fraksional ke bilangan
real dilakukan dengan
koef=koef / 2^31;

membuat
3. METODOLOGI grafik
dengan
Alat yang digunakan dalam praktikum ini antara ms excel
lain.
• Codeblocks
Gambar 3-3 Diagram Percobaan 3
• Microsoft Excel
Prosedur yang dilakukan untuk setiap percobaan
pada praktikum ini antara lain.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


4. HASIL DAN ANALISIS
4.2 PERCOBAAN MEMBUAT M-FILE
4.1 PERCOBAAN MEMBUAT M-FILE
UNTUK SIMULASI PEM-FILTER-AN
UNTUK SIMULASI PEM-FILTER-AN
REALTIME FIR DENGAN BUFFER
REALTIME FIR
SIRKULAR

Pada percobaan ini praktikan diminta untuk


Pada percobaan ini praktikan diminta untuk mengubah kode pada percobaan sebelumnya
menyalin kode C++ yang ada pada modul dan dengan metode buffer sirkular. Buffer sirkular
mengubah koefisien filter menjadi koefisien filter akan meng-update memori yang lama dengan data
yang didapat dari praktikum modul satu untuk yang baru masuk. Pada percobaan ini praktikan
low-pass filter. Output dari program berupa angka menggunakan sumber referensi [2]. Dengan
pada file txt. Selanjutnya angka tersebut akan persamaan
dibuat grafik pada ms excel. Proses yang terjadi di
dalam kode tersebut adalah proses konvolusi
dengan buffer yang bergeser setiap waktu. Berikut
adalah hasil program ketika telah dibuat grafik
pada ms excel.
Kode yang diubah adalah

Gambar 4-1 Hasil grafik pada excel untuk perc. 1

Sedangkan hasil plot dari internal filter,

Gambar 4-3 Bagian yang diubah pada kode

Dari hal tersebut, didapat hasil sebagai berikut-


setelah dibuat grafik pada ms excel.

Gambar 4-2 Hasil grafik fungsi internal untuk perc. 1


Gambar 4-3 Hasil grafik pada excel untuk perc. 2
Dari kedua gambar di atas dapat dilihat bahwa
Secara visual hasil dari program memberikan
kode C++ tersebut dapat digunakan sebagai
keluaran yang sama dengan percobaan
implementasi fungsi filter pada matlab.
sebelumnya maupun hasil fungsi internal dari
Octave.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 3


4.3 PERCOBAAN MEMBUAT M-FILE
UNTUK SIMULASI PEM-FILTER-AN
REALTIME FIR DENGAN BILANGAN
FRAKSIONAL
5. KESIMPULAN
Pada percobaan ini praktikan diminta untuk
• Implementasi filter fir menggunakan kode
mengubah kode sebelumnya dengan
C++ dapat dilakukan dengan tiga cara
menggunakan bilangan fraksional. Strategi
yaitu dengan penggeseran buffer biasa,
implementasi adalah mengubah tipe data
metode buffer sirkular dan bilangan
koef_filter dan sinyal input menjadi integer lalu
numerik yang digunakan dengan
dilakukan pemrosesan dengan hasil intege dan
menyesuaikan dengan DSP yang sedang
akan di ubah kembali menjadi float. Hal ini dapat
digunakan misal fixed point
dilihat pada lampiran. Dari kode tersebut dengan
menggunakan pangkat 31 pada konversi • Konversi ke bilangan fraksional dapat
didapatkan hasil sebagai berikut. diguankan untuk melakukan pengolahan
sinyal pada prosesor DSP fixed point.
Karena kebanyakan sinyal bernilai real
0,3
0,2 • Simulasi filter FIR dengan fixed point
dijalankan dengan menggunakan pangkat
0,1
konversi bernilai 30 karena melihat range
0 maksimal dari tipe data.
29
1
8
15
22

36
43
50
57
64
71
78
85
92
99

-0,1
-0,2
-0,3 DAFTAR PUSTAKA
-0,4 [1] T Hutabarat, Mervin, Buku Petunjuk
Praktikum Pengolahan Sistem Digital,
Gambar 4-4 Hasil grafik pada excel untuk perc. 3 dengan
pangkat 31
Laboratorium Dasar Teknik Elektro, 2020
[2] http://users.ece.utexas.edu/~bevans/courses
/realtime/lectures/laboratory/c6748winDSK
Lalu diturunkan pangkat pada konversi menjadi 30 /SLIDES/filters.pdf, diakses pada tanggal 22
didapat hasil sebagai berikut. November 2020, pukul 20.37 WITA.

Gambar 4-5 Hasil grafik pada excel untuk perc. 3 dengan


pangkat 30

Terlihat dengan pangkat 30 hasil yang didapat


akan bersesusaian dengan percobaan-percobaan
sebelumnya dan hasil filter dari fungsi internal
Octave. Perbedaan pada pangkat mempengaruhi
hasil keluaran. Hal ini terjadi karena batas atas dan
batas bawah dari tipe long long int tidak sama
sehingga ketika nilai yang bernilai positf dikalikan
dengan 2^31 dan dilakukan pembulatan tidak akan
akan memberikan hasil yang sama ketika diproses
dan dikonversikan kembalis. Hal ini berbeda
dengan nilai negatif pada hasil

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 4


Lampiran
1. Source code untuk percobaan 1
#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] = {0.0013734, 0.0019180, 0.0030015, 0.0048253,
0.0075451, 0.0112509,0.0159509 ,0.0215637,
0.0279175, 0.0347585, 0.0417667,
0.0485791, 0.0548171, 0.0601162,
0.0641560, 0.0666862, 0.0675478,
0.0666862, 0.0641560, 0.0601162,
0.0548171, 0.0485791, 0.0417667,
0.0347585, 0.0279175, 0.0215637,
0.0159509, 0.0112509, 0.0075451,
0.0048253, 0.0030015, 0.0019180,
0.0013734};
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];
}
//input disimpan di buffer 0
buffer[0] = input;
// perhitungan filter
hasil = 0;
for(j = 0; j < BUFFERLENGTH; j++) {
hasil = hasil + buffer[j] * koef_filter[j];
}
// kembalikan hasil pemfilteran
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*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

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 5


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;
}

2. Source code untuk percobaan 2


#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] = {0.0013734, 0.0019180, 0.0030015, 0.0048253,
0.0075451, 0.0112509,0.0159509 ,0.0215637,
0.0279175, 0.0347585, 0.0417667,
0.0485791, 0.0548171, 0.0601162,
0.0641560, 0.0666862, 0.0675478,
0.0666862, 0.0641560, 0.0601162,
0.0548171, 0.0485791, 0.0417667,
0.0347585, 0.0279175, 0.0215637,
0.0159509, 0.0112509, 0.0075451,
0.0048253, 0.0030015, 0.0019180,
0.0013734};
float buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j;
int index=0;
int newest;

float filter(float input) {


float hasil;
//buffering

//iterasi pointer buffer


++newest;
if (newest == BUFFERLENGTH)
{
newest = 0;
}
buffer[newest] = input;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 6


index = newest;
// perhitungan filter
hasil = 0;
for(j=0;j<BUFFERLENGTH;j++){
hasil = hasil + buffer[index] * koef_filter[j];
--index;
if(index == -1){
index = BUFFERLENGTH -1;
}
}
// kembalikan hasil pemfilteran
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*1000/16000*i)+sin(2*PI*5000/16000*i)) / 3;
}
//inisialisasi buffer dengan nol
for(i=0; i < BUFFERLENGTH; i++) {
buffer[i] = 0;
}
newest = 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. Source code untuk percobaan 3

#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] = {0.0013734, 0.0019180, 0.0030015, 0.0048253,
0.0075451, 0.0112509,0.0159509 ,0.0215637,
0.0279175, 0.0347585, 0.0417667,
0.0485791, 0.0548171, 0.0601162,
0.0641560, 0.0666862, 0.0675478,
0.0666862, 0.0641560, 0.0601162,
0.0548171, 0.0485791, 0.0417667,

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 7


0.0347585, 0.0279175, 0.0215637,
0.0159509, 0.0112509, 0.0075451,
0.0048253, 0.0030015, 0.0019180,
0.0013734};
long long int buffer[BUFFERLENGTH];
long long int koef_filter_temp[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];
int i, j;
int index=0;
int newest;

float filter(int input) {


long long int hasil;
//buffering

//iterasi pointer buffer


++newest;
if (newest == BUFFERLENGTH)
{
newest = 0;
}
buffer[newest] = input;

index = newest;
// perhitungan filter
hasil = 0;
for(j=0;j<BUFFERLENGTH;j++){
hasil = hasil + buffer[index] * koef_filter_temp[j];
--index;
if(index == -1){
index = BUFFERLENGTH -1;
}
}
// kembalikan hasil pemfilteran
return (float) hasil* pow(2,-30) * pow(2,-30);
}

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;
}
newest = 0;

//assignment koef_filter_temp dengan tipe fraksional


for(i = 0; i<BUFFERLENGTH; i++){
koef_filter_temp[i] = llround(pow(2,30) * koef_filter[i]);
}

//loop mengambil input tiap sampel dan menaruhnya pada output

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 8


for(i=0; i < LENGTH; i++) {
y[i] = filter(llround(pow(2,30) * 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;
}

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 9

Anda mungkin juga menyukai