Anda di halaman 1dari 13

Percobaan II

Simulasi Filter FIR Realtime


Rifki Yafi (13117049)
Asisten : Hilmi Aziz (13116150)
Tanggal Percobaan : 24/09/2019
EL3104-Praktikum Pengolahan Sinyal Digital
Laboratorium Teknik Elektro
Institut Teknologi Sumatera

Abstrak—Pada praktikum kali ini akan dilakukan Dan juga, respon tertentu tidak mudah dilaksanakan
beberapa percobaan yaitu pertama membuat m-file untuk untuk diimplementasikan dengan filter FIR.
simulasi pem-filteran realtime FIR, percobaan kedua yaitu
dengan membuat m-file untuk simulasi pem-filteran
realtime FIR dengan buffer sirkular, percobaan ketiga
yaitu membuat m-file untuk simulasi pem-filteran realtime
FIR dengan bilangan fraksional. Ketiga percobaan tersebut
akan memanfaatkan aplikasi yang bernama Dev C++.

Kata kunci- FIR, Buffer Sirkular, Bilangan Fraksional, Dev


C++.

I. PENDAHULUAN
Gambar 1: Flow Graph Filter FIR orde 3
Pada praktikum percobaan kali ini akan diperkenalkan
sebuah aplikasi yang bernama Dev C++. Dev C++ 
adalah gabungan sebuah IDE (Integrated Development
Environment) C/C++ yang sudah dilengkapi dengan
y(n)  
m
h[m]x[n  m]
TDM-GCC Complier (bagian dari GNU Compiler
Collection/GCC). Dev C++ merupakan IDE gratis dan
full featur yang didistribusikan dibawah lisensi GNU
x[n]  h[n]  y[n]
(General Public License) untuk pemrograman C dan
C++. IDE sendiri adalah suatu lembar kerja terpadu
h[n]  {b0 , b1 ,..., bq }
untuk pengembangan program.

Sistem Dev C++ terdiri atas lima fungsi utama :
n0
1. Menulis Program/Source Code
Diperoleh :
2. Mengkompilasi Program (Compile)

3.
4.
Melakukan Pengujian Program (Debugging)
Mengaitkan Object dan Library ke Program
y[n]  
 bm x[n  m]
m
(Linking)
5. Menjalankan Progeam (Running)
Adapun tujuan dari modul ini, sebagai berikut:
Filter FIR adalah salah salah satu tipe dari filter digital 1. Mempelajari bagaimana mengimplementasikan
yang dipakai pada aplikasi Digital Singal Processing dan melakukan simulasi filter FIR realtime
(DSP). FIR kepanjangan dari Finite Impulse Response. menggunakan Dev C++.
Disebut respons impulsnya terbatas (finite) karena tidak
ada feedback didalam filter, jika anda memasukkan 2. Mengenal model bilangan fraksional untuk
sebuah impulse yaitu sebuah sinyal “1” diikuti dengan prosesor DSP fixed point.
banyak sinyal “0”, sinyal nol akan keluar setelah sinyal 3. Mengimplementasikan dan melakukan simulasi
ke-satu melewati semua delay line dengan koefisiennya. filter FIR realtime dengan bilangan fraksional
menggunakan Dev C++.
Keuntungan filter FIR antara lain adalah salah satu tipe
filter digital yang stabil dan memiliki phasa yang linier.
Sedangkan kerugiannya adalah filter FIR terkadang
membutuhkan lebih banyak sekali memory dan
perhitungan untuk mencapai karakteristik respon filter
yang diberikan.
II. LANDASAN TEORITIS 2.2 ISI NUMERIK

Dev C++ adalah gabungan sebuah IDE (Integrated Kebanyakan prosesor DSP merupakan prosesor fixed
Development Environment) C/C++ yang sudah point. Prosesor floating point jauh lebih rumit dari
dilengkapi dengan TDM-GCC Complier (bagian dari prosesor fixed point sehingga membutuhkan harga yang
GNU Compiler Collection/GCC). Dev C++ merupakan lebih mahal. Untuk membuat sistem yang cost effective
IDE gratis dan full featur yang didistribusikan dibawah maka prosesor DSP direalisasikan dengan prosesor fixed
lisensi GNU (General Public License) untuk point. Prosesor fixed point secara natural set intruksi
pemrograman C dan C++. IDE sendiri adalah suatu dasar matematiknya hanya mendukung operasi bilangan
lembar kerja terpadu untuk pengembangan program. bulat (integer).

