Anda di halaman 1dari 108

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

i
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
ii
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.

iii
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

iv
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

v
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.

vi
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

vii
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 47
Sinyal Suara
4.2.1 Perekaman Suara 47
4.2.1.1 Dengan Menggunakan Snack dan 47
Tcl/Tk
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 58
Tcl/Tk
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

viii
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 18
Hamming
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 48
Tcl/Tk dan Snack
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 53
wavesurfer
ix
Gambar 4.7 Kotak dialog setting perekaman perangkat lunak 53
wavesurfer
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 58
frame ke-1 dengan menggunakan snack/Tcl/Tk
Gambar 4.11 Fast Fourier Transform untuk kata “indah” pada 59
frame ke-1 dengan menggunakan wavesurfer
Gambar 4.12 Hasil Spectrum dan Cepstrum untuk kata “indah” 61

x
DAFTAR TABEL

Halaman
Tabel 2.1 Sejumlah ekstensi yang dibangkitkan oleh C++ 11

xi
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

xii
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

1
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)

2
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

3
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

4
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

5
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)

6
{
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)

7
{
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
1
load lib\\Get_data
2 3
sound s
s length 10000
4
s Get_data
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

8
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++)

9
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

10
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]

11
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.

12
15000

10000

5000

0
0 50 100 150 200 250 300

-5000

-10000

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)

13
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)

14
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

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

M
M

N
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

0.52 − 0.46 cos[ 2πn /( N − 1)] 0 ≤ n ≤ N −1


Wham(n) =
0 elsewhere

Persamaan (2.3)

♦ Window Hanning

{1 − cos[2πn /( N − 1)]} / 2 0 ≤ n ≤ N −1
Whan(n) =
0 elsewhere

16
Persamaan (2.4)

♦ Window Bartlett

2n /( N − 1) 0 ≤ n ≤ (N −1) / 2
WB(n) = 2 − 2n /( N − 1) (N −1) / 2 ≤ n ≤ N −1
0 elsewhere

Persamaan (2.5)

♦ Window Blackman

0.42− 0.5cos[2πn /(N −1)]+ 0.08cos[4πn /(N −1)] 0 ≤ n ≤ N −1


WBl(n) =
0 elsewhere

Persamaan (2.6)

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

17
4000

3000

2000

Amplitudo
1000

0
0 50 100 150 200 250 300
-1000

-2000

-3000
Jumlah Data

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

4000

3000

2000
Amplitudo

1000

0
0 50 100 150 200 250 300
-1000

-2000

-3000
Jumlah Data

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

18
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 :


− jωt
H = h(t )e dt (2.7)

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


kedalam bentuk diskrit diperoleh transformasi fourier diskrit (DFT)
persamaanya yaitu :
N −1
H (kω 0 ) = ∑ h(nT )e − jkω0 nt (2.8)
n =0

Disederhanakan dengan T=1 sampel waktu N=sample waktu N=sample


frekuensi k sehingga menjadi :

H (k ) = ∑ h(n)e − jkω0 nt (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.

19
4000

3000

2000

Amplitudo
1000

0
0 50 100 150 200 250 300
-1000

-2000

-3000
Jumlah Data

Gambar 2.10 Sinyal di domain waktu

7.6

7.4
log10(magnitudo) (dB)

7.2

6.8

6.6

6.4

6.2
0 1000 2000 3000 4000 5000 6000 7000
Frekuensi (Hz)

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

20
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
p= ∑
i =0
xi 2 (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)

21
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

22
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 :

23
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

24
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.

25
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.

26
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++

27
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

4000
3000
2000
Amplitudo

1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data

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

Berikut merupakan flowchart dari proses sampling :

28
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

29
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

M
M

N
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++)

