PERANCANGAN
PENGOLAHAN SINYAL DIGITAL BERBASIS MIKROKONTROLER: FILTER FIR INSTRUMENTASI
PENGUKUR PULSE OXIMETRY
Theo
Gunawan (13215029)
Yoland
Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Percobaan ini
adalah mengenai desain filter FIR dalam instrumentasi pengukur pulse oximetry.
Pada percobaan ini dibuat sebuah filter FIR yang menunjang rangkaian pulse
oximetry. Koefisien filter dibuat menggunakan aplikasi FIR dari Internet dan
kemudian diimplementasikan menggunakan Dev C++ untuk dilihat keberjalannya.
Kata
kunci: Pulse oximetry, filter FIR, Dev C++
1. Pendahuluan
Filter
merupakan salah satu sistem yang umum digunakan pada pengolahan sinyal analog
maupun digital. Salah satu filter yang umum digunakan adalah filter FIR (finite impulse response). Salah satu
dari fungsi filter FIR adalah sebagai filter pada pulse-oxymeter. Pada percobaan ini dibuat filter FIR untuk
menunjang pulse-oxymeter.
2. Studi Pustaka
Filter dapat berupa FIR ataupun IIR. FIR digunakan pada percobaan ini karena memiliki beberapa keuntungan, yaitu sifatnya yang selalu stabil (fungsi transfer tidak memiliki pole), dapat dirancang untuk memiliki fasa linier, lebih mudah untuk diimplementasikan ke dalam hardware, dan respon transien memiliki durasi yang terbatas.[1] Pada percobaan kali ini digunakan software pembuat filter FIR yang ditemukan dari Internet untuk menemukan koefisien filter yang kemudian diimplementasikan dengan menggunakan Dev C++ (source code terlampir).
3. Metodologi
3.1 Komponen dan Alat
- Komputer.
- Software Dev C++.
3.2 Langkah-langkah Percobaan
- Menyalakan komputer kemudian membuka Internet browser.
- Mencari koefisien filter FIR yang diperlukan sesuai spesifikasi.
- Melakukan implementasi terhadap koefisien FIR menggunakan Dev C++ dan mengamati masukan dan keluaran dari sistem.
4. Hasil dan Analisis
4.1 Desain 1
Parameter dan koefisien pada desain ini adalah sebagai berikut.
sampling frequency: 2000 Hz
* 0 Hz - 100 Hz
gain = 10
desired ripple = 5 dB
actual ripple = 2.2233759169178633 dB
* 400 Hz - 1000 Hz
gain = 0
desired attenuation = -40 dB
actual attenuation = -43.53108876789503 dB
* Coefficient(13 taps)
0.04240684049581167,
0.1758240296470996,
0.44917844626868264,
0.8576663671703925,
1.3178230744505137,
1.6869098459370968,
1.8286433234703499,
1.6869098459370968,
1.3178230744505137,
0.8576663671703925,
0.44917844626868264,
0.1758240296470996,
0.04240684049581167
*/
Respons frekuensi
dan respons impuls dari desain ini adalah sebagai berikut.
Gambar 4-1 Respons
frekuensi dari desain 1
Gambar 4-2 Respons
impuls dari desain 1
Input yang digunakan berupa sinyal informasi (denyut jantung) yang dalam hal ini
digunakan frekuensi sebesar 10 Hz. Selain itu digunakan frekuensi 50 Hz untuk noise dari jala-jala, serta frekuensi
200 Hz dan 500 Hz untuk mewakili noise
pada frekuensi tinggi.
Gambar 4-3 Input desain 1
Output dari desain ini adalah sebagai berikut.
Gambar 4-4 Output desain 1
Dapat
diamati bahwa sinyal untuk frekuensi 10 Hz dan 50 Hz berhasil dilewatkan
sementara sinyal noise frekuensi
tinggi tidak. Namun bentuk sinyal output
masih kurang sesuai dengan hasil yang diharapkan.
4.2 Desain 2
Parameter dan koefisien pada desain ini adalah sebagai berikut.
sampling frequency: 2000 Hz
* 0 Hz - 60 Hz
gain = 5
desired ripple = 5 dB
actual ripple = 2.963730581908658 dB
* 200 Hz - 1000 Hz
gain = 0
desired attenuation = -40 dB
actual attenuation = -42.89696277105844 dB
* Coefficient(25 taps)
0.004700983811163256,
0.019916593440655966,
0.03753715925609809,
0.06916237980404788,
0.1106691930047679,
0.16372171905369323,
0.22534766789979188,
0.2921031689671121,
0.3586756201971846,
0.41916181403312064,
0.4676002183884678,
0.49893762114854845,
0.5097809690727866,
0.49893762114854845,
0.4676002183884678,
0.41916181403312064,
0.3586756201971846,
0.2921031689671121,
0.22534766789979188,
0.16372171905369323,
0.1106691930047679,
0.06916237980404788,
0.03753715925609809,
0.019916593440655966,
0.004700983811163256
*/
Respons frekuensi
dan respons impuls dari desain ini adalah sebagai berikut.
Gambar 4-5 Respons
frekuensi dari desain 2
Gambar 4-6 Respons
impuls dari desain 2
Input yang digunakan berupa sinyal informasi (denyut jantung) yang dalam hal ini
digunakan frekuensi sebesar 10 Hz. Selain itu digunakan frekuensi 50 Hz untuk noise dari jala-jala, serta frekuensi 100 Hz dan 500 Hz untuk mewakili noise
pada frekuensi tinggi.
Gambar 4-7 Input desain 2
Output dari desain ini adalah sebagai berikut.
Gambar 4-8 Output desain 2
Dapat
diamati bahwa sinyal untuk frekuensi 10 Hz dan 50 Hz berhasil dilewatkan
sementara sinyal noise frekuensi
tinggi tidak. Namun bentuk sinyal output
masih kurang sesuai dengan hasil yang diharapkan.
4.3 Desain 3
sampling frequency: 2000 Hz
* 0 Hz - 40 Hz
gain = 1
desired ripple = 5 dB
actual ripple = 3.91032115935755 dB
* 100 Hz - 1000 Hz
gain = 0
desired attenuation = -40 dB
actual attenuation = -40.550774289336324 dB
* Coefficient(43 taps)
{
-0.00406900049466597,
0.0014901583160827512,
0.0022278714276290482,
0.0034863421930641913,
0.005262349013769549,
0.007526937975321521,
0.010265872128229686,
0.013462614002518912,
0.017080624262474767,
0.021064542544973485,
0.025343688456984637,
0.029828825716452217,
0.034413765259578025,
0.03898213878353851,
0.04341086645098334,
0.047573306814647984,
0.0513458497439482,
0.05461325635763496,
0.05727219604594146,
0.059236523087357246,
0.06044200599455753,
0.060848468662696956,
0.06044200599455753,
0.059236523087357246,
0.05727219604594146,
0.05461325635763496,
0.0513458497439482,
0.047573306814647984,
0.04341086645098334,
0.03898213878353851,
0.034413765259578025,
0.029828825716452217,
0.025343688456984637,
0.021064542544973485,
0.017080624262474767,
0.013462614002518912,
0.010265872128229686,
0.007526937975321521,
0.005262349013769549,
0.0034863421930641913,
0.0022278714276290482,
0.0014901583160827512,
-0.00406900049466597
};
*/
Respons frekuensi
dan respons impuls dari desain ini adalah sebagai berikut.
Gambar 4-9 Respons
frekuensi dari desain 3
Gambar 4-10 Respons
impuls dari desain 3
Input yang digunakan berupa sinyal informasi (denyut jantung) yang dalam hal ini
digunakan frekuensi sebesar 10 Hz. Selain itu digunakan frekuensi 50 Hz untuk noise dari jala-jala, serta frekuensi 80
Hz dan 500 Hz untuk mewakili noise
pada frekuensi tinggi.
Gambar 4-11 Input desain 3
Output dari desain ini adalah sebagai berikut.
Gambar 4-12 Output desain 3
Dapat
diamati bahwa sinyal untuk frekuensi 10 Hz berhasil dilewatkan sementara sinyal
noise jala-jala dan noise frekuensi tinggi tidak. Bentuk
sinyal output sesuai dengan yang
diharapkan. Namun, dapat diamati bahwa terjadi delay
yang cukup besar karena
filter memiliki orde yang cukup besar.
5. Kesimpulan
Dari
hasil percobaan ini dapat disimpulkan:
- Filter FIR untuk menunjang pulse-oxymeter telah berhasil dibuat.
- Desain yang terpilih sebagai desain filter FIR adalah desain ketiga.
Daftar Pustaka
[1] Mervin T. Hutabarat dkk., Petunjuk Praktikum Pengolahan Sinyal
Digital, ed. 2017-2018, Laboratorium Dasar Teknik Elektro Institut
Teknologi Bandung, Bandung, 2017.
Lampiran
Source code desain 1
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
// panjang tap filter
#define BUFFERLENGTH 13
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
0.04240684049581167,
0.1758240296470996,
0.44917844626868264,
0.8576663671703925,
1.3178230744505137,
1.6869098459370968,
1.8286433234703499,
1.6869098459370968,
1.3178230744505137,
0.8576663671703925,
0.44917844626868264,
0.1758240296470996,
0.04240684049581167
};
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*10/2000*i)+sin(2*PI*50/2000*i)+sin(2*PI*200/2000*i)+sin(2*PI*500/2000*i)
) / 4;
}
//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;
}
Source code desain 2
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
// panjang tap filter
#define BUFFERLENGTH 25
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
0.004700983811163256,
0.019916593440655966,
0.03753715925609809,
0.06916237980404788,
0.1106691930047679,
0.16372171905369323,
0.22534766789979188,
0.2921031689671121,
0.3586756201971846,
0.41916181403312064,
0.4676002183884678,
0.49893762114854845,
0.5097809690727866,
0.49893762114854845,
0.4676002183884678,
0.41916181403312064,
0.3586756201971846,
0.2921031689671121,
0.22534766789979188,
0.16372171905369323,
0.1106691930047679,
0.06916237980404788,
0.03753715925609809,
0.019916593440655966,
0.004700983811163256
};
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*10/2000*i)+sin(2*PI*50/2000*i)+sin(2*PI*100/2000*i)+sin(2*PI*500/2000*i)
) / 4;
}
//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;
}
Source code desain 3
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
// panjang tap filter
#define BUFFERLENGTH 43
#define LENGTH 100
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
-0.00406900049466597,
0.0014901583160827512,
0.0022278714276290482,
0.0034863421930641913,
0.005262349013769549,
0.007526937975321521,
0.010265872128229686,
0.013462614002518912,
0.017080624262474767,
0.021064542544973485,
0.025343688456984637,
0.029828825716452217,
0.034413765259578025,
0.03898213878353851,
0.04341086645098334,
0.047573306814647984,
0.0513458497439482,
0.05461325635763496,
0.05727219604594146,
0.059236523087357246,
0.06044200599455753,
0.060848468662696956,
0.06044200599455753,
0.059236523087357246,
0.05727219604594146,
0.05461325635763496,
0.0513458497439482,
0.047573306814647984,
0.04341086645098334,
0.03898213878353851,
0.034413765259578025,
0.029828825716452217,
0.025343688456984637,
0.021064542544973485,
0.017080624262474767,
0.013462614002518912,
0.010265872128229686,
0.007526937975321521,
0.005262349013769549,
0.0034863421930641913,
0.0022278714276290482,
0.0014901583160827512,
-0.00406900049466597
};
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*10/2000*i)+sin(2*PI*50/2000*i)+sin(2*PI*100/2000*i)+sin(2*PI*500/2000*i)
) / 4;
}
//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;
}
No comments:
Post a Comment