Sistem Dev C++ terdiri atas lima fungsi utama : Memahami isu numerik adalah sangat penting untuk
memperoleh performansi terbaik dari sebuah prosesor
1. Menulis Program/Source Code fixed-point. Masalahnya adalah kebanyakan sinyal dan
juga koefisien bernilai bilangan real. Sehingga operasi
2. Mengkompilasi Program (Compile) pengolahan sinyal merupakan operasi perkalian dan
3. Melakukan Pengujian Program (Debugging) penjumlahan bilangan real. Namun DSP yang kita
gunakan merupakan prosesor fixed point.
4. Mengaitkan Object dan Library ke Program
(Linking) Dari percobaan sebelumnya Anda telah memperoleh
koefisien filter untuk melakukan pem- filter-an. Kita
5. Menjalankan Progeam (Running) akan menggunakannya sebagai koefisien filter yang akan
diterapkan di BF561. Nantinya kita akan mencoba
2.1 FILTER FIR REALTIME program filter dalam bahasa pemograman C ataupun
Assembly, jadi kita dapat menuliskan koefisien tersebut
Sistem realtime disebut juga dengan sistem waktu nyata. di program kita, seperti berikut :
Sistem realtime harus dapat memberikan respon yang
tepat dalam batasan waktu yang ditentukan. Realtime
adalah metode realisasi, sehingga setiap tugas spesifik
int koef={a1,a2,a3,a4};
dapat dikerjakan pada waktu spesifik dengan siklus clock
sistem. Perhatikan bahwa koefisien harus ditulis dalam format
Q32 dan jangan lupa bahwa prosesor yang kita gunakan
Pada modul sebelumnya kita menggunakan filter FIR adalah prosesor fixed-point 32 bit sehingga setiap
offline (non realtime). Terdapat pebedaaan di antara bilangan direpresentasikan dalam 32 bit dengan kisaran –
algoritma sistem realtime dan algoritma sistem offline. 2-31 sampai 231-1 atau –2147483648 – 2147483647
Ide dasar dari algoritma realtime adalah hanya input saat untuk –1 sampai 1. Q31 adalah salah satu contoh format
ini dan yang telah lewat yang tersedia. Kita tidak Q, yaitu penulisan bilangan untuk bilangan fixed-point.
memiliki akses kepada input yang akan datang Pada BF561 yang merupakan prosesor fixed-point 32
berikutnya. Pada modul sebelumnya fungsi filter yang bit, maka untuk N=32, digunakan format Q31. Format
digunakan memiliki akses kepada keseluruhan sampel Q31 ini merepresentasikan fraksional 31 bit.
pada sinyal input.
Algoritma filter realtime diperlukan untuk implementasi Pada format ini, MSB adalah sign bit yang diikuti oleh
filter realtime dengan hardware DSP. Untuk keperluan suatu titik imajiner, dan kemudian 31 bit atau mantisa
ini maka diperlukan simulasi algoritma filter realtime- yang dinormalisasi ke 1. Bilangan Q31 memiliki kisaran
like dan dibandingkan hasilnya dengan algoritma filter desimal antara –1 sampai 0.9999 (0x8000h sampai
offline. 0x7FFFh). Bilangan fraksional h dapat direpresentasikan
sebagai atau h= -b020+ b12-1 + b22-2 + ... + bN2-N,
Sistem DSP adalah sistem waktu diskrit yang mengambil dimana h adalah bilangan fraksional dan b adalah biner 1
sampel sinyal input dan menghasilkan sampel sinyal atau 0. Konversi bilangan real ke bilangan fraksional
output dengan frekuensi sampling tertentu yang konstan. dilakukan dengan:
Artinya pada sistem DSP realtime, pada rentang waktu
antar sampling, haruslah dapat dilakukan proses koef=round(2^31*koef);
perhitungan sampel output yang merupakan hasil
pengolahan sinyal digital (bisa berupa filter). Artinya
proses komputasi pengolahan sinyal digital untuk tiap Konversi bilangan fraksional ke bilangan real dilakukan
sampel haruslah dapat diselesaikan sebelum sampel dengan:
berikutnya diambil.
koef=koef / 2^31;
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
III. METODOLOGI 3.2.2. Percobaan membuat m-file untuk simulasi
pem-filteran realtime FIR dengan buffer
3.1. Alat dan Bahan sirkular
Pada percobaan pengenalan Dev C++, ada 3 percobaan
yang akan dilakukan yaitu percobaan membuat m-file Pada bagian ini diminta untuk membuat
untuk simulasi pem-filteran realtime FIR, percobaan simulasi pemfilteran realtime FIR dengan Dev
membuat m-file untuk simulasi pem-filteran realtime C++. Fungsi internal filter menggunakan
FIR dengan buffer sirkular, dan yang terakhir percobaan metoda non realtime, karena menghitung sinyal
membuat m-file untuk simulasi pem-filteran realtime output dengan sinyal yang lengkap
FIR dengan bilangan fraksional. Berikut ini alat dan
bahan yang digunakan :

