7203030047

108
i PROYEK AKHIR APLIKASI PENGENALAN PENUTUR UNTUK SISTEM ABSENSI DENGAN METODE PENUTUR DEPENDENT (FASE PEMBELAJARAN) Oleh: INDAH KURNIA SARI 7203 030 047 JURUSAN TELEKOMUNIKASI POLITEKNIK ELEKTRONIKA NEGERI SURABAYA INSTITUT TEKNOLOGI SEPULUH NOPEMBER SURABAYA 2006

Transcript of 7203030047

i

PROYEK AKHIR

APLIKASI PENGENALAN PENUTUR UNTUK SISTEM ABSENSI

DENGAN METODE PENUTUR DEPENDENT (FASE PEMBELAJARAN)

Oleh: INDAH KURNIA SARI

7203 030 047

JURUSAN TELEKOMUNIKASI POLITEKNIK ELEKTRONIKA NEGERI SURABAYA

INSTITUT TEKNOLOGI SEPULUH NOPEMBER SURABAYA

2006

ii

APLIKASI PENGENALAN PENUTUR UNTUK SISTEM ABSENSI

DENGAN METODE PENUTUR DEPENDENT (FASE PEMBELAJARAN)

Oleh:

INDAH KURNIA SARI

7203 030 047

Proyek Akhir ini Digunakan Sebagai Salah Satu Syarat untuk Memperoleh Gelar Ahli Madya (A.Md.)

di Politeknik Elektronika Negeri Surabaya

Institut Teknologi Sepuluh Nopember Surabaya

Disetujui oleh

Tim Penguji: Dosen Pembimbing: 1. Ir. Nonot Harsono, MT 1. DR. Ir. Titon Dutono, M.Eng

NIP. 131 964 535 NIP. 131 651 258

2. Drs. Miftahul Huda, MT 2. Tri Budi Santoso, ST.MT NIP. 132 055 257 NIP. 132 128 464

3. Hary Oktavianto, ST NIP. 132 300 375

Mengetahui, Ketua Jurusan Telekomunikasi

Drs. Miftahul Huda, MT NIP. 132 055 257

iii

ABSTRAK

Pengenalan suara merepresentasikan teknik pengolahan sinyal

digital yang banyak digunakan untuk berbagai aplikasi. Proyek akhir ini akan memanfaatkan salah satu penerapan dari teknik pengenalan suara atau speech recognition untuk membuat suatu sistem atau sebuah software yang digunakan untuk mengenali suara dari pengucap. Pengolahan sinyal digital banyak digunakan untuk berbagai macam aplikasi dan salah satunya digunakan pada proyek akhir ini. Dengan pengolahan sinyal digital kami dapat membuat suatu sistem absensi. Pada proyek akhir ini terdapat 2 fase yaitu fase pembelajaran dan fase pengujian. Dan sub judul saya pada proyek akhir ini yaitu fase pembelajaran. Fase pembelajaran mempelajari tentang sampling, frame blocking, windowing, FFT, IFFT, dan liftering. Pada proyek akhir ini menggunakan metode dependent speaker dimana hanya digunakan untuk mengenali karakter suara satu orang saja.

Kata Kunci : speech recognition, speaker recognition, dependent speaker, liftering.

iv

ABSTRACT

Speech recognition representing technique of digital signal processing which have used many application. This final project will exploit one of the applying from speech recognition technique to make a system or software used to voice recognizing from speaker. Digital signal processing used many applications and one of them used in this final project. With digital signal processing we can make a system for absent. This final project uses two phase, there are enrollment phase and testing phase. And my subtitle in my final project is enrollment phase. Enrollment phase learn about the process of speech such as sampling, frame blocking, windowing, FFT (Fast Fourier Transform), IFFT (Inverse Fast Fourier Transform), and liftering. In this final project used a method and the method used in the speech recognition processing for absent system is dependent speaker method. This method used to recognize the characteristic of speech only for one people.

Key Words : speech recognition, speaker recognition, dependent

speaker, liftering

v

KATA PENGANTAR

Syukur Alhamdulillah kepada Allah SWT, segala puja dan puji syukur hanyalah untuk Allah SWT semata serta sholawat dan salam tercurah pada junjungan kita Nabi Muhammad SAW. Karena hanya dengan rahmat dan hidayah-Nya maka penulis dapat menyelesaikan proyek akhir ini dengan judul :

APLIKASI PENGENALAN PENUTUR UNTUK SISTEM ABSENSI DENGAN METODE PENUTUR DEPENDENT

Proyek akhir ini disusun sebagai salah satu syarat untuk memperoleh gelar Ahli Madya (A.Md) di Politeknik Elektronika Negeri Surabaya, Institut Teknologi Sepuluh Nopember Surabaya (ITS).

Demikian uraian singkat ini, besar harapan agar buku proyek akhir ini bermanfaat khususnya bagi penulis serta bagi pembaca pada umumnya untuk menambah wawasan dan pengetahuan.

Surabaya, Agustus 2006 Penulis

vi

UCAPAN TERIMA KASIH Melalui kesempatan ini, penulis ingin menyampaikan ungkapan

rasa terima kasih dari dalam hati atas terselesainya tugas akhir ini. Khususnya rasa syukur kepada Allah SWT yang telah banyak memberikan kekuatan dan rahmat-Nya kepada penulis. Dan tanpa menghilangkan rasa hormat yang mendalam kami mengucapkan rasa terima kasih kepada pihak-pihak yang telah membantu penulis antara lain : 1. Mama (Alm) dan Papa tercinta yang telah memberikan doa,

dukungan dan kasih sayang yang tak cukup diungkapkan hanya dengan ucapan dan perasaan, serta bimbingan dan nasehat-nasehat yang diberikan pada penulis dalam menjalani hidup dan juga sebagai seorang sahabat yang selalu setia dan memberikan saran-saran dalam berbagai persoalan.

2. Mas Farid Effendi atas cinta, perhatian, dan dukungan terhadap Adek dan sebagai seorang sahabat yang enak diajak ngobrol dan jalan-jalan dan juga mbak Erni.

3. Bapak DR. Ir. Titon Dutono, M.Eng, selaku Direktur Politeknik Elektronika Negeri Surabaya dan sekaligus sebagai dosen pembimbing.

4. Bapak Tri Budi Santoso, ST.MT, selaku dosen pembimbing atas segala bimbingan, dukungan, saran, semangat serta kesabaran yang teramat besar selama kami menjadi anak bimbing pada proyek akhir ini.

5. Keluarga besar Masunnah, Mami, Nasywa, Keluarga besar Trimo atas doa dan dukungannya.

6. R. Bagus Mahadityo beserta bapak dan ibu, trima kasih doa dan dukungannya.

7. Para dosen penguji proyek akhir yang turut menyempurnakan tugas proyek akhir ini.

8. Makasih juga buat Adi, Mas Budi, Mas Irwan, dan Mas Fandi. 9. Buat semua teman – temanku kelas 3 telkom B angkatan 2003

khususnya anggota yang di lab DSP.

Sekali lagi penulis mengucapkan banyak terima kasih yang tak terhingga Semoga Allah SWT membalas atas semua kebaikan dan bantuan dari kalian semua.

vii

DAFTAR ISI

Halaman

HALAMAN JUDUL i LEMBAR PENGESAHAN ii ABSTRAK iii ABSTRACT iv KATA PENGANTAR v UCAPAN TERIMA KASIH vi DAFTAR ISI vii DAFTAR GAMBAR ix DAFTAR TABEL xi DAFTAR PERSAMAAN xii BAB I PENDAHULUAN 1.1 Latar Belakang 1 1.2 Tujuan 1 1.3 Permasalahan 2 1.4 Batasan Masalah 2 1.5 Metodologi 2 1.6 Sistematika Pembahasan 3 BAB II TEORI PENUNJANG 2.1 Snack 5 2.2 Tcl/tk 6 2.3 Membuat Extensi snack di C/C++ 6 2.4 Sekilas Tentang Visual C++ 9 2.5 Sistem Pengolahan Sinyal Suara 11 2.5.1 Sinyal Suara Manusia 11 2.5.1.1 Sinyal Diskrit 13 2.5.2 Proses Sampling 14 2.5.3 Frame Blocking 15 2.5.4 Windowing 16 2.5.5 FFT (Fast Fourier Transform) 18 2.5.6 IFFT (Inverse Fast Fourier Transform) 20 2.5.7 Liftering 21 2.5.8 Awal dan Akhir Sinyal Suara 21 2.5.8.1 Power 21 2.5.8.2 Front-End Detection 21

viii

BAB III PERENCANAAN DAN PEMBUATAN 3.1 Pendahuluan 23 3.2 Sistem Pengolahan Sinyal Suara 23 3.2.1 Perekaman Suara 24 3.2.2 Sampling 27 3.2.3 Frame Blocking 30 3.2.4 Windowing 32 3.2.5 Fast Fourier Transform 33 3.2.6 IFFT 38 3.2.7 Liftering 38 3.2.8 Mutlak Log 40 3.2.9 FFT Spectrum 42 3.2.10 FFT Cepstrum 44 3.3 Awal Dan Akhir Suatu Sinyal 46 3.3.1 Power 46 BAB IV PENGUJIAN DAN ANALISA 4.1 Pendahuluan 47

4.2 Pengujian Dan Analisa Sistem Pengolahan Sinyal Suara

47

4.2.1 Perekaman Suara 47 4.2.1.1 Dengan Menggunakan Snack dan

Tcl/Tk 47

4.2.1.2 Dengan Menggunakan Wavesurfer 52 4.2.2 Proses Sampling 54 4.2.3 Proses Windowing 55 4.2.4 Fast Fourier Transform 57 4.2.4.1 Dengan Menggunakan Snack dan

Tcl/Tk 58

4.2.4.2 Dengan Menggunakan Wavesurfer 59 4.2.5 Liftering 59 4.2.6 FFT Cepstrum 60

BAB V PENUTUP 5.1 Kesimpulan 63 5.2 Saran 63

DAFTAR PUSTAKA 65 LAMPIRAN RIWAYAT HIDUP PENULIS

ix

DAFTAR GAMBAR

Halaman

Gambar 2.1 Contoh aplikasi snack 5 Gambar 2.2 Skema diagram organ penghasil sinyal suara 12 Gambar 2.3 Sinyal suara untuk bunyi vokal “a” didalam 1 frame 13 Gambar 2.4 Bentuk sinyal Diskrit 14 Gambar 2.5 Bentuk sinyal sinus 15 Gambar 2.6 Bentuk sinyal sinus yang telah di sampling 15 Gambar 2.7 Bentuk sinyal yang di Frame Blocking 16 Gambar 2.8 Sinyal kata “indah” tanpa di window 18 Gambar 2.9 Sinyal kata “indah” yang telah di window

Hamming 18

Gambar 2.10 Sinyal di domain waktu 20 Gambar 2.11 Sinyal di domain frekuensi 20 Gambar 3.1 Sistem secara keseluruhan 23 Gambar 3.2 Blok Diagram Sistem keseluruhan 24 Gambar 3.3 Tampilan Software Integrasi dari Snack dan Tcl/Tk 26 Gambar 3.4 Flowchart Sistem Graphical User Interface 27 Gambar 3.5 Sinyal hasil sampling kata “indah” 1 frame 28 Gambar 3.6 Flowchart dari proses sampling 29 Gambar 3.7 Frame blocking sinyal 30 Gambar 3.8 Flowchart dari proses frame blocking 31 Gambar 3.9 Flowchart dari proses windowing 33 Gambar 3.10 Flowchart dari proses FFT 37 Gambar 3.11 Flowchart dari proses liftering 39 Gambar 3.12 Flowchart dari proses mutlak log 41 Gambar 3.13 Flowchart dari proses FFT Spectrum 43 Gambar 3.14 Flowchart dari proses FFT Cepstrum 45 Gambar 3.15 Flowchart dari proses power 46 Gambar 4.1 Tampilan awal perangkat lunak menggunakan

