Minggu, 23 Juni 2013

REALISASI HIGH PASS FILTER PADA DISKRET PROGRAMMING

High Pass Filter digunakan untuk melewatkan frekuensi tinggi. Batasan frekuensi yang akan dilewatkan disebut frekuensi cut off, dimana persamaan dari frekuensi cut off adalah:
Persamaan diskret dari penurunan High Pass Filter adalah:

Dimana:


Penurunan persamaan High Pass Filter diatas dapat didownload pada file pdf DISINI.

Hasil dari pengujian dengan menggunakan High Pass Filter yang telah saya lakukan dapat dilihat pada gambar dibawah ini.
sinyal masukan yang akan di High Pass Filter.

Gambar diatas adalah sinyal masukan yang akan saya lewatkan frekuensi tingginya. Jika saya ingin melewatkan frekuensi diatas 0,5 Hz (batasan frekuensi atau frekuensi cut off = 0,5 Hz), maka hasilnya akan seperti gambar dibawah ini.
garis warna hitam adalah sinyal masukan, garis warna kuning adalah sinyal hasil High Pass Filter.
Jangan perhatikan garis warna pink dan biru (saya nampilin datanya kebanyakan, maklum saya nyoba banyak percobaan)

Dari hasil kedua gambar diatas sinyal keluaran dari High Pass Filter (garis warna kuning) hanya melewatkan frekuensi diatas frekuensi cut off yang bernilai 0,5 Hz. Jika frekuensi dibawah 0,5 Hz, maka sinyal tersebut tidak akan dilewatkan atau nilainya sama dengan nol.

Untuk dapat merealisasikan ke dalam bahasa pemrograman, maka kita dituntut terlebih dahulu untuk merancang batasan frekuensi yang akan dilewatkan (frekuensi cut off). Pada persamaan diskret dari penurunan High Pass Filter, terdapat sebuah variabel bernama koefisien filter (a), variabel inilah yang akan menentukan nilai dari frekuensi cut off.

Pengujian diatas saya menggunakan frekuensi cut off sebesar 0,5 Hz, maka untuk menentukan nilai koefisien filter (a), sebagai berikut:
frekuensi cut off = 0,5 Hz.

 
















dt adalah waktu sampling yang digunakan untuk mengeksekusi  instruksi High Pass Filter pada program, waktu sampling yang saya gunakan adalah 10 ms atau 0,01 detik.

Sehingga realisasi persamaan Low Pass Filter kedalam bahasa pemrograman menjadi:

Berikut adalah cuplikan listing program dari High Pass Filter:

/*****************************************************
Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/
float high_pass, a=0.97;
int ambil_sinyal, ambil_sinyal_sblmnya=0;
char temp_serial[8];

#include <mega8535.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>

// Timer 0 overflow interrupt service routine
// Interupt akan dieksekusi sesuai waktu sampling 10 ms atau 0.01 detik
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8A;

    //Algoritma Low Pass Filter
    high_pass=(float)(a*high_pass)+(a*(ambil_sinyal-ambil_sinyal_sblmnya));
//     y(i)        =              a* y(i-1)        + a*               (x(i)   -     x(i-1)

    //rekursif masukan sinyal
    ambil_sinyal_sblmnya=ambil_sinyal;
}

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


//untuk mengirim data ke PC, agar dapat diplot ke grafik
void kirim_data_ke_PC()
{
      putchar('a');//header data pertama
      itoa(ambil_sinyal,temp_serial);
      puts(temp_serial); 
    
      putchar('b');//header data pertama
      ftoa(high_pass,1,temp_serial);
      puts(temp_serial);
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x8A;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x4D;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;

// Global enable interrupts
#asm("sei")

while (1)
      {
      ambil_sinyal=read_adc(0);
      kirim_data_ke_PC();
      };
}

Tidak ada komentar:

Posting Komentar