No. Alat dan Bahan Jumlah


Buat perhitungan filter realtime FIR dengan
menggunakan Dev C++
 Komputer/PC (2 buah)

 Software MATLAB (1 buah)


Gunakan buffer input sepanjang orde filter.
 Aplikasi Dev C++ Contoh jika orde filter adalah 16 maka buffer
input adalah 16
3.2. Langkah Kerja

3.2.1. Percobaan membuat m-file untuk simulasi


pem-filteran realtime FIR
Pada setiap loop (clock) mengindikasikan
adanya sampel input yang baru. Ambil input
Pastikan komputer yang akan digunakan baru dan tempatkan pada buffer input dan
berfungsi dengan normal dan tidak ada masalah sampel-sampel terhadulu pada buffer tidak perlu
apapun digeser

Software MATLAB dan aplikasi Dev C++ Pada setiap loop (clock) hitunglah sampel sinyal
sudah terinstal dalam komputer output yang dihasilkan pada loop tersebut, lalu
tempatkan pada array output.

Pada bagian ini dibuat m-file untuk melakukan Setelah diperoleh hasil ouputnya kemudian
pemfilteran realtime FIR dengan Dev C++. praktikan diminta untuk membandingkan hasil
Fungsi internal filter menggunakan metode non simulasi dengan hasil sebelumnya
realtime, karena menghitung sinyal output
dengan sinyal input yang lengkap. Kemudian
membandingkan hasil simulasi dengan fungsi 3.2.3. Percobaan membuat m-file untuk simulasi
internal filter pem-filteran realtime FIR dengan bilangan
fraksional

Pada bagian ini dilakukan modifikasi hasil


percobaan sebelumnya menggunakan bilangan
Hal yang perlu diperhatikan ketika menjalankan fraksional 32 bit. Semua koefisien filter
simulasi adalah selalu buat file yang berbeda direpresentasikan dengan bilangan fraksional
dengan file yang dibuka di Microsoft Offfice
Excel agar pada saat proses simulasi dapat
menulis file. Karena file yang sedang dibuka
tidak akan bisa ditulis oleh program simulasi.
Kemudian buffer diise dengan sampel input
yang telah dikonversikan dari bilangan real
menjadi bilangan fraksional.
Hal ini membuktikan bahwa source code yang telah
Lakukan modifikasi perkalian bilangan real dibuat benar.
menjadi perkalian bilangan fraksional. Lalu
disimpan sinyal output yang dihasilkan dengan Source code matlab untuk pengeplotan ketiga sinyal
mengkonversikan bilangan fraksional menjadi tersebut yaitu :
bilangan real.
Initialisasi;
I = 1:100 (banyak sampel)
fs = 16000 (besar frek sampling)
f1 = 200 (nilai frek 1)
Setelah diperoleh hasil ouputnya kemudian f2 = 1000 (nilaifrek 2)
praktikan diminta untuk membandingkan hasil f3 = 5000 (nilai frek 3)
simulasi dengan hasil sebelumnya