Tcl/Tk dan Snack 48

Gambar 4.2 Tampilan software untuk mode perekaman 49 Gambar 4.3 Tampilan software untuk mode pengujian 50 Gambar 4.4 Tampilan software untuk mode database 51 Gambar 4.5 Perekaman kata “indah” pada Mode Perekaman 52 Gambar 4.6 Perekaman kata “indah” dengan menggunakan

wavesurfer 53

x

Gambar 4.7 Kotak dialog setting perekaman perangkat lunak wavesurfer

53

Gambar 4.8 Hasil Sampling kata “indah” pada frame ke-1 55 Gambar 4.9 Hasil windowing kata “indah” pada frame ke-1 57 Gambar 4.10 Fast Fourier Transform untuk kata “indah” pada

frame ke-1 dengan menggunakan snack/Tcl/Tk 58

Gambar 4.11 Fast Fourier Transform untuk kata “indah” pada frame ke-1 dengan menggunakan wavesurfer

59

Gambar 4.12 Hasil Spectrum dan Cepstrum untuk kata “indah” 61

xi

DAFTAR TABEL

Halaman

Tabel 2.1 Sejumlah ekstensi yang dibangkitkan oleh C++ 11

xii

DAFTAR PERSAMAAN

Halaman

Persamaan 2.1 13 Persamaan 2.2 14 Persamaan 2.3 16 Persamaan 2.4 17 Persamaan 2.5 17 Persamaan 2.6 17 Persamaan 2.7 19 Persamaan 2.8 19 Persamaan 2.9 19 Persamaan 2.10 21 Persamaan 2.11 21 Persamaan 3.1 32 Persamaan 3.2 34

1

BAB I PENDAHULUAN

1.1 Latar Belakang

Sekarang ini banyak teknologi - teknologi baru yang perkembangannya semakin lama semakin berkembang dengan pesat. Salah satunya adalah teknologi dalam bidang suara. Dan sekarang ini banyak sekali teknologi-teknologi baru yang memanfaatkan suara. Salah satunya yaitu terdapat dalam proyek akhir di PENS-ITS, dimana suara manusia digunakan sebagai perintah pada robot. Dengan suara, manusia dapat mengontrol gerakan robot. Dalam hal ini robot dapat bergerak maju, mundur, kanan, dan kiri sesuai dengan perintah suara yang kita ucapkan. [1]

Salah satu teknologi lagi yang menggunakan atau memanfaatkan suara manusia yaitu untuk proses login atau password. Dimana untuk mengatasi hal tersebut digunakan suatu pengolahan sinyal digital untuk proses pengenalan suara yang telah dikeluarkan oleh manusia.

Dengan pertimbangan tersebut, maka pembuatan perintah kendali dengan suara sangat sesuai jika diaplikasikan dalam proyek akhir kami yang berjudul :

“APLIKASI PENGENALAN PENUTUR UNTUK SISTEM ABSENSI DENGAN METODE PENUTUR DEPENDENT”. Pada proyek akhir ini akan membuat sebuah sistem yang

memanfaatkan teknologi pengenalan suara (speech recognition). Sistem ini diharapkan dapat mengenali suara dan kemudian hasil dari pengenalan suara tersebut digunakan untuk sistem absensi. Dan pada sistem absensi ini digunakan suatu metode dependent speaker untuk mengenali suatu karakter suara manusia secara individu. 1.2 Tujuan - Mengimplementasikan suatu sistem pengenalan sinyal suara untuk

suatu proses absensi yang menggunakan metode dependent speaker. - Mempelajari lebih lanjut tentang pengolahan suatu sinyal digital

khususnya pengenalan sinyal suara atau yang biasa disebut dengan speech recognition.

1.3 Permasalahan

2

Permasalahan dari proyek akhir ini menitikberatkan pada speech processing, dimana pada speech processing ini terdapat suatu parameter–parameter yang harus diketahui dari pengolahan sinyal digital yang digunakan untuk proses pengenalan suara. Parameter – parameter tersebut adalah proses sampling, frame blocking, windowing, FFT (Fast Fourier Transform), IFFT (Inverse Fast Fourier Transform), Liftering, FFT Cepstrum dan DTW (Dynamic Time Warping). Untuk melakukan penelitian tentang parameter tersebut, perlu dikembangkan suatu program yang dapat mensimulasikan parameter-parameter tersebut untuk mewakili proses yang sebenarnya. Metode yang digunakan pada proyek akhir ini adalah metode dependent speaker dimana pengenalan identitas pembicara sangat diutamakan.

1.4 Batasan Masalah

Pada proyek akhir ini terdapat 2 fase yang harus dikerjakan yaitu fase pembelajaran (enrollment) dan fase pengujian (testing). Proyek akhir ini menggunakan metode dependent speaker dimana pada metode ini mengenali identitas pembicara. Dan pada proyek akhir ini kita mengambil sampel 30 orang. Pengambilan sampel dikondisikan dalam keadaan normal dan tiap orang merekam 5 sampel suara. Dan adapun fase yang saya kerjakan yaitu fase pembelajaran (enrollment phase). Parameter-parameter yang saya kerjakan yaitu mulai dari proses sampling, frame blocking, windowing, FFT, IFFT, liftering. 1.5 Metodologi

Dalam pembuatan proyek akhir ini dibutuhkan langkah-langkah sebagai berikut:

• Perancangan Sistem Perancangan sistem tersebut berdasarkan pada petunjuk-petunjuk yang sudah ada.

• Perancangan dan Pengenalan Perangkat Lunak (Software) Perancangan dan pengenalan software meliputi software snack 2.2.2 Tcl/Tk 8.3.0 dan juga software bahasa C.

• Pembuatan dan Pengujian Perangkat Lunak (Software)

3

Dari hasi perancangan software tersebut diadakan pengujian terhadap kinerja dari masing-masing bagian.

• Pengujian Sistem Setelah itu maka dapat dilakukan pengujian secara keseluruhan dari semua sistem yang telah dibuat.

• Analisa Sistem Kemudian kita dapat menganalisa sistem tersebut dengan mencari kekurangan-kekurangan yang ada supaya kita bisa memperbaiki kekurangan-kekurangan tersebut.

1.6 Sistematika Pembahasan

Sistematika pembahasan dalam proyek akhir ini yang berjudul Aplikasi Speech Processing Untuk Sistem Absensi Dengan Metode Dependent Speaker adalah sebagai berikut :

Bab I Pendahuluan

Menguraikan tentang latar belakang, tujuan, permasalahan, batasan masalah, metodologi, dan sistematika pembahasan masalah yang digunakan dalam pembuatan proyek akhir ini.

Bab II Teori Penunjang

Teori – teori berisi tenteng pembahasan secara garis besar tentang snack, perintah dasar Tcl dan teori tentang pengolahan sinyal suara. Mulai dari proses sampling sampai dengan proses liftering.

Bab III Perencanaan dan Pembuatan

Membahas secara langkap tentang perencanaan dan pembuatan sistem yang akan dibangun seperti algoritma pemrograman, flowchart sistem yang akan dibangun, serta tampilan-tampilan yang digunakan pada proyek akhir ini.

Bab IV Pengujian dan Analisa

4

Membahas tentang pengujian dari sistem yang telah dibuat, hasil dari pengujian yang telah dilakukan beserta dengan analisanya.

Bab V Penutup

Berisi tentang kesimpulan dan saran yang berdasarkan analisa hasil data yang diperoleh.

BAB II

5

TEORI PENUNJANG 2.1 Snack

Snack adalah sebuah software yang digunakan untuk pemrosesan suara yang dipakai sebagai extensi dalam suatu bahasa script. Dan bahasa script yang biasa digunakan bersama – sama dengan snack yaitu Tcl/Tk, Phyton, Ruby. Dalam proyek akhir ini menggunakan software snack versi 2.2.2 dan Tcl/Tk 8.3.0.

Snack memiliki perintah – perintah untuk play, record, process, dan memvisualisasi suara. Snack menyediakan objek suara tingkat tinggi, dengan manajemen penyimpanan yang fleksibel dan streaming support. Snack dapat bekerja pada banyak format file suara dan juga dapat menampilkan visualisasi dari suatu sinyal suara secara real – time. Snack dapat diperluas dengan perintah-perintah baru yang beroperasi dalam suatu obyek suara. Selain itu juga memungkinkan untuk menambah suatu format file suara dan tipe filter yang baru. Snack dapat digunakan untuk array yang lebar untuk sesuatu yang berhubungan dengan file-file suara dan data audio. Dari satu baris perintah yang mudah, seperti memainkan suatu file suara atau menemukan nilai ekstrim sinyalnya sampai aplikasi-aplikasi analisis suara yang kompleks dengan suatu tampilan grafis (graphical user interfaces).

Gambar 2.1 Contoh Aplikasi Snack

2.2 Tcl/Tk Tcl merupakan singkatan dari Tool Control Language. Sedangkan

Tk adalah Graphical Toolkit extension dari Tcl. Tcl/tk menyediakan

6

bermacam-macam item standar antarmuka GUI untuk memfasilitasi user untuk mmbuat sebuah tampilan atau desain secara cepat dan juga bisa untuk pengembangan aplikasi tingkat tinggi lainnya.

Untuk bahasa pemrograman di Tcl/Tk bentuknya sama seperti bahasa pemrograman di C/C++ terutama pada loop structures, definisi fungsi dan logika perhitungannya. Didalam Tcl semua data di representasikan sebagai string.

2.3 Membuat exstensi Snack di C/C++

Snack dapat ditambahkan dengan perintah baru yang beroperasi pada objek sound. Snack juga mungkin untuk menambah format file sound baru dan tipe filternya. Kita juga bisa mendefinisikan beberapa objek perintah baru yang berhubungan dengan Snack sound dan mengubah traknya. Hal ini bisa diwujudkan dengan menggunakan Snack C – library. Sebuah contoh ekstensi dapat dicari dalam direktori ext dari distribusi sumber Snack bersama dengan informasi bagaimana cara membangun dan menggunakannya baik untuk Unix dan Windows. Kode sumber yang menunjukkan bagaimana speech recognizer dapat men – track objek Snack sound dapat ditemukan disini. Di bawah ini adalah sebuah contoh kecil sebuah perintah dengan menambah Snack. Kode dan file yang berhubungan dapat dicari dalam direktori ext dari distribusi Snack.

Berikut ini merupakan contoh program C/C++ yang menggunakan

extensi snack. Contoh : #include "snack.h" int Square(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Sound *sound; int i; /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) { if ((i/10)%2)

7

{ Snack_SetSample(sound, 0, i, 10000); } else { Snack_SetSample(sound, 0, i, -10000); } } return TCL_OK; } /* Initialize the square package and create a new sound command 'square'. The syntax is: sndName square */ EXPORT(int, Square_Init)(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif #ifdef USE_TK_STUBS if (Tk_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif #ifdef USE_SNACK_STUBS if (Snack_InitStubs(interp, "2", 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgProvide(interp, "square", "1.0") != TCL_OK)

8

{ return TCL_ERROR; } Snack_AddSubCmd(SNACK_SOUND_CMD, "square", (Snack_CmdProc *) Square, NULL); return TCL_OK; }

Untuk script pemanggil file C/C++ dapat dibuat di editor seperti

notepad,wordpad dsb. Untuk penyimpanan di editor notepad maka nama file harus diakhiri dengan .tcl. Contoh pemanggilan nama file Get_data baru. #/usr/local/bin/wish # 'info sharedlibext' returns .dll on Windows and .so on most Unix systems package require –exact snack 2.2