30
{
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.

31
Persamaan dari window hamming adalah sebagai berikut :

y[i ] = x[i ] ∗ (0.54 − 0.46 ∗ cos(2.0 ∗ 3.14159265 ∗ (i − 1) / 240)) (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 :

32
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.

33
Adapun untuk proses tersebut menggunakan persamaan sebagai
berikut :
N −1
H (k ) = ∑ h( n )e
n =0
− j 2πnk / N
(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)
{

34
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:

35
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) :

36
Gambar 3.10 Flowchart dari proses FFT
3.2.6 Invers FFT

37
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 :

38
Gambar 3.11 Flowchart dari proses Liftering
3.2.8 Mutlak Log (Data Sample yg diambil)

39
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 :

40
Gambar 3.12 Flowchart dari proses Mutlak Log

3.2.9 FFT Spectrum

41
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 :

42
Gambar 3.13 Flowchart dari proses pengambilan spectrum

3.2.10 FFT Cepstrum

43
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 :

44
Gambar 3.14 Flowchart dari proses pengambilan cepstrum
3.3 Awal Dan Akhir Suatu Sinyal
3.3.1 Power

45
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

46
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 :

47
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.

48
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.

49
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.

50
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

51
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.

52
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

53
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 Amplitudo
1 2380
2 2013
3 1769
4 1965
5 2096
6 2014
7 1224
8 1219
9 1170
10 735
11 292
12 -30
13 -42
14 -247
15 -563
16 -694
17 -642

54
18 -618
19 -504
20 -598
……… ……..

Data Sampling

4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data

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”.

55
Sampel ke Amplitudo
1 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
……… ……….

56
Data Windowing

4000
3000
2000

Amplitudo
1000

0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data

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 Magnitudo
0 10.13406
23.4375 10.003432
46.875 9.625627

57
70.3125 9.044689
93.75 8.528451
117.1875 8.997069
140.625 9.305222
164.0625 9.369651
187.5 9.325483
210.9375 9.293427
234.375 9.322831
257.8125 9.407032
281.25 9.429989
304.6875 9.248124
328.125 8.824898
351.5625 8.694233
375 9.158479
398.4375 9.562833
421.875 9.679983
……….. …………

4.2.4.1 Dengan menggunakan Snack dan Tcl/Tk

Fast Fourier Transform Sinyal


Masukan

12
10log(magnitudo) (dB)

10
8
6
4
2
0
0 2000 4000 6000 8000
Frekuensi (Hz)

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

58
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

59
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 Cepstrum


0 7.416616 7.420521
23.4375 7.416451 7.414123
46.875 7.415955 7.410519
70.3125 7.41513 7.401179
93.75 7.413977 7.354482

60
117.1875 7.4125 7.398185
140.625 7.410701 7.434025
164.0625 7.408587 7.436045
187.5 7.406163 7.423129
210.9375 7.403438 7.414341
234.375 7.400421 7.408137
257.8125 7.397125 7.396852
281.25 7.393563 7.390301
304.6875 7.389754 7.399877
328.125 7.385715 7.414151
………. ………. ………..

Hasil Spectrum dan Cepstrum

7.6
log10(magnitudo) (dB)

7.4
7.2
Cepstrum
7
Spektrum
6.8
6.6
6.4
0 2000 4000 6000 8000
Frekuensi (Hz)

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.

61
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.

62
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.

63
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

64
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

65
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} {

66
$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]

67
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"

68
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
}

69
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
}

70
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
}

71
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

72
.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++)

73
{
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];

74
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;

75
{
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 ******/

76
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;

77
}

/***** 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 *****/

78
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;

79
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");

80
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++;
}

81
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;

82
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++)
{

83
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;

84
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;

85
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

86
#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;

87
--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)
{

88
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;

89
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)

90
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);
}

91
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++)

92
{
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);
}

93
RIWAYAT HIDUP PENULIS

Nama : Indah Kurnia Sari


Alamat : Jl .Wonorejo 2/132
Surabaya
Hobby : Baca, Bowling, Billiard, Berenang,
Nonton, Browsing
Email : pink_quin31@yahoo.com
Pendidikan : - SDN Kedungdoro 6 Surabaya
- SLTPN 3 Surabaya
- SMUN 2 Surabaya
- PENS – ITS Jurusan Teknik
Telekomunikasi
Telepon : - 08563106135
- 03170370885
- (031)7591178

94
95
96

Anda mungkin juga menyukai