Rumus fungsi;
IV. HASIL DAN ANALISIS sin1 = sin(2*pi*i*(f1/fs)) (fungsi1)
sin2 = sin(2*pi*i*(f2/fs)) (fungsi2)
4.1 Percobaan membuat m-file untuk simulasi pem- sin3 = sin(2*pi*i*(f3/fs)) (fungsi3)
filteran realtime FIR

Pada percobaan pertama ini dilakukan pembuat m-file


untuk melakukan simulasi pemfilteran realtime FIR Display;
dengan mengcopy source code yang sudah ada pada figure (1);
modul praktikum. Source code tersebut berisi fungsi subplot(2,1,1); plot(i,sin1);
konvolusi dari sinyal total (modul 1) dengan filter low- title('sin1') {plot sinyal 1}
pass. Kemudian dijalankan dengan aplikasi Dev C++. subplot(2,1,2); plot(i,sin2);
Hasilnya yaitu berupa file text yang berisi nilai-nilai title('sin2') {plot sinyal 2}
koefisien filter. Dari koefisin filter tersebut selanjutnya figure (2);
diplot dengan menggunakan Microsoft Office Excel. subplot(2,1,1); plot(i,sin3);
title('sin3') {plot sinyal 3}
Berikut ini merupakan salah satu hasil output grafik
disetiap masing-masing perioda, diantaranya: Selanjutnya dilakukan pengeplotan sinyal total yang
merupakan hasil penjumlahan dari ketiga sinyal. Berikut
gambarnya :

Gambar 2: Grafik simulasi dari Filter FIR realtime

Gambar 4: Sintot ((sin1+sin2+sin3)/3)

Dari sinyal total diatas, dapat dibuat pula hasil respons


frequensinya sebagai berikut:

Gambar 3: Grafik simulasi dari Filter FIR realtime


dengan MATLAB

Dapat terlihat bahwa hasil sinyal hasil konvolusi yang Gambar 5: Respon frequensi sinyal total
diperoleh dari source code (Dev C++) dengan hasil
konvolusi yang diperoleh dari MATLAB.
Pada praktikum ini dilakukan modifikasi hasil percobaan
Rumus fungsi; pertama dengan menggunakan metode buffering sirkular.
Sintot = (sin1+sin2+sin3)/3 merupakan sinyal Dengan metoda ini setiap kali didapatkan sampel input,
total yang merupakan penjumlahan dari ketiga maka sampe-sampel terdahulu pada buffer yang tidak
sinyal 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
Display:
yang di assign dengan nilai 0 serta adanya perhitungan
Subplot (2,1,2); plot (i,sintot); title („sintot)
filter dengan circular buffer. Berikut cuplikan source
merupakan suatu hasil dari grafik sinyal total
code :
dan pemberitaan judul grafik

int i, j, k=0;
Display:
Subplot (2,1,2); plot (i,sintot); merupakan suatu float filter(float input){
hasil dari grafik sinyal total
float hasil;
//buffering
buffer[k] = input;
Fungsi: hasil = 0;
Freqz (sintot); merupakan suatu perintah untuk for(j = 0; j <BUFFERLENGTH;j++){
mengamati respons hasil = hasil
+buffer[(j+k)%BUFFERLENGTH]*(koef_filter
[j]);
Dari data yang diperoleh dari sebuah sinyal input filter }
yaitu berupa sinyal total hasil dari penjumlahan 3 buah
sinyal sinusoidal dengan frequensi 200Hz, 1000Hz, dan // kembalikan hasil pemfilteran
5000Hz. Dapat dilihat perbandingan dengan perintah if (k>0){
nilai i = 1:100 tergantung dengan banyaknya sampel. I = k--;
100 merupakan suatu hasil superposisi dengan panjang }
vektor gabungan dari suatu sinyal 1, sinyal 2, dan sinyal else{
3. k=k+BUFFERLENGTH-1;
}
4.2 Percobaan membuat m-file untuk simulasi pem- return hasil;
filteran realtime FIR dengan buffer sircular }
Pada percobaan kedua ini dilakukan modifikasi dari
source code dari hasil percobaan sebelumnya dengan
menggunakan bilangan fraksional 16 bit. Semua Terlihat bahwa grafik filter yang dihasilkan dengan
koefisien filter direpresentasikan dengan buffer sircular. metoda buffer sirkular sama dengan grafik filter dengan
Dilakukan peng-edit-an source code pada bagian sebelumnya. Hal ini mengindikasikan bahwa source code
sebelumnya dengan mengubah isi fungsi filter, koefisien yang dibuat telah benar.
serta buffer menjadi tipe integer. Hasil nilai-nilai pada
file text dari program kemudian dibuat kedalam grafik Berikut ini merupakan hasil dari frekuensi response yang
dengan menggunakan excel. Metode bilangan yang dihasilkan untuk dua orde yang berbeda yakni pada orde
digunakan pada percobaan ini yaitu dengan mengedit 16:
source code yang telah ada. Yaitu menambahkan
perhitungan filter dengan buffer sircular sebagai berikut :