load lib\\Get_data 1

sound 2 s 3 s length 10000

s Get_data 4 pack [button .b -text Play -command {s play}] keterangan : 1. Nama extensi file .dll 2. Strutur dari snack sound toolkit untuk pemrosesan suara 3. Nama obyek yang digunakan untuk pemrosesan suara 4. Panggilan fungsi dari file .dll yang digunakan dalam program snack 2.4 Sekilas Tentang Visual C++

Visual C++ menggunakan perangkat pengembangan aplikasi yang menggunakan C++ sebagai bahasa pemrograman dan dapat digunakan untuk membuat aplikasi berbasis Windows maupun berbasis teks (aplikasi konsol).[2] Perangkat ini menyediakan lingkungan yang dinamakan IDE ( Integrated Development Enviroment) yang

9

memungkinkan pemakai membuat, mengkompailisasi, menggabungkan, dan menguji program dengan cepat dan mudah. Beberapa komponen penting dalam Visual C++ adalah sebagai berikut:

• Editor Editor menyediakan sarana bagi pemrogram untuk menuliskan program. Yang menarik, editor yang disediakan mampu mengenali kata-kata yang tercadang C++ dan akan memberi warna tersendiri terhadap kata-kata yang seperti itu. Keuntungannya, program menjadi lebih mudah dibaca dan sekiranya kita melakukan kesalahan dalam menuliskan kata-kata maka akan lebih cepat terdeteksi.

• Kompiler Kompiler adalah perangkat lunak yang berfungsi untuk menerjemahkan kode sumber (source code) ke dalam bentuk bahasa mesin. Piranti ini dapat memberikan pesan-pesan kesalahan jika terjadi kesalahan kaidah penulisan program yang terdeteksi pada tahap proses kompalisasi. Hasil kompalisasi berupa kode objek (object code) yang disimpan dalam berkas berekstensi .obj (disebut berkas objek).

• Linker Linker adalah perangkat lunak yang berfungsi menggabungkan berbagai modul yang dihasilkan oleh kompiler dan modul kode dari berbagai pustaka C++, serta membentuk menjadi kode yang dapat dieksekusi. Sebagaimana kompiler , linker juga dapat mendeteksi kesalahan. Kesalahan yang terjadi sewaktu proses linking bisa disebabkan karena ada bagian pustaka atau bagian program yang tidak ditemukan.

• Pustaka Visual C++ menyediakan berbagai pustaka (library) yang memudahkan pemrogram dalam melakukan berbagai operasi seperti menghitung akar kuadrat dan mengakses database. Pustaka-pustaka yang tersedia antara lain berupa:

o Standart C++ Library (berisi semua rutin yang tersedia pada kebanyakan kompiler C++)

10

o Microsoft Foundation Classes and Templates (MFC&T), yang berkaitan dengan pemrograman Windows.

• AppWizard Perangkat ini bermanfaat untuk membangkitkan suatu kerangka dasar aplikasi Windows yang sangat memudahkan pemrogram untuk membuat aplikasi Windows.

• ClassWizard Perangkat ini bermanfaat untuk mengedit kelas-kelas yang dibangkitkan oleh AppWizard.

Dalam Visual C++ terdapat subdirektori yang terdiri dari berkas-berkas dengan ekstensi .dsp, .dsw, .ncb, .opt, .cpp, .h, .rc, .ico, dan lain-lain. Berikut penjelasan singkat atas masing-masing ekstensi tersebut.

Tabel 2.1 Sejumlah ekstensi yang dibangkitkan oleh C++

Ekstensi Keterangan .dsp Berkas ini berisi definisi dasar sebuah proyek,

berisi informasi tentang bagaimana aplikasi diciptakan berdasarkan berkas-berkas yang terdapat pada project workspace.

.dsw Berisi informasi tentang isi proyek.

.opt Berisi data tentang pengaturan-pengaturan

11

dalam proyek; misalnya, menyimpan informasi tentang kemungkinan aplikasi bisa di debug atau tidak.

.cpp Berisi kode sumber C++

.h Merupakan berkas judul (header file), yang umumnya berisi definisi kelas atau berisi prototipe fungsi.

.rc Berisi resource Microsoft Windows (ikon, bitmap, dan berbagai kontrol) yang digunakan oleh aplikasi

.ico Berkas ikon untuk aplikasi

.exe Berkas yang dapat dieksekusi secara langsung (executable).

2.5 Sistem Pengolahan Sinyal Suara 2.5.1 Sinyal Suara Manusia

Dengan suara manusia dapat berkomunikasi dengan manusia yang lainnya. Organ tubuh manusia yang digunakan dalam proses produksi suara adalah paru – paru, tenggorokan (trachea), larinks, farinks, rongga hidung (nasal cavity) dan rongga mulut (oral cavity). Pembangkitan sinyal suara terletak pada bentuk lintasan vokalnya (vocal tract). Lintasan vocal tersebut terdiri atas : di bawah katup tenggorokan (laryngeal pharynx), antara lagit – langit lunak katup tenggorokan (oral pharynx), di atas velum dan di ujung depan rongga hidung (nasal pharynx), dan rongga hidung (nasal cavity), seperti ditunjukkan pada gambar ini.[3]

12

Gambar 2.2 Skema Diagram Organ Penghasil Sinyal Suara Sinyal suara merupakan hasil dari suara manusia, dimana sinyal suara mempunyai frekuensi kerja antara 0 sampai dengan 5000 Hz. Bentuk gelombang sinyal wicara mempunyai bentuk yang unik seperti pada gambar 2.3.

13

-10000

-5000

0

5000

10000

15000

0 50 100 150 200 250 300

Gambar 2.3 Sinyal suara untuk bunyi vokal “a” didalam 1 frame

2. 5. 1.1 Sinyal Diskrit Sinyal suara dapat direpresentasikan menjadi sebuah fungsi. Dimana fungsi itu berisi informasi - informasi yang merupakan pola dari sinyal suara tersebut. Fungsi sinyal dinyatakan sebagai x (fungsi waktu) dengan menyertakan variable dalam tanda (...). Untuk membedakan sinyal waktu kontinyu dengan sinyal diskrit adalah menggunakan simbol t untuk menyatakan variable kontinyu dan symbol n untuk menyatakan variable diskrit.sinyal waktu diskrit hanya menyatakan nilai integer dari variable independent.

Pada teori sistem diskrit, lebih ditekankan pada pemrosesan sinyal yang berderetan. Pada sejumlah nilai x, dimana nilai yang ke-x pada deret x(n) akan dituliskan secara format sebagai :

x ={x (n) }; (2.1)

14

Gambar 2.4 Bentuk sinyal Diskrit

2.5.2 Proses Sampling

Sinyal suara merupakan sinyal yang tidak terbatas dalam domain waktu (finite time interval). Suara manusia akan menghasilkan sinyal analog yang terus kontinyu. Untuk keperluan pemrosesan dalam transformasi fourier maka sinyal wicara harus dibentuk dalam potongan – potongan waktu yang terbatas (infinite time interval). Karena itu sinyal yang ada dipotong – potong dalam slot – slot interval waktu tertentu. Berdasarkan pada teori sampling Nyquist, maka syarat dari frekuensi sampling adalah minimal dua kali frekuensi sinyal.

Fsampling ≥ 2 x Fsignal (2.2)

15

Gambar 2.5 Bentuk sinyal sinus

Gambar 2.6 Bentuk sinyal sinus yang telah di sampling

2.5.3 Frame Blocking

Frame Blocking merupakan pembagian suara menjadi beberapa frame dan satu frame terdiri dari beberapa sampel. Pengambilan sampel tersebut tergantung dari tiap berapa detik suara akan disampel dan berapa besar frekuensi samplingnya. Di dalam proyek akhir ini menggunakan frekuensi sampling 12000 Hz dan pengambilan sampel tiap 20 ms. Hal ini berarti dalam tiap frame terdapat 240 sampel.

Perhitungannya dapat kita lihat sebagai berikut : Frekuensi sampling = 12000 Hz berarti dalam tiap 1 dt terdiri dari 12000 sampel Disampling tiap 20 ms = 0.002 dt

16

Jadi jumlah sampel tiap frame = (12000 x 0.002) / 1 = 240 sampel

Gambar 2.7 Bentuk sinyal yang di Frame Blocking 2.5.4 Windowing

Sinyal suara yang dipotong-potong menjadi beberapa frame akan menyebabkan efek diskotinuitas sehingga menyebabkan kesalahan data pada proses fourier transform. Windowing diperlukan untuk mengurangi efek diskontinuitas dari potongan – potongan sinyal.

Dimana jenis windowing ada beberapa macam yaitu Hamming, Hanning, Bartlet, Rectanguler dan Blackman. Persamaan windowing sebagai berikut :

♦ Window Hamming

Persamaan (2.3)

♦ Window Hanning

Wham(n) =

