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();
};
}
/*****************************************************
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