Berikut ini merupakan salah satu hasil output grafik


disetiap masing-masing perioda, diantaranya:

Gambar 7: Filter dengan orde 16

Gambar 6: Grafik simulasi dari Filter FIR realtime


dengan metoda buffer sircular
Eksekusi Program; ; hasil = 0;
1. Untuk Orde 16 for(j = 0; j <BUFFERLENGTH;j++){
Low-pass = fir2 (16, f, A); perintah tersebut hasil = hasil
digunakan dalam pembuatan filter low-pass +buffer[(j+k)%BUFFERLENGTH]*(koef_filter
dengan mencari suatu nilai koefiesienya [j]*pow(2,31));
menggunakan perintah fir2 }

// kembalikan hasil pemfilteran


Berikut ini merupakan hasil ouput nilai koefisien dalam if (k>0){
FIR low-pass dengan orde 16: k--;
}
else{
k=k+BUFFERLENGTH-1;
}
return hasil;
}

Berikut ini merupakan salah satu hasil output grafik


disetiap masing-masing perioda, diantaranya:

Gambar 8: Koefisien orde 16 pada Low-pass

Pada MATLAB telah disediakan fitur filer FIR2 yang


digunakan untuk mendesain filter digital FIR orde N
dengan respons frekuensi yang ditentukan oleh vektor f
dan A, serta menghasilkan koefisien filter pada vector b
sebanyak N+1. Vektor f dan A menetapkan sebuah
frekuensi dan magnitude untuk filter sehingga dapat
dilakukan perintah plot (f,A) yang akan menghasilkan
gambar dari respons frekuensi yang diinginkan. Nilai
frekuensi pada vektor f haruslah bernilai antara 0.0 < f < Gambar 9: Grafik simulasi dari Filter FIR realtime
1.0, dimana vektor dari 1.0 menunjukkan setengah dari dengan metoda bilangan fraksional
frekuensi sampling. Nilai pada vektor f harus bertambah,
dimulai dari 0.0 hingga 1.0. Perbedaan nilai orde pada Terlihat bahwa grafik filter yang dihasilkan dengan
fungsi yang digunakan hanya berpengaruh pada jumlah metoda bilangan fraksional sama dengan grafik filter
sampel yang digunakan. dengan sebelumnya. Hal ini mengindikasikan bahwa
source code yang dibuat telah benar.
4.3 Percobaan membuat m-file untuk simulasi pem-
filteran realtime FIR dengan bilangan fraksional Berikut ini, merupakan hasil output respon frequensinya:
Pada percobaan ketiga ini dilakukan modifikasi dari  FIR low-pass orde 32 frekuensi cut-off 800Hz
source code dari hasil percobaan sebelumnya dengan
menggunakan bilangan fraksional 32 bit. Semua
koefisien filter direpresentasikan dengan bilangan
fraksional. Dilakukan peng-editan 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 source code yang telah ada. Yaitu
menambahkan perhitungan filter dengan bilangan
fraksional sebagai berikut:
Gambar 10: Respon frequensi low-pass
int i, j, k=0;
Rumus fungsi;
float filter(float input){ LowPass = firl(32,01); merupakan filter lowpass
dengan mencari nilai koef menggunakan
float hasil; perintah firl
//buffering
buffer[k] = input;
REFERENSI
Fungsi;
Freqz; digunakan untuk melihat freq dari [1] T.H. Mervin. 2018.Petunjuk Praktikum Pengolahan Sinyal
Digital EL-2140. ITB, Bandung.
lowpass filter
[2] Proakis, Jhon. Manolakis, Dimitris. 1998. Digital Signal
Processing, principles, algoritm, and application. Prentice
Hall.
Kemudian cari nilai dari fir (N,Wn) yang akan [3] Dadang Gunawan and Filbert Hilman Juwono. 2012.
menghasilkan sebuah vektor yang merupakan hasil dari Digital Signal Processing With Matlab Programming.
suatu respons impuls pada suatu lowpass filter dengan Graha knowledge:Yogyakarta.
orde nilai N.
Diketahui :

>>lowpass = fir1 (N,Wn)

Diperoleh: 
1  Wn  fcut  off  800  0,1(Lowpass)
FS  0, 5 16000  0, 5

Berikut ini merupakan hasil ouput nilai koefisien dalam


FIR low-pass dengan orde 32:

Gambar 11: Koefisien orde 32 pada Low-pass

V. SIMPULAN

Dari hasil percobaan diaatas dapat disimpulkan sebagai


berikut :

1. Filter FIR realtime dapat disimulasikan dan dapat


diimplementasikan dengan membuat source code
menggunakan Dev- C++.
2. Filter FIR realtime yang diperoleh dengan MATLAB,
Dev-C++, berupa metoda buffer sirkular, dan metode
bilangan fraksional dengan menampilkan hasil output
konvolusi yang sama.
3. 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.
4. MATLAB dapat digunakan untuk melakukan desain
filter dalam suatu sinyal.
5. Fungsi-fungsi dalam matematika sederhana juga dapat
dilakukan pada MATLAB untuk menjumlahkan dua atau
lebih sinyal.
6. Algoritma fungsi-fungsi tertentu dapat dibuat dalam
bentuk m-file pada MATLAB.
LAMPIRAN
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.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 buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];