0)]1/(2cos[46.052.0 −− Nnπ

elsewhereNn 10 −≤≤

Whan(n) =

02/)]}1/(2cos[1{ −− Nnπ

elsewhereNn 10 −≤≤

MM

N

17

Persamaan (2.4)

♦ Window Bartlett

Persamaan (2.5)

♦ Window Blackman

Persamaan (2.6)

Dimana: N = Jumlah data dalam satu window n = urutan data ke-n

WB(n) = 0

)1/(22)1/(2−−

−Nn

Nn

elsewhereNnN

Nn12/)1(

2/)1(0−≤≤−

−≤≤

WBl(n) =

0)]1/(4cos[08.0)]1/(2cos[5.042.0 −+−− NnNn ππ

elsewhereNn 10 −≤≤

18

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah Data

Am

plitu

do

Gambar 2.8 Sinyal kata “indah” tanpa di window pada frame ke-1

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah Data

Am

plitu

do

Gambar 2.9 Sinyal kata “indah” yang telah di window Hamming pada frame ke-1

2.5.5 FFT (Fast Fourier Transform)

Transformasi fourier adalah suatu metode yang sangat efisien untuk menyelesaikan transformasi fourier diskrit yang banyak dipakai untuk keperluan analisa sinyal seperti pemfilteran, analisa korelasi, dan analisa spectrum. Diskrit Fourier Transformasi (DFT) adalah deretan yang terdefinisi pada kawasan frekuensi – diskrit yang merepresentasikan Transformasi Fourier terhadap suatu deretan

19

terhingga (finite duration sequence). DFT berperan penting untuk implementasi algoritma suatu varitas pengolahan sinyal, karena efisien untuk komputasi berbagai aplikasi.

Fast fourier Transformation atau transformasi Fourier cepat, merupakan proses lanjutan dari DFT ( Diskrit Fourier Transformation ). Transformasi Fourier ini dilakukan untuk mentransformaikan sinyal dari domain waktu ke domain frekuensi.

FFT adalah bentuk khusus dari persamaan integral fourier :

H = dteth tj∫ − ω)( (2.7)

Dengan mengubah variable-variabel, waktu (t), frekuensi (w)

kedalam bentuk diskrit diperoleh transformasi fourier diskrit (DFT) persamaanya yaitu :

ntjkN

n

enThkH 0

1

00 )()( ωω −

=∑= (2.8)

Disederhanakan dengan T=1 sampel waktu N=sample waktu N=sample frekuensi k sehingga menjadi :

ntjkenhkH 0)()( ω−∑= (2.9)

Dengan k : 0,1,2,…,N-1

Pemakaian FFT karena untuk penghitungan komputasi yang lebih cepat dan mampu mereduksi jumlah perkalian dari N2 menjadi NlogN perkalian. FFT yang digunakan memakai 512 point dan arena hasil FFT simetris, maka keluaran FFT tersebut hanya diambil sebanyak 256 data. Hasil dari proses FFT akan diperoleh titik-titik sinyal yang simetris sehingga data yang dimbil hanya setengah dari data keseluruhan yang selanjutnya akan diambil nilai maksimumnya.

Di dalam proses fast fourier transform akan menghasilkan dua buah nilai yaitu nilai real dan nilai imajiner. Dan untuk proses selanjutnya kita membutuhkan nilai real saja untuk itu diperlukan proses mutlak log.

20

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah DataA

mpl

itudo

Gambar 2.10 Sinyal di domain waktu

6.2

6.4

6.6

6.8

7

7.2

7.4

7.6

0 1000 2000 3000 4000 5000 6000 7000

Frekuensi (Hz)

log1

0(m

agni

tudo

) (dB

)

Gambar 2.11 Sinyal di domain frekuensi

2.5.6 Inverse Fast Fourier Transform (IFFT)

Inverse Fast Fourier Transform merupakan kebalikan dari algoritma Fast Fourier Transform yaitu suatu algoritma untuk mengubah sinyalsuara dari doamin frekuensi menjadi domain waktu. Cepstrum atau cepstral coefficient juga dapat digambarkan sebagai IFFT dari spektrum amplitudo logaritma short-time. Istilah cepstrum meliputi kebalikan dari bentuk spectrum. Independent parameter untuk cepstrum disebut dengan quefrency dimana quefrency merupakan kebalikan dari kata frequency. Sejak cepstrum merupakan inverse dari FFT yaitu berupa fungsi domain frekuensi, quefrency menjadi parameter dalam

21

domain waktu. Feature khusus dari cepstrum yaitu berupa struktur dan selubung spectral.

2.5.7 Liftering Pada proses ini mengambil 16 buah data yang dapat mewakili seluruh data. 16 buah data inilah yang nantinya dipakai sebagai fitur yang dapat mempresentasikan masing – masing frame. 2.5.8 Awal dan Akhir Sinyal Suara 2.5.8.1 Power

Sinyal suara yang diolah haruslah merupakan sinyal suara murni dan tidak bercampur dengan noise ataupun header tail yang dibawa oleh suara saat perekaman. Oleh karena itu sinyal suara hasil perekaman harus dicari nilai awal dan akhirnya agar pengolahan sinyal suara tersebut menjadi lebih valid.

Dan salah satu cara dalam menentukan nilai awal dan akhir dari sinyal suara adalah dengan menggunakan power yang mempunyai persamaan sebagai berikut :

∑=

=239

0

2

iixp (2.10)

2.5.8.2 Front-End Detection

Pada proyek akhir ini, front-end detection digunakan untuk menentukan letak nilai awal dan akhir dari voiced yang sesungguhnya.

Parameter yang digunakan untuk menetukan awal dan akhir dari voiced adalah nilai dari standart deviasi dan mean, dimana sinyal suara yang dibagi menjadi beberapa frame mempunyai power dari tiap framenya yang kemudian didapatkan nilai rata-ratanya yang kemudian diperoleh nilai awal dan akhirnya dengan menambahkan standar deviasi. Dimana penentuan awal dan akhir dari sinyal suara dapat diperoleh dengan :

voice > mean + standart deviasi (2.11)

22

BAB III PERENCANAAN DAN PEMBUATAN

3.1 Pendahuluan

Dalam bab ini akan dibahas tentang pengolahan sinyal suara untuk mendapatkan ciri atau parameter dari suara yang masuk. Selain itu juga membahas tentang pengolahan sinyal suara tersebut yang

23

digunakan untuk sistem absensi dan instalasi software pada proyek akhir ini menggunakan snack 2.2.2 dan tcl/tk 8.3.0 serta cara membuat file ekstensi (.dll) dalam bahasa pemrograman C++. 3.2 Sistem Pengolahan Sinyal Suara

Dibawah ini adalah gambar blok sistem yang akan dibuat dapat ditunjukkan seperti gambar dibawah ini.

Microphone PC Speaker

Sinyal Suara

Gambar 3.1 Sistem secara keseluruhan

Dari gambar diatas blok diagram pengolahan sinyal suara untuk

sistem pengambilan keputusan seperti di bawah ini :

24

Gambar 3.2 Blok Diagram Sistem Keseluruhan

3.2.1 Perekaman Suara

Proses perekaman suara dilakukan dengan menggunakan software buatan sendiri yang berbasis pada Tcl/tk dan Snack. Dengan menggunakan Tcl/tk dapat dibuat tampilan software dimana lingkupnya seperti membuat button, canvas,entry,radio button,check button dan banyak lagi, sedangkan Snack digunakan untuk memproses sinyal suara. Snack memiliki perintah-perintah untuk play, record, process dan memvisualisasi suara. Listing program yang berbasis Tcl/Tk 8.3.0 dan Snack2.2 dibuat pada notepad kemudian disimpan dalam file berekstensi”.tcl”. Dibawah ini perintah-perintah yang digunakan untuk perekaman suara :

1. Perintah pembuatan tombol-tombol tampilan awal pack [frame .f] button .f.exit -text Exit -command exit button .f.reset -text "Start" -command Start button .f.running -text Testing -command {Run testing.tcl} -state disabled button .f.recording -text Recording -command {Run recording.tcl} -state disabled pack .f.running .f.recording .f.reset .f.exit -side left -padx 5 -pady 10

25

2. Perintah pembuatan tombol-tombol untuk perekaman button .a3.b1 -text Play -command {y play} button .a3.b2 -text Record -command {y record;z record} button .a3.b3 -text Stop -command {y stop;z stop;y input;y database} button .a3.b4 -text Save -command {y write data_wav\\$filename.wav;y input;y database} button .a3.b5 -text Load -command {y read data_wav\\$filename.wav;y input;y database} button .a3.b6 -text Exit -command exit entry .a3.entry -textvariable filename pack .a3.b1 .a3.b2 .a3.b3 .a3.entry .a3.b4 .a3.b5 .a3.b6 -side left -padx 5 -pady 10

Didalam proyek akhir ini akan dibuat aplikasi seperti pada

gambar 3.3 Dimana aplikasi ini merupakan gabungan atau integrasi dari Tcl/tk dan snack.

26

Gambar 3.3 Tampilan Software integrasi dari Snack Dan Tcl/tk

Pada program diatas, frekuensi sampling di set pada 12 kHz.

Frekuensi sampling ini dipilih karena biasa digunakan untuk voice. Selain itu juga diset pada channel Mono dan sinyal encoding LIN16 (resolusi 16 bit PCM). Hasil perekeman disimpan dalam sebuah file berekstensi “.wav”. Pada penekanan tombol recording, perekaman digunakan untuk membuat file standar untuk kelima perintah yang akan digunakan sebagai pembanding untuk sinyal masukan. Pada penekanan tombol running, perekaman digunakan untuk memproses langsung sinyal, dan selanjutnya dibandingkan dengan data-data standar dari proses recording sebelumnya.

27

Adapun proses untuk sistem yang akan dibuat dapat digambarkan dengan diagram alir sebagai berikut :

Gambar 3.4 Flowchart Sistem Graphical User Interface

3.2.2 Sampling

Frekuensi sampling yang digunakan adalah sebesar 12000 Hz, dimana dalam 1 detik sinyal tersebut terdapat 12000 titik sampling dengan cara mengesetnya pada program Tcl/Tk 8.3.0 dan Snack2.2. Kemudian untuk mendapatkan data sampel dari suara yang direkam dan disimpan dalam file berekstensi “.wav” maka dibuat program berbasis C++ yang diintegrasikan dengan Tcl/Tk 8.3.0 dan Snack2.2.

1. Program untuk mendapatkan sampel pada C++

28

sound=Snack_GetSound(interp,Tcl_GetStringFromObj(objv[0, NULL));

signal_length = Snack_GetLength(sound); for (k=0;k<signal_length;k++) { x[k] = (float)Snack_GetSample(sound,0,k); fprintf(fsignal,"%f\n",x[k]); }

2. Program Tcl/tk 8.3.0 untuk memanggil data sampel dari C++

button .a3.b5 -text Load -command {y read data_wav\\$filename.wav;y input }

Contoh pada gambar dibawah ini, mempunyai sinyal sepanjang

20 ms kemudian disampling dengan frekuensi sampling sebesar 12000 Hz, akan menghasilkan titik sampling sebanyak 240 titik.

Data Sampling

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah Data

Ampl

itudo

Gambar 3.5 sinyal hasil sampling kata “indah” (I frame)

Berikut merupakan flowchart dari proses sampling :

29

Gambar 3.6 Flowchart dari proses sampling

3.2.3 Frame Blocking

Hasil perekaman merupakan sinyal dalam domain waktu yang bersifat variant time, yaitu suatu fungsi yang bergantung waktu. Sinyal tersebut kemudian dibagi menjadi beberapa frame, dengan jumlah

30

sampel per frame sebesar N dan adjacent frame sebesar M sampel, dimana M=0.5N. Dengan begitu dapat memudahkan perhitungan dan analisa suara. Jumlah sampel dalam satu frame tergantung tiap berapa detik suara akan disampel dan berapa besar frekuensi samplingnya.

Dalam proyek akhir ini penulis mengambil sampel tiap 20 ms dengan frekuensi sampling sebesar 12000 Hz. Ini berarti tiap satu frame terdiri dari 240 sampel dengan perhitungan sebagai berikut :

Fs=12 000 Hz berarti 12 000 sampel tiap 1 detik Disampling tiap 20 ms = 0.002 detik Jumlah sampel tiap frame = (12 000 x 0.002 ) / 1 = 240 sampel

Gambar 3.7 Frame blocking sinyal

Jadi pada satu frame terdapat sebagian nilai yang bernilai sama dengan frame selanjutnya, atau dengan kata lain pada proyek akhir ini 120 sample terakhir sama dengan 120 sample pertama pada frame selanjutnya. Berikut adalah program C++ untuk proses frame blocking : start=0; for(frame=0;frame<frame_no-1;frame++) { start=(frame)*120; for(k=0;k<240;k++)

M M

N

31

{ temp[k]=y[start]; fprintf(fsignalframe,"%f\n",temp[k]); start++; } } Proses frame blocking dapat dilihat dari flowchart berikut ini :

Gambar 3.8 Flowchart dari proses frame blocking 3.2.4 Windowing

Windowing yang digunakan pada proyek akhir ini adalah window hamming. Digunakan windowing ini karena mempunyai hasil yang lebih baik dalam pembatasan sinyal yang akan dianalisa. Setelah proses pengambilan sampel maka langkah selanjutnya adalah proses windowing yang berfungsi untuk mengurangi efek diskontinyuitas pada ujung-ujung frame yang di hasilkan oleh potongan – potongan sinyal.

32

Persamaan dari window hamming adalah sebagai berikut :

))240/)1(14159265.30.2cos(46.054.0(][][ −∗∗∗−∗= iixiy (3.1)

Berikut merupakan program C++ untuk windowing : void hammr(x,y,n) float *x,*y; int n; {

int i; --x; --y; for(i=0;i<=n;++i) { y[i]=x[i]*(float)(0.54-0.46*cos(2.0*3.14159265*(i)/(float)n))

} }

Berikut ini merupakan flowchart dari proses windowing :

33

Gambar 3.9 Flowchart dari proses windowing

3.2.5 Fast Fourier Transform

Fast Transformasi fourier (FFT) adalah suatu metode yang sangat efisien untuk menyelesaikan transformasi fourier diskrit (DFT) yang banyak dipakai untuk keperluan analisa sinyal. Sehingga dengan DFT sinyal yang disampling dalam domain waktu akan ditransformasikan ke domain frekuensi agar efesiensi suatu algoritma dapat ditentukan dan sejauh mana dapat mereduksi jumlah perkalian dan penjmlahan serta mereduksi lalu lintas data pada memori komputer sehingga prosesnya jauh lebih cepat.

34

Adapun untuk proses tersebut menggunakan persamaan sebagai berikut :

∑−

=

−=1

0

/2)()(N

n

NnkjenhkH π (3.2)

dengan k = 0,1,2,….,N-1 Berikut merupakan program C++ untuk FFT (Fast Fourier Transform) : void cal_fft(x,y,l,mode) float *x,*y,mode; int l; { int np,lmx,lo,lix,lm,li,j1,j2,nv2,npm1,i,j,k; float scl,arg,c,s,t1,t2; for(i=0;i<pow(2,l);i++) y[i]=0; --x; --y; /* ====== radix-2 fft ====== */ np=(int)pow(2.0,(float)(l)); lmx=np; scl=(float)(6.283185303/(float)np); for(lo=1;lo<=l;++lo) { lix=lmx; lmx=(int)(lmx/2.0); arg=0.0; for(lm=1;lm<=lmx;++lm) {

35

c=(float)cos(arg); s=(float)(mode*sin(arg)); arg=arg+scl; for (li=lix; lix<0 ? li>=np : li<=np; li+=lix) { j1=li-lix+lm; j2=j1+lmx; t1=x[j1]-x[j2]; t2=y[j1]-y[j2]; x[j1]=x[j1]+x[j2]; y[j1]=y[j1]+y[j2]; x[j2]=c*t1+s*t2; y[j2]=c*t2-s*t1; } } scl=(float)(2.0*scl); } /* ====== bit reversal ====== */ j=1; nv2=(int)(np/2.0); npm1=np-1; for(i=1;i<=npm1;++i) { if(i>=j) goto L30; t1=x[j]; t2=y[j]; x[j]=x[i]; y[j]=y[i]; x[i]=t1; y[i]=t2; L30: k=nv2; L40:

36

if(k>=j) goto L50; j-=k; k=(int)(k/2.0); goto L40; L50: j=j+k; } }

Berikut ini merupakan flowchart dari proses FFT (Fast Fourier Transform) :

37

Gambar 3.10 Flowchart dari proses FFT

3.2.6 Invers FFT

38

Invers Fourier Transform adalah kebalikan dari algoritma fourier transform yaitu algoritma untuk mengubah sinyal suara dari domain frekuensi menjadi domain waktu. 3.2.7 Liftering

Pada proses ini mengambil 16 buah data yang dapat mewakili seluruh data. 16 buah data inilah yang nantinya dipakai sebagai fitur yang dapat mempresentasikan masing – masing frame. Untuk membuktikan 16 buah data ini dapat mewakili keseluruhan data, dapat dilakukan proses fourier transform sekali lagi.

Berikut merupakan program C++ untuk proses Liftering : for(k=16;k<512-16;k++) {

real[k]=0.0; imag[k]=0.0; }

for(k=0;k<256;k++)

fprintf(flift,"%f\t%f\n",k*6000.f/256.f,real[k]);

Berikut merupakan flowchart dari proses liftering :

39

Gambar 3.11 Flowchart dari proses Liftering

3.2.8 Mutlak Log (Data Sample yg diambil)

40

Dari 16 data liftering menghasilkan nilai real dan imajiner. Untuk proses selanjutnya kita membutuhkan nilai real saja, karena itu diperlukan proses mutlak log.

Berikut merupakan program C++ untuk proses Liftering : for(k=0;k<16;k++) {

temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(flog,"%f\n",real[k]); }

Berikut merupakan flowchart dari proses mutlak log :

41

Gambar 3.12 Flowchart dari proses Mutlak Log

3.2.9 FFT Spectrum

42

Untuk mendapatkan spectrum dari sinyal suara yang diolah, maka setelah proses IFFT dapat dilakukan proses FFT lagi dengan nilai orde sebesar 256. Dan berikut merupakan program C++ untuk mrndapatkan spectrum dari sinyal suara yang diolah :

orde=256; cal_fft(real,imag,beki,inv); for(k=0;k<256;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0;

fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]); }

Berikut merupakan flowchart dari proses pengambilan spectrum :

43

Gambar 3.13 Flowchart dari proses pengambilan spectrum

3.2.10 FFT Cepstrum

44

Pada proses liftering dilakukan pengambilan 16 data dari 256 data yang ada, dimana 16 data itu dapat digunakan sebagai fitur untuk merepresentasikan masing-masing frame. Untuk membuktikan 16 buah data ini dapat mewakili keseluruhan data, setelah proses liftering dapat dilakukan proses FFT sekali. Berikut merupakan program C++ unuk mendapatkan cepstrum dari sinyal suara yang diolah : orde=256; for(k=orde;k<512-orde;k++) { real[k]=0.0; imag[k]=0.0; } cal_fft(real,imag,beki,inv); for(k=0;k<512;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]); } Berikut merupakan flowchart dari proses pengambilan cepstrum :

