Thursday, April 5, 2018

Laporan Tugas 2 Sistem Mikroprosesor Tahap 2

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
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.

  • Komputer.
  • Software Dev C++.
3.2 Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.

  • 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
Parameter dan koefisien pada desain ini adalah sebagai berikut.
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