int i, j, k=0;

float filter(float input){

float hasil;
//buffering
buffer[k] = input;
hasil = 0;
for(j = 0; j <BUFFERLENGTH;j++){
hasil = hasil +buffer[(j+k)%BUFFERLENGTH]*(koef_filter[j]);
}

// kembalikan hasil pemfilteran


if (k>0){
k--;
}
else{
k=k+BUFFERLENGTH-1;
}
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;
//mengubah bilangan real ke fraksional
x[i]=round((2^32)*x[i]);
}

//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++) {
//mengubah bilangan fraksional jadi real
y[i]=y[i] / (2^32);

fprintf(pFile,"%4.4f\n", y[i]);
}

fclose(pFile);
system("PAUSE");
return EXIT_SUCCESS;
}

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.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 buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];

int i, j, k=0;

float filter(float input){

float hasil;
//buffering
buffer[k] = input;
hasil = 0;
for(j = 0; j <BUFFERLENGTH;j++){
hasil = hasil +buffer[(j+k)%BUFFERLENGTH]*(koef_filter[j]);
}

// kembalikan hasil pemfilteran


if (k>0){
k--;
}
else{
k=k+BUFFERLENGTH-1;
}
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;
//mengubah bilangan real ke fraksional
x[i]=round((2^32)*x[i]);
}

//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++) {
//mengubah bilangan fraksional jadi real
y[i]=y[i] / (2^32);

fprintf(pFile,"%4.4f\n", y[i]);
}

fclose(pFile);
system("PAUSE");
return EXIT_SUCCESS;
}

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.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 buffer[BUFFERLENGTH];
float x[LENGTH];
float y[LENGTH];

int i, j, k=0;

float filter(float input){

float hasil;
//buffering
buffer[k] = input;
hasil = 0;
for(j = 0; j <BUFFERLENGTH;j++){
hasil = hasil +buffer[(j+k)%BUFFERLENGTH]*(koef_filter[j]*pow(2,31)));
}

// kembalikan hasil pemfilteran


if (k<=0){
k--;
}
else{
k=k+BUFFERLENGTH-1;
}
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;
//mengubah bilangan real ke fraksional
x[i]=round((2^32)*x[i]);
}

//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++) {
//mengubah bilangan fraksional jadi real
y[i]=y[i] / (2^32);

fprintf(pFile,"%4.4f\n", y[i]);
}

fclose(pFile);
system("PAUSE");
return EXIT_SUCCESS;
}

Anda mungkin juga menyukai