45

Gambar 3.14 Flowchart dari proses pengambilan cepstrum

3.3 Awal Dan Akhir Suatu Sinyal 3.3.1 Power

46

Untuk mendapatkan suatu sinyal suara tanpa adanya noise maka sinyal harus benar-benar dipotong tepat pada awal dan akhir suatu sinyal pada setiap frame. Oleh karena itu dipakai power sebagai salah satu cara yang efektif dalam menentukan awal dan akhir suatu sinyal suara.

Dimana tiap frame mempunyai power yang merupakan hasil kuadratisasi dari penyampelan tiap frame yang kemudian hasil keseluruhan diakar, seperti yang terlihat pada diagram alir berikut ini :

Gambar 3.15 Flowchart proses power

BAB IV PENGUJIAN DAN ANALISA

47

4.1 Pendahuluan Dalam bab ini akan menjelaskan tentang pengujian dan analisa

terhadap cara kerja software yang telah dibuat. Dengan demikian kita dapat mengetahui tentang keberhasilan dan kekurangan yang ada pada sistem atau software yang telah dibuat dalam proyek akhir ini. Pengujian yang akan dilakukan meliputi hal-hal berikut :

1. Pengujian dan analisa sistem pengolahan sinyal suara. 2. Pengujian dan analisa hasil pengolahan sinyal suara yang

kemudian masuk pada database.

4.2 Pengujian Dan Analisa Sistem Pengolahan Sinyal Suara Tujuan dilakukan pengujian dan analisa untuk sistem pengolahan

sinyal suara adalah untuk mendapatkan ciri atau parameter dari sinyal suara tersebut. Dimana pada sistem pegolahan sinyal suara tersebut dibagi dalam beberapa tahap. Adapun tahap pengolahan sinyal suara sebagai berikut : perekaman suara, sampling, frame blocking, windowing, FFT (Fast Fourier Transform), IFFT, Liftering, dan FFT Cepstrum.

4.2.1 Perekaman Suara

Pada proyek akhir ini, digunakan dua macam perangkat lunak yaitu perangkat lunak yang dibangun sendiri dengan berbasis pada Tcl/Tk 8.3.0 dan Snack 2.2 sebagai perangkat lunak yang diuji dan perangkat lunak Wavesurfer sebagai pembanding.

4.2.1.1 Dengan menggunakan Snack dan Tcl/Tk

Pada proses perekaman digunakan software perekaman suara yang telah dibuat dengan berbasiskan pada Snack dan Tcl/Tk dapat dilihat pada gambar berikut :

48

Gambar 4.1 Tampilan awal perangkat lunak menggunakan Tcl/Tk dan Snack

Pada gambar diatas ada 4 (empat) fungsi tombol, dimana fungsi

tombol tersebut memiliki fungsi yang berbeda yaitu : 1. Tombol Start berfungsi untuk mengaktifkan tombol

“Recording” dan tombol “Testing”. 2. Tombol Recording berfungsi untuk menampilkan tampilan

mode perekaman.. 3. Tombol Testing berfungsi untuk menampilkan tampilan mode

pengujian. 4. Tombol Exit berfungsi untuk keluar dari tampilan sistem

absensi.

49

Gambar 4.2 Tampilan Software untuk Mode Perekaman

Pada gambar diatas ada 7 (tujuh) fungsi tombol, dimana fungsi tombol tersebut memiliki fungsi yang berbeda yaitu :

1. Tombol Play berfungsi untuk menyuarakan hasil suara yang telah terekam oleh software

2. Tombol Record berfungsi untuk merekam suara yang diinputkan oleh penyuara melalui Microphone.

3. Tombol Stop berfungsi untuk menghentikan proses perekaman 4. Tombol Save berfungsi untuk menyimpan hasil perekaman

suara Catatan : pada saat sebelum menekan tombol save terlebih dahulu harus mengisi nama file suara pada kotak entry.

5. Tombol Load berfungsi untuk memanggil suara yang sudah direkam dan disimpan. Catatan : sebelum menekan tombol load masukkan dulu nama file suara pada kotak entry.

50

6. Tombol Database berfungsi untuk menampilkan tampilan database

7. Tombol Exit berfungsi untuk keluar dari mode perekaman.

Gambar 4.3 Tampilan Software untuk Mode Pengujian

Pada gambar diatas ada 5 (lima) fungsi tombol, dimana fungsi

tombol tersebut memiliki fungsi yang berbeda yaitu : 1. Tombol Play berfungsi untuk menyuarakan hasil suara yang

telah terekam oleh software 2. Tombol Record berfungsi untuk merekam suara yang

diinputkan oleh penyuara melalui Microphone.

51

3. Tombol Stop berfungsi untuk menghentikan proses perekaman 4. Tombol Reset berfungsi untuk kembali dalam keadaan semula. 5. Tombol Exit berfungsi untuk keluar dari mode pengujian.

Gambar 4.4 Tampilan Software untuk Database

52

Gambar 4.5 Perekaman kata “Indah” pada Mode Perekaman

Jika tombol Record ditekan maka program akan merekam suatu kata contoh kata “indah”. Pada tampilan canvas dari Mode Perekaman akan secara otomatis akan menggambarkan bentuj sinyal suara yang telah direkam tersebut. Hasil dari proses perekaman kata “indah” dapat kita lihat pada gambar 4.5. 4.2.1.2 Dengan menggunakan Wavesurfur

Pada saat tombol recording ditekan, maka program akan merekam kata “indah”, dan pada tampilan display akan digambarkan bentuk sinyal yang dihasilkan secara otomatis. Hasil perekaman dapat dilihat pada gambar berikut.

53

Gambar 4.6 Tampilan hasil perekaman kata “indah” dengan perangkat lunak menggunakan Wavesurfer

Perekaman pada Wavesurfer dapat di-set sesuai dengan

kebutuhan. Dimana pada sistem pengolahan sinyal suara untuk perekaman suara di-set sebagai berikut :

Gambar 4.7 Kotak dialog setting perekaman perangkat lunak Wavesurfer

54

Pada data diatas dapat dilihat bahwa suara yang direkam dengan menggunakan perangkat lunak Wavesurfer mempunyai header dan tail yang berisi keterangan perekaman yaitu :

♦ 12000 : menunjukkan frekuensi sampling yang digunakan. ♦ Channels : 1, menunjukkan bahwa suara direkam dengan

menggunakan channel mono. ♦ Sample Encoding : Lin16, menunjukkan bahwa suara direkam

dengan menggunakan 16 bit PCM. 4.2.2 Proses Sampling

Dengan menggunakan program yang telah dibuat seperti pada tampilan pada gambar 4.5, proses penyamplingan sinyal standart menggunakan frekuensi sampling sebesar 12000 Hz yang didapatkan nilai amplitudo dari sinyal kata “indah” dengan potongan sebagai berikut :

Sampel ke Amplitudo1 23802 20133 17694 19655 20966 20147 12248 12199 1170

10 73511 29212 -3013 -4214 -24715 -56316 -69417 -642

55

18 -61819 -50420 -598

……… ……..

Data Sampling

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah Data

Am

plitu

do

Gambar 4.8 Hasil Sampling kata “indah” pada frame ke-1

Dengan frekuensi sampling sebesar 12000 Hz, maka didapatkan

bentuk sinyal yang hampir mirip dengan sinyal analognya, karena sinyal suara manusia memiliki jarak frekuensi antara 300 sampai 5000 Hz, dimana syarat Nyquist minimal fsampling ≥ 2 x fsinyal telah terpenuhi. 4.2.3 Proses Windowing

Sinyal diproses windowing untuk mengurangi efek diskontinuitas ketika sinyal ditransformasikan ke domain frekuensi. Windowing yang dipakai pada proyek akhir ini yaitu jenis windowing hamming. Proses windowing dilakukan tiap-tiap subband yang terdiri 240 data sample dan digeser setiap setengah subband yaitu 120 sample. Karena adanya pergeseran inilah kemungkinan puncak-puncak yang mestinya terambil menjadi terpotong dapat terjadi. Selain itu nantinya akan memudahkan perhitungan dalam mengembalikan sinyal ke domain waktu yang dilakukan proses windowing lagi. Berikut adalah nilai amplitudo dari data hasil Windowing untuk kata “indah”.

56

Sampel ke Amplitudo1 190.7752 2 162.309 3 144.0285 4 162.1517 5 175.9285 6 172.526 7 107.3482 8 109.7735 9 108.4705

10 70.32048 11 28.89133 12 -3.07542 13 -4.46817 14 -27.3066 15 -64.7537 16 -83.1198 17 -80.1285 18 -80.4247 19 -68.415 20 -84.6937

……… ……….

57

Data Windowing

-3000

-2000

-1000

0

1000

2000

3000

4000

0 50 100 150 200 250 300

Jumlah DataA

mpl

itudo

Gambar 4.9 Hasil windowing kata “indah” pada frame ke-1

Dari gambar di atas ditunjukkan bahwa proses windowing

menyebabkan sinyal yang disampel lebih halus. Hal ini membuktikan bahwa fungsi dari windowing yaitu untuk mengurangi efek diskontinyuitas sudah benar.

4.2.4 FFT (Fast Fourier Transform)

Pada proses ini sinyal yang sebelumnya berada dalam domain waktu akan dirubah dalam domain frekuensi. Setiap sinyal yang berasal dari alam merupakan sinyal analog yang bila diolah harus dirubah dalam bentuk sinyal digital. Dan pengolahan dalam digital merupakan pengolahan dalam bentuk diskrit. Pada proyek akhir ini sinyal dalam domain waktu akan dirubah dalam domain frekuensi dengan 512 titik. Karena hasil yang diperoleh berupa hasil dari fungsi konvolusi maka hanya akan diambil 256 titik saja yang akan diolah dalam proses selanjutnya. Sedangkan 256 sisanya tidak dipergunakan karena berupa pencerminan saja. Hasil dari Fast Fourier Transform (FFT) dari kata “indah” dapat kita lihat pada data dibawah ini :

Frekuensi Magnitudo0 10.13406

23.4375 10.00343246.875 9.625627

58

70.3125 9.04468993.75 8.528451

117.1875 8.997069140.625 9.305222

164.0625 9.369651187.5 9.325483

210.9375 9.293427234.375 9.322831

257.8125 9.407032281.25 9.429989

304.6875 9.248124328.125 8.824898

351.5625 8.694233375 9.158479

398.4375 9.562833421.875 9.679983……….. …………

4.2.4.1 Dengan menggunakan Snack dan Tcl/Tk

Fast Fourier Transform Sinyal Masukan

0

2

4

6

8

10

12

0 2000 4000 6000 8000

Frekuensi (Hz)

10lo

g(m

agni

tudo

) (dB

)

Gambar 4.10 Fast Fourier Transform untuk kata “indah” pada frame ke-1 dengan menggunakan Snack dan Tcl/Tk

59

4.2.4.2 Dengan menggunakan Wavesurfer

Gambar 4.11 Fast Fourier Transform untuk kata “indah” pada frame ke-1 dengan menggunakan Wavesurfer

Dari gambar diatas, hasil Fast Fourier Transform sinyal masukan

menunjukkan sebaran spektrum frekuensi dari sinyal suara yang telah dihasilkan oleh pengucap antara 0 sampai 6000 Hz, yang telah mencakup daerah spektrum frekuensi dari suara manusia yaitu antara 300 sampai 5000 Hz.

4.2.5 Liftering

Pada proses ini mengambil 16 buah data yang dapat mewakili seluruh data. 16 buah data inilah yang nantinya dipakai sebagai fitur yang dapat mempresentasikan masing – masing frame. Berikut merupakan hasil dari liftering dari kata “indah” :

Data ke Nilai Mutlak Log 1 7.10652 2 5.482762 3 3.978367

60

4 1.819694 5 2.146674 6 1.647008 7 3.052993 8 3.054889 9 3.152562 10 1.81403 11 1.661876 12 1.818581 13 2.411279 14 1.843486 15 -1.1223 16 1.106728

Dari hasil diatas dapat dianalisa bahwa besaran-besaran dari data liftering yang telah dilakukan proses mutlak log benar-benar dapat digunakan sebagai penentu ciri dari sinyal suara individu, karena besaran-besaran yang dihasilkan oleh mutlak log dari data liftering dari yang pertama sampai yang terakhir dalam satu frame sangat bervariasi nilainya.

4.2.6 FFT Cepstrum

Pada cepstrum ini merupakan selimut atau selubung dari spectrum FFT, jadi sinyal yang sudah masuk proses liftering kemudian di FFT lagi serta dicari selubung dari FFT tersebut. Dari gambar dibawah ditunjukkan bahwa pengambilan 16 data tersebut dapat mewakili keseluruhan data untuk digunakan sebagai fitur. Berikut merupakan hasil cepstrum dari kata “indah” :

Frekuensi Spectrum Cepstrum0 7.416616 7.420521

23.4375 7.416451 7.41412346.875 7.415955 7.410519

70.3125 7.41513 7.40117993.75 7.413977 7.354482

61

117.1875 7.4125 7.398185140.625 7.410701 7.434025

164.0625 7.408587 7.436045187.5 7.406163 7.423129

210.9375 7.403438 7.414341234.375 7.400421 7.408137

257.8125 7.397125 7.396852281.25 7.393563 7.390301

304.6875 7.389754 7.399877328.125 7.385715 7.414151………. ………. ………..

Hasil Spectrum dan Cepstrum

6.4

6.6

6.8

7

7.2

7.4

7.6

0 2000 4000 6000 8000

Frekuensi (Hz)

log1

0(m

agni

tudo

) (dB

)

CepstrumSpektrum

Gambar 4.12 Hasil Spectrum dan Cepstrum untuk kata “indah” pada frame

ke-1

Dari gambar diatas menunjukkan bahwa cepstrum yang diambil dari 16 data pada proses liftering merupakan selubung dari spectrum. Dan cepstrum tersebut dapat dijadikan fitur dari sinyal suara tersebut kemudian yang akan diolah ke dalam database.

62

BAB V PENUTUP

5.1 Kesimpulan

Berdasarkan pada hasil dari pengujian yang kita lakukan dan analisa yang kita dapatkan, kita dapat mengambil kesimpulan yaitu :

1. Pengaksesan absensi dapat dilakukan dengan memberi perintah melalui suara.

2. Sinyal suara manusia dapat dicari ciri atau parameternya dengan menggunakan metode FFT cepstrum.

3. Pengambilan 16 data awal pada proses liftering dapat mewakili keseluruhan data.

4. FFT cepstrum merupakan selubung dari FFT spectrum. 5.2 Saran

Dari hasil yang telah dicapai pada proyek akhir ini , maka kami mempertimbangkan beberapa saran. Dan adapun tujuan dari saran-saran tersebut untuk perbaikan-perbaikan proyek akhir kami ini dalam hal :

1. Suara masukan yang diucapkan oleh pengucap harus memiliki intonasi yang sama dengan standart yang ada pada database.

2. Pengambilan data untuk membuktikan kebenaran sistem dapat dilakukan secara otomatis.

3. Tampilan dapat lebih baik dengan menambahkan desain-desain yang menarik.

4. Pengurangan noise harus ditingkatkan dengan memperhatikan power dan standart deviasi dari sinyal suara tersebut agar pengambilan awal dan akhir suatu sinyal suara dapat lebih akurat.

5. Perlu dilakukan latihan pengambilan sampel suara tentang jarak efektif antara microphone dengan mulut.

63

DAFTAR PUSTAKA [1] Bima Sena bayu, Titon dutono, Linda indrayanti ,” Aplikasi

Pengenalan wicara untuk perintah nirkabel robot Mikro mouse”,

Proyek Akhir PENS-ITS, 2004.

[2] Kadir Abdul, “Pemrograman Visual C++”, ANDI, Yogyakarta,

2004

[3] Tutorial on Speech Technology,

http://murray.newcastle.edu.au/users/staff/speech/home_pages/tuto

rial.html.

[4] Digital Speech Processing, Synthesis, and Recognition, Sadaoki

Furui, Marcel Dekker, Inc., New York, P.408, 1989.

[5] Fundamentals of Speech Recognition, Lawrence Rabiner Biing –

Hwang Juang, 1993.

[6] Minh N. Do,” Digital Signal Processing Mini-Project (An

Automatic Speaker Recognition System)”, Audio Visual

Communications Laboratory, Swiss Federal Institute of

Technology, Lausanne, Switzerland.

64

LAMPIRAN 1.1 Program Tampilan Awal #!/bin/sh # the next line restarts using wish \ exec wish8.4 "$0" "$@" package require -exact snack 2.2 load lib\\libglobal snack::sound s option add *font {Helvetica 10 bold} pack [label .l1 -text "Aplikasi Pengenalan Wicara Untuk Sistem Absensi "] pack [label .l2 -text "Dengan Metode Dependent Speaker"] pack [label .l3 -text "by"] pack [label .l4 -text "Adi Prayitno & Indah Kurnia Sari"] pack [label .l5 -text ""] pack [frame .f] button .f.exit -text Exit -command exit button .f.reset -text "Start" -command Start button .f.running -text Testing -command {Run testing.tcl} -state disabled button .f.recording -text Recording -command {Run recording.tcl} -state disabled pack .f.running .f.recording .f.reset .f.exit -side left -padx 5 -pady 10 proc Start {} { s reset .f.running configure -state normal .f.recording configure -state normal } proc Run {script {demoFlag 0}} { set i [interp create] load {} Tk $i $i eval rename exit dontexit interp alias $i exit {} interp delete $i

65

if {$demoFlag != 0} { $i eval set demoFlag $demoFlag } $i eval wm title . $script $i eval source $script } 1.2 Program Tampilan Mode Recording #!/bin/sh # the next line restarts using wish \ exec wish8.4 "$0" "$@" # 'info sharedlibext' returns '.dll' on Windows and '.so' on most Unix systems load lib\\libglobal snack::sound z -channels 2 snack::sound x -file sound.wav -debug 0 snack::sound y x configure -rate 12000 -channels MONO -encoding LIN16 y configure -rate 12000 -channels MONO -encoding LIN16 set width 600 set height 200 set pps 300 set color black set frame 1 option add *font {Helvetica 10 bold} pack [frame .a1] pack [frame .a2] pack [frame .a3] pack [frame .a4] pack [label .a1.t1 -text "APLIKASI SPEAKER RECOGNITION UNTUK SISTEM ABSENSI \n DENGAN METODE DEPENDENT SPEAKER"] -pady 10 pack [label .a1.t2 -text "Mode Perekaman"] -pady 10

66

canvas .a1.canvas -bg white -width 300 -height 200 snack::levelMeter .a1.levelMeter -width 20 -length 200 -orient vertical -oncolor blue pack .a1.levelMeter .a1.canvas -side left -padx 5 pack [label .a2.time -text "0.000 sec" -width 10] button .a3.b1 -text Play -command {y play} button .a3.b2 -text Record -command {y record;z record} button .a3.b3 -text Stop -command {y stop;z stop;y input} button .a3.b4 -text Save -command {y write data_wav\\$filename.wav;y input} button .a3.b5 -text Load -command {y read data_wav\\$filename.wav;y input} button .a3.b6 -text Database -command {Run database.tcl} button .a3.b7 -text Exit -command exit entry .a3.entry -textvariable filename pack .a3.b1 .a3.b2 .a3.b3 .a3.entry .a3.b4 .a3.b5 .a3.b6 .a3.b7 -side left -padx 5 -pady 10 label .a4.1 -text "Create by Adi & Indah" label .a4.2 -text "Telecommunication Engineering" pack .a4.1 .a4.2 after 1 Update proc Update {} { set l [z max -start 0 -end -1 -channel 0] .a2.time config -text [format "%.3f sec" [y length -unit seconds]] z length 0 .a1.levelMeter configure -level $l after 50 Update } proc Run {script {demoFlag 0}} { set i [interp create] load {} Tk $i $i eval rename exit dontexit interp alias $i exit {} interp delete $i if {$demoFlag != 0} {

67

$i eval set demoFlag $demoFlag } $i eval wm title . $script $i eval source $script } .a1.canvas itemconf wave -pixelspersecond 300 -width 300 .a1.canvas create waveform 152 102 -anchor c -sound y -height $height -tags wave -debug 0 -zerolevel 0 -frame $frame -fill black 1.3 Program Tampilan Mode Testing #!/bin/sh # the next line restarts using wish \ exec wish8.4 "$0" "$@" # 'info sharedlibext' returns '.dll' on Windows and '.so' on most Unix systems load lib\\libglobal snack::sound u snack::sound v snack::sound w snack::sound x snack::sound z -channels 2 u configure -rate 12000 -channels MONO -encoding LIN16 set width 600 set height 200 set pps 300 set color black set frame 1 option add *font {Helvetica 10 bold} pack [frame .a1] pack [frame .a2] pack [frame .a3] pack [frame .a4]

68

pack [label .a1.t1 -text "APLIKASI SPEAKER RECOGNITION UNTUK SISTEM ABSENSI \n DENGAN METODE DEPENDENT SPEAKER"] -pady 10 pack [label .a1.t2 -text "Mode Pengujian"] -pady 10 canvas .a1.canvas -bg white -width 300 -height 200 snack::levelMeter .a1.levelMeter -width 20 -length 200 -orient vertical -oncolor blue pack .a1.levelMeter .a1.canvas -side left -padx 5 pack [label .a2.time -text "0.000 sec" -width 10] button .a3.b1 -text Play -command {u play} button .a3.b2 -text Record -command {u record;z record} button .a3.b3 -text Stop -command {u stop;u input;u dtw;w length 1000;w signal;w play;z stop;Announce} button .a3.b4 -text Reset -command {u reset;Announce} button .a3.b5 -text Exit -command exit pack .a3.b1 .a3.b2 .a3.b3 .a3.b4 .a3.b5 -side left -padx 5 -pady 10 pack [label .a4.l -text "Ready..." -pady 10] after 1 Update proc Update {} { set l [z max -start 0 -end -1 -channel 0] .a2.time config -text [format "%.3f sec" [u length -unit seconds]] z length 0 .a1.levelMeter configure -level $l after 50 Update } proc Announce {} { set data [read [open data\\hasil\\out.txt]] set data1 [read [open data\\hasil\\threshold.txt]] if { $data1 >= 1.5 } { x read data_wav\\absen_ditolak.wav .a4.l configure -text "Kata Yang Anda Inputkan Tidak Sesuai Dengan Database"

69

x play } else { if { $data == 0 } { .a4.l configure -text "Silahkan Masukkan ID Anda." } if { $data == 1 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Indah" x play } if { $data == 2 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Ifa" x play } if { $data == 3 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Fitri" x play } if { $data == 4 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Teguh" x play } if { $data == 5 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Rahma" x play } if { $data == 6 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Bitha" x play } if { $data == 7 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Bibib" x play }

70

if { $data == 8 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Vandry" x play } if { $data == 9 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Taufik" x play } if { $data == 10 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Dina" x play } if { $data == 11 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Winda" x play } if { $data == 12 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Retno" x play } if { $data == 13 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Adi" x play } if { $data == 14 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Nilluh" x play } if { $data == 15 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Bagus" x play }

71

if { $data == 16 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Wuri" x play } if { $data == 17 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Auriza" x play } if { $data == 18 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Ali" x play } if { $data == 19 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Rudy" x play } if { $data == 20 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Teti" x play } if { $data == 21 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Muhsin" x play } if { $data == 22 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Yugo" x play } if { $data == 23 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Imam" x play }

72

if { $data == 24 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Fatur" x play } if { $data == 25 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Zulfan" x play } if { $data == 26 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Puthut" x play } if { $data == 27 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Sari" x play } if { $data == 28 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Aulia" x play } if { $data == 29 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Ruri" x play } if { $data == 30 } { x read data_wav\\absen_diterima.wav .a4.l configure -text "Hai Auruma" x play } } } .a1.canvas itemconf wave -pixelspersecond 300 -width 300

73

.a1.canvas create waveform 152 102 -anchor c -sound u -height $height -tags wave -debug 0 -zerolevel 0 -frame $frame -fill black 1.4 Program Pengolahan Sinyal Suara Dengan Menggunakan

Microsoft Visual C++ 6.0 #include <math.h> #include <windows.h> #include <stdio.h> #include <string.h> #include "snack.h" #define beki 9 #define nlpc 240 #define inv 1.0f #define inv2 -1.0f static unsigned int dist_I[300]; static unsigned int dist_J[300]; static unsigned int st_cs[10],st_ce[10],in_cs[10],in_ce[10]; static float G[300][300]; static float st_CEP[300][16]; static float in_CEP[300][16]; static float out_pow_in[5000],out_pow_1[5000]; static int st_blk,in_blk; float DP_match1(int); float distance(int,int); void trace(); int Signal(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Sound *sound; int i; sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for(i=0;i<Snack_GetLength(sound);i++)

74

{ if((i/10)%2) { Snack_SetSample(sound,0,i,10000); } else { Snack_SetSample(sound,0,i,-10000); } } return TCL_OK; } int Reset(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *freset,*freset1; freset=fopen("data\\hasil\\out.txt","w"); fprintf(freset,"%d\n",0); freset1=fopen("data\\hasil\\threshold.txt","w"); fprintf(freset1,"%d\n",0); fclose(freset); fclose(freset1); return TCL_OK; } int front_end_clip(xx,yy,jml_sin) float *xx,*yy; int jml_sin; { int i,mulai,akhir,jml_sin_new; float jml=0,mean,dev,jumdev=0,sd,batas; for(i=0;i<jml_sin;i++) jml+=xx[i];

75

mean=jml/jml_sin; for(i=0;i<jml_sin;i++) { dev=(float)fabs(xx[i]-mean); jumdev+=dev*dev; } sd=(float)sqrt(jumdev/jml_sin); batas=mean+sd; for(i=0;i<jml_sin;i++) { if(xx[i]>=batas) { mulai=i; break; } } for(i=jml_sin;i>0;i--) { if(xx[i]>=batas) { akhir=i; break; } } jml_sin_new=0; for(i=mulai;i<akhir;i++) { yy[jml_sin_new]=xx[i]; jml_sin_new++; } return(jml_sin_new); } float Power(data) float *data;

76

{ int i; float jum=0,power; for(i=0;i<240;i++) jum += (float)pow(data[i],2); power=(float)sqrt(jum); return(power); } FILE *fsignal,*finfo,*fframe,*fsignalframe,*fpower,*fhamm,*ffft,*flift,*flog,*fceps; Sound *sound; double temp_log1; float x[30000],y[30000],temp[30000]; float real[512],imag[512]; float ms,spd; int k,frame,frame_no,signal_length,signal_length_new,start; void hammr(); void cal_fft(); int Input(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { fsignal=fopen("data\\input\\sinyal_in.txt","w"); finfo=fopen("data\\input\\info_in.txt","w"); fframe=fopen("data\\input\\frame_in.txt","w"); fsignalframe=fopen("data\\input\\signalframe_in.txt","w"); fpower=fopen("data\\input\\power.txt","w"); fhamm=fopen("data\\input\\hamm_in.txt","w"); ffft=fopen("data\\input\\fft_in.txt","w"); flift=fopen("data\\input\\lift_in.txt","w"); flog=fopen("data\\input\\log_in.txt","w"); fceps=fopen("data\\input\\ceps_in.txt","w"); /****** Get the sound structure for this sound ******/

77

sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); signal_length = Snack_GetLength(sound); for (k=0;k<signal_length;k++) { x[k]=(float)Snack_GetSample(sound, 0, k); fprintf(fsignal,"%f\n",x[k]); } signal_length_new = front_end_clip(x,&y,signal_length); for (k=0;k<signal_length_new;k++) fprintf(finfo,"%f\n",y[k]); frame_no = signal_length_new/120; fprintf(fframe,"%d\n",frame_no); start=0; ms=0; spd=(float)20/240; for(frame=0;frame<frame_no-1;frame++) { start=(frame)*120; for(k=0;k<240;k++) { temp[k]=y[start]; fprintf(fsignalframe,"%f\n",temp[k]); start++; } out_pow_in[frame]=Power(temp); fprintf(fpower,"%f\n",out_pow_in[frame]); for (k=0;k<240;k++) { real[k]=temp[k]; imag[k]=0;

78

} /***** hamming window *****/ hammr(real,imag,nlpc); for(k=0;k<240;k++) fprintf(fhamm,"%f\t%f\n",(k+1)*spd,real[k]); for(k=240;k<512;k++) { real[k]=0; imag[k]=0; } /***** FFT *****/ cal_fft(real,imag,beki,inv); /***** Mutlak Log *****/ for(k=0;k<512;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]); } /***** IFFT *****/ cal_fft(real,imag,beki,inv2); /***** Liftering *****/

79

for(k=16;k<512-16;k++) { real[k]=0.0; imag[k]=0.0; } for(k=0;k<256;k++) fprintf(flift,"%f\t%f\n",(k+1)*spd,real[k]); /***** Mutlak Log (Data Sample yg diambil) *****/ for(k=0;k<256;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(flog,"%f\t%f\n",(k+1)*spd,real[k]); } /***** Cepstrum *****/ cal_fft(real,imag,beki,inv); for(k=0;k<256;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0;

80

fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]); } } fclose(fsignal); fclose(finfo); fclose(fframe); fclose(fsignalframe); fclose(fpower); fclose(fhamm); fclose(ffft); fclose(flift); fclose(flog); fclose(fceps); return TCL_OK; } FILE *fsignal,*finfo,*fframe,*fsignalframe,*fpower,*fhamm,*ffft,*flift,*flog,*fceps; Sound *sound; double temp_log1; float x[30000],y[30000],temp[30000]; float real[512],imag[512]; float ms,spd; int k,frame,frame_no,signal_length,signal_length_new,start; void hammr(); void cal_fft(); int Database(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { fsignal=fopen("data\\standart\\sinyal_1.txt","w"); finfo=fopen("data\\standart\\info_1.txt","w"); fframe=fopen("data\\standart\\frame_1.txt","w"); fsignalframe=fopen("data\\standart\\signalframe_1.txt","w");

81

fpower=fopen("data\\standart\\power_1.txt","w"); fhamm=fopen("data\\standart\\hamm_1.txt","w"); ffft=fopen("data\\standart\\fft_1.txt","w"); flift=fopen("data\\standart\\lift_1.txt","w"); flog=fopen("data\\standart\\log_1.txt","w"); fceps=fopen("data\\standart\\ceps_1.txt","w"); /****** Get the sound structure for this sound ******/ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); signal_length = Snack_GetLength(sound); for (k=0;k<signal_length;k++) { x[k]=(float)Snack_GetSample(sound, 0, k); fprintf(fsignal,"%f\n",x[k]); } signal_length_new = front_end_clip(x,&y,signal_length); for (k=0;k<signal_length_new;k++) fprintf(finfo,"%f\n",y[k]); frame_no = signal_length_new/120; fprintf(fframe,"%d\n",frame_no); start=0; ms=0; spd=(float)20/240; for(frame=0;frame<frame_no-1;frame++) { start=(frame)*120; for(k=0;k<240;k++) { temp[k]=y[start]; fprintf(fsignalframe,"%f\n",temp[k]); start++; }

82

out_pow_in[frame]=Power(temp); fprintf(fpower,"%f\n",out_pow_in[frame]); for (k=0;k<240;k++) { real[k]=temp[k]; imag[k]=0; } /***** hamming window *****/ hammr(real,imag,nlpc); for(k=0;k<240;k++) fprintf(fhamm,"%f\t%f\n",(k+1)*spd,real[k]); for(k=240;k<512;k++) { real[k]=0; imag[k]=0; } /***** FFT *****/ cal_fft(real,imag,beki,inv); /***** Mutlak Log *****/ for(k=0;k<512;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0;

83

fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]); } /***** IFFT *****/ cal_fft(real,imag,beki,inv2); /***** Liftering *****/ for(k=16;k<512-16;k++) { real[k]=0.0; imag[k]=0.0; } for(k=0;k<256;k++) fprintf(flift,"%f\t%f\n",(k+1)*spd,real[k]); /***** Mutlak Log (Data Sample yg diambil) *****/ for(k=0;k<256;k++) { temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(flog,"%f\t%f\n",(k+1)*spd,real[k]); } /***** Cepstrum *****/ cal_fft(real,imag,beki,inv); for(k=0;k<256;k++) {

84

temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]); if(temp_log1>0) real[k]=(float)log10(temp_log1); else real[k]=(float)log10(0.000001); imag[k]=0; fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]); } } fclose(fsignal); fclose(finfo); fclose(fframe); fclose(fsignalframe); fclose(fpower); fclose(fhamm); fclose(ffft); fclose(flift); fclose(flog); fclose(fceps); return TCL_OK; } int Dtw(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *fin,*fstd1; FILE *fframe,*fout1,*fout2,*fthreshold; int i,j,r; int out; float DP_dist,hasil[31],min,threshold; float in_data,std_data_1; float in_in,in_1;

85

fin=fopen("data\\input\\log_in.txt","r"); fstd1=fopen("data\\standart\\log_1.txt","r"); fout1=fopen("data\\hasil\\out1.txt","a"); fout2=fopen("data\\hasil\\out.txt","w"); fthreshold=fopen("data\\hasil\\threshold.txt","w"); fframe=fopen("data\\input\\frame_in.txt","r"); fscanf(fframe,"%d\n",&in_blk); fclose(fframe); for(i=0;i<in_blk;i++) { for(j=0;j<16;j++) { fscanf(fin,"%f\t%f\n",&in_in,&in_data); in_CEP[i][j]=in_data; } } /***** Menghitung jarak antara sinyal input dan standar Dina *****/ fframe=fopen("data\\standart\\frame_1.txt","r"); fscanf(fframe,"%d\n",&st_blk); fclose(fframe); for(i=0;i<st_blk;i++) { for(j=0;j<16;j++) { fscanf(fstd1,"%f\t%f\n",&in_1,&std_data_1); st_CEP[i][j]=std_data_1; } } r=7; DP_dist=DP_match1(r); hasil[1]=DP_dist;

86

trace(); for(i=1;i<=30;i++) fprintf(fout1,"%f\t",hasil[i]); min=hasil[1]; for(i=1;i<=30;i++) { if(min>=hasil[i]) { min=hasil[i]; out=i; } } threshold=hasil[out]; fprintf(fout2,"%d\n",out); fprintf(fthreshold,"%f\n",hasil[out]); fclose(fin); fclose(fstd1); fclose(fout1); fclose(fout2); fclose(fthreshold); return TCL_OK; } /* Initialize the square package and create a new sound command 'global'. The syntax is: sndName global */ EXPORT(int, Global_Init)(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif

87

#ifdef USE_SNACK_STUBS if (Snack_InitStubs(interp, "2", 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgProvide(interp, "global", "1.0") != TCL_OK) { return TCL_ERROR; } Snack_AddSubCmd(SNACK_SOUND_CMD, "signal", (Snack_CmdProc *) Signal, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "reset", (Snack_CmdProc *) Reset, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "input", (Snack_CmdProc *) Input, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "database", (Snack_CmdProc *) Database, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "dtw", (Snack_CmdProc *) Dtw, NULL); return TCL_OK; } EXPORT(int, Global_SafeInit)(Tcl_Interp *interp) { return Global_Init(interp); } #ifdef __cplusplus #endif void hammr(x,y,n) float *x,*y; int n; { int i; --x;

88

--y; for(i=0;i<=n;++i) { x[i]=x[i]*(float)(0.54-0.46*cos(2.0*3.141592654*(i)/(float)n)); y[i]=y[i]*(float)(0.54-0.46*cos(2.0*3.141592654*(i)/(float)n)); } } void cal_fft(x,y,l,mode) float *x,*y,mode; int l; { int np,lmx,lo,lix,lm,li,j1,j2,nv2,npm1,i,j,k; float scl,arg,c,s,t1,t2; for(i=0;i<pow(2,l);i++) y[i]=0; --x; --y; /* ====== radix-2 fft ====== */ np=(int)pow(2.0,(float)(l)); lmx=np; scl=(float)(6.283185303/(float)np); for(lo=1;lo<=l;++lo) { lix=lmx; lmx=(int)(lmx/2.0); arg=0.0; for(lm=1;lm<=lmx;++lm) { c=(float)cos(arg); s=(float)(mode*sin(arg)); arg=arg+scl; for (li=lix; lix<0 ? li>=np : li<=np; li+=lix) {

89

j1=li-lix+lm; j2=j1+lmx; t1=x[j1]-x[j2]; t2=y[j1]-y[j2]; x[j1]=x[j1]+x[j2]; y[j1]=y[j1]+y[j2]; x[j2]=c*t1+s*t2; y[j2]=c*t2-s*t1; } } scl=(float)(2.0*scl); } /* ====== bit reversal ====== */ j=1; nv2=(int)(np/2.0); npm1=np-1; for(i=1;i<=npm1;++i) { if(i>=j) goto L30; t1=x[j]; t2=y[j]; x[j]=x[i]; y[j]=y[i]; x[i]=t1; y[i]=t2; L30: k=nv2; L40: if(k>=j) goto L50; j-=k; k=(int)(k/2.0); goto L40;

90

L50: j=j+k; } } float DP_match1(r) int r; { int i,j; int I,J,up,dp; float dist,g,g0,g1,g2,g3,a; float DP_mdist=0.0; for(i=0;i<in_blk;i++) { for(j=0;j<st_blk;j++) { G[i][j] = (float)1.0e+30; } } I=in_blk-1; J=st_blk-1; a=(float)st_blk/(float)in_blk; dist=distance(0,0); G[0][0]=(float)(2.0*dist); dist=0.0; for(i=0;i<=I;i++) { up=(int)(a*i+r); if(up>J) up=J; dp=(int)(a*i-r); if(dp<0) dp=0; for(j=dp;j<=up;j++) { if(i==0 && j==0)

91

j++; g0=(float)1.0e+30; g1=(float)1.0e+30; g2=(float)1.0e+30; dist = distance(i,j); if(j-1>=0) g0 = (float)(G[i][j-1]+dist); if(i-1>=0 && j-1>=0) g1 = (float)(G[i-1][j-1]+2.0*dist); if(i-1>=0) g2 = (float)(G[i-1][j]+dist); g3 = (g0<g1) ? g0:g1; g = (g2<g3) ? g2:g3; G[i][j] = g; } } DP_mdist = G[I][J]/(st_blk+in_blk); return(DP_mdist); } float distance(ab_t,ab_r) int ab_t,ab_r; { int i; float a,kyori; a=0.0; kyori=0.0; for(i=0;i<16;i++) { a=(in_CEP[ab_t][i]-st_CEP[ab_r][i]); kyori+=a*a; } return(kyori); }

92

void trace() /*WARPING FUNCTION decision (in case dp_match1)*/ { FILE *fjejak,*fsin_warp; FILE *fframe_in,*fframe_1; FILE *fpower,*fpower_1; int i,j,k,l,n,p; int slope_i,slope_i1,slope_j; int jml_in,jml_1; float D0,D1,D2,D3; float dist,distance(); float power_in[5000],power_1[5000]; fjejak=fopen("data\\hasil\\jejak.txt","w"); fframe_in=fopen("data\\input\\frame_in.txt","r"); fframe_1=fopen("data\\standart\\frame_1.txt","r"); fpower=fopen("data\\input\\power.txt","r"); fpower_1=fopen("data\\standart\\power_1.txt","r"); fsin_warp=fopen("data\\hasil\\sin_warp.txt","w"); fscanf(fframe_in,"%d\n",&jml_in); for(l=0;l<jml_in;l++) fscanf(fpower,"%f\n",&power_in[l]); fscanf(fframe_1,"%d\n",&jml_1); for(l=0;l<jml_1;l++) fscanf(fpower_1,"%f\n",&power_1[l]); n=in_blk+st_blk-1; for(p=0;p<n;p++) { dist_I[p]=0; dist_J[p]=0; } i=in_blk-1; j=st_blk-1; dist_I[0]=i; dist_J[0]=j; for(k=1;k<n;k++)

93

{ dist=distance(i,j); D0=(float)1.0e+30; D1=(float)1.0e+30; D2=(float)1.0e+30; D3=(float)1.0e+30; if(i>0) { D0=G[i-1][j]+dist; D3=D0; } if(j>0) { if(i>0) D1=(float)(G[i-1][j-1]+dist*2.0); D2=G[i][j-1]+dist; D3=(D1<D2) ? D1:D2; slope_i1=(D1<D2) ? 1:0; } slope_i=(D3<D0) ? slope_i1:1; slope_j=(D3<D0) ? 1:0; i=i-slope_i; j=j-slope_j; if(i<0 || j<0) break; dist_I[k]=i; /*absis dan ordinat jejak dtw */ dist_J[k]=j; fprintf(fjejak,"%d\t%d\n",dist_I[k],dist_J[k]); fprintf(fsin_warp,"%f\t%f\n",power_in[jml_in - dist_I[k]],power_1[jml_1 - dist_J[k]]); } fclose(fjejak); fclose(fsin_warp); }

94

RIWAYAT HIDUP PENULIS

Nama : Alamat : Hobby : Email : Pendidikan : Telepon :

Indah Kurnia Sari Jl .Wonorejo 2/132 Surabaya Baca, Bowling, Billiard, Berenang, Nonton, Browsing [email protected] - SDN Kedungdoro 6 Surabaya - SLTPN 3 Surabaya - SMUN 2 Surabaya - PENS – ITS Jurusan Teknik

Telekomunikasi - 08563106135 - 03170370885 - (031)7591178

95

96