Anda di halaman 1dari 98

PROYEK AKHIR

APLIKASI PENGENALAN PENUTUR


UNTUK DIAL TELEPON DENGAN METODE
DEPENDENT SPEAKER
(TAHAP PEMBELAJARAN)

Hidayatul Fitriyah
NRP. 7203 030 039

Dosen Pembimbing :

Dr. Ir. Titon Dutono, M.Eng


NIP. 131 651 258

Tri Budi Santoso, ST. MT


NIP. 132 128 464

JURUSAN TEKNIK TELEKOMUNIKASI


POLITEKNIK ELEKTRONIKA NEGERI SURABAYA
S U R A B A Y A 2006
APLIKASI PENGENALAN PENUTUR UNTUK
DIAL TELEPON DENGAN METODE
DEPENDENT SPEAKER
Oleh:
HIDAYATUL FITRIYAH
7203 030 039

Proyek Akhir ini Diajukan 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 Proyek Akhir: Dosen Pembimbing:

1. Ir. Prima Kristalina, MT. 1. Dr. Ir. Titon Dutono, M.Eng


NIP. 131 916 852 NIP. 131 651 258

2. Arifin, ST. MT. 2. Tri Budi Santoso, ST. MT.


NIP. 131 793 754 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

Teknologi speaker recognition telah berkembang sejak tahun 1950-


an. Teknologi ini diilhami oleh keinginan untuk membuat robot yang
dapat berbicara. Dewasa ini setiap orang menginginkan efisiensi dalam
setiap bidang, terutama dalam bidang telekomunikasi. Jadi untuk
mewujudkan keinginan tersebut maka pada proyek akhir ini dibuat
sistem yang diharapkan dapat mengefisiensi waktu dalam bertelepon.
Sistem yang dibuat dalam proyek akhir ini menggunakan teknologi
speaker recognition yang memanfaatkan sinyal suara sebagai kontrol
akses untuk melaksanakan perintah dial telepon.Untuk dapat
melakukannya sinyal suara tersebut harus diolah dengan menggunakan
beberapa parameter yang terkait dengan speaker recognition, antara
lain sampling, frame blocking, windowing, FFT (Fast Fourier
Transform), IFFT (Inverse Fast Fourier Transform), liftering, dan peak
extract.Sedangkan metode yang digunakan adalah dependent speaker
dimana sistem hanya mengenali karakter suara orang tertentu.
Pengolahan suara tersebut menghasilkan suatu fitur yang menjadi
karakter suara dari seseorang dan nantinya akan diintegrasikan dengan
tahap pengujian (testing) sehingga panggilan dapat dilakukan.

Kata kunci : speaker recognition, dependent speaker, sampling,


frame blocking, windowing, FFT (Fast Fourier
Transform), IFFT (Inverse Fast Fourier Transform),
liftering, peak extract.

iii
ABSTRACT

Speaker recognition technology has developed since 1950’. This


technology inspired by the wish to make a talking robot. Recently,
everyone wants an efficiency in every each fields especially in the field
of communication. In order to realize these, this final project try to build
a system that expected an efficiency when we have been calling
someone.
The system that can be built in this final project uses a speaker
recognition technology using voice signal as a control access to compile
phone dial instruction.. But first,the voice signal must be processed uses
some parameters such as sampling, frame blocking, windowing, FFT
(Fast Fourier Transform), IFFT (Inverse Fast Fourier Transform),
liftering, peak extract. While the method that used in the system itself is
dependent speaker.
The process results a fitur as a voice character and it can be
integrated with testing phase in order to make a call..

Keywords: speaker recognition, dependent speaker, sampling, frame


blocking, windowing, FFT (Fast Fourier Transform), IFFT
(Inverse Fast Fourier Transform), liftering, peak extract.

iv
KATA PENGANTAR

Puji Syukur Alhamdulillah senantiasa saya panjatkan kehadirat


Allah yang senantiasa melimpahkan rahmat dan hidayah-Nya sehingga
penulis dapat menyelesaikan tugas akhir ini dengan judul :

APLIKASI PENGENALAN PENUTUR UNTUK DIAL TELEPON


DENGAN METODE DEPENDENT SPEAKER
(Membangun Sistem Pembelajaran)

Adapun tugas 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).
Saya menyadari bahwa masih banyak kekurangan pada
perancangan dan pembuatan buku laporan tugas akhir ini. Oleh karena
itu, besar harapan saya untuk menerima saran dan kritik dari para
pembaca. Semoga buku ini dapat memberikan manfaat bagi para
mahasiswa Politeknik Elektronika Negeri Surabaya pada khususnya dan
juga para pembaca pada umumnya.

Surabaya, Juli 2006

Penulis

v
UCAPAN TERIMA KASIH

Pada kesempatan ini penulis menyampaikan puji syukur


alhamdulillah atas kehadirat Allah SWT dengan segala rahmat dan
hidayah-Nya sehingga saya dapat menyelesaikan tugas akhir ini. Saya
sampaikan juga dengan segala rasa hormat dan terima kasih yang
sebesar-besarnya kepada :
1. Bapak (alm), ibu, KH. Agus Nur Muhammad dan saudara-
saudaraku atas nasihat-nasihat, motivasi, serta kasih sayang yang
teramat dalam I love you all
2. Bapak Dr. Ir. Titon Dutono, M.Eng selaku direktur PENS-ITS
sekaligus dosen pembimbing kami dengan segala kesabaran dan
waktu yang telah diberikan
3. Bapak Drs. Miftahul Huda, ST.MT. selaku Kepala Jurusan Teknik
Telekomunikasi Politeknik Elektronika Negeri Surabaya atas
pengabdian dan dedikasinya kepada kami
4. Bapak Tri Budi Santoso, ST.MT. selaku dosen pembimbing kami
atas kesabaran, waktu, saran-saran, nasihat-nasihat yang bermanfaat
bagi kami
5. Seluruh dosen dan karyawan Politeknik Elektronika Negeri
Surabaya
6. Bapak Amang Sudarsono, ST. , bapak Hari Oktavianto, ST. , Bapak
Heru selaku penghuni Lab Optik dan Fisika atas kesabaran,
kebijaksanaan, dan fasilitasnya dalam mendukung pengerjaan tugas
akhir ini
7. Auruma Nurrachmad sebagai partnerku, thanks a lot n maafin ya
kalo sering nyusahin kamu you’re the best
8. Penghuni lab sinyal yang anak-anaknya rame, kompak, hobby
guyon, wish the best for us n keep kompakan deh
9. Teman-teman kelas 3 TB yang paling kompak, rame, setia kawan,
senasib sepenanggungan, dll atas kebersamaan dalam 3 tahun ini I’ll
missed you all
10. Seseorang yang paling berarti yang senantiasa mencurahkan kasih
sayang, nasihat, motivasi you’re the best I ever had
11. Pihak-pihak lain yang ikut mendukung dan membantu penyelesaian
tugas akhir ini
Semoga Allah SWT membalas semua kebaikannya. Akhir kata
penulis berharap agar tugas akhir ini dapat bermanfaat untuk saat ini dan
seterusnya. Amin ya robbal alamin.

vi
DAFTAR ISI

LEMBAR PENGESAHAN ……………………………………… ii


ABSTRAK ……………………………………………………….. iii
ABSTRACT ……………………………………………………… iv
KATA PENGANTAR …………………………………………… v
UCAPAN TERIMA KASIH …………………………………..... vi
DAFTAR ISI ……………………………….................................. vii
DAFTAR GAMBAR …………………………………………….. x
DAFTAR TABEL ……………………………………………….. xii
BAB I PENDAHULUAN
1.1 Latar Belakang …………………………………...… 1
1.2 Tujuan ……………………………………………… 1
1.3 Batasan Masalah ………………………………….... 2
1.4 Metodologi ……………………………………….... 2
1.5 Sistematika Pembahasan ………………………..…. 3
BAB II TEORI PENUNJANG
2.1 Prinsip Dasar Speaker Recognition………………..… 5
2.2 Software Pengolahan Suara ……….………………… 7
2.2.1 Snack …………………..…………………….. 7
2.2.2 Tcl / tk ………………………………… 8
2.2.2.1 Perintah Dasar Tcl / tk …………….... 8
2.2.2.2 String dan List …………………….... 9
2.2.2.3 Ekspresi Matematika ……………….. 9
2.2.2.4 Kondisi ………………….………….. 9
2.2.2.5 Procedurs ……………………….…... 10

vii
2.2.3 Membuat Ekstensi Snack di C/C++ ……..…… 10
2.2.4 Sekilas Tentang Visual C++ ………..……….. 13
2.3 Sistem Pengolahan Sinyal Suara …………………… 15
2.3.1 Sinyal Suara Manusia ………….……………. 15
2.3.2 Sampling ….....................................…..……… 17
2.3.3 Frame Blocking ......................................…….. 18
2.3.4 Windowing …......................................…...….. 19
2.3.5 FFT (Fast Fourier Transform) ......................... 21
2.3.6 Cepstrum .......................................................... 23
2.3.7 IFFT (Inverse Fast Fourier Transform) ........... 25
2.3.8 Liftering ............................................................ 25
2.3.9 Cepstrum FFT .................................................. 25
2.3.10 Peak Extract ................................................... 25
BAB III PERENCANAAN DAN PEMBUATAN
3.1 Pendahuluan ……………………………………….. 27
3.2 Sistem Pengolahan Sinyal Suara …………………… 27
3.2.1 Perekaman Suara …..………………………... 29
3.2.2 Sampling ……..……………………………… 30
3.2.3 Frame Blocking .…………………………….. 32
3.2.4 Windowing ......................………………….… 33
3.2.5 FFT (Fast Fourier Transform)……………….. 34
3.2.6 IFFT (Inverse Fast Fourier Transform) …..…. 35
3.2.7 Cepstral Window (liftering) ………………….. 36
3.2.8 Peak Extract ………………………………..… 37
BAB IV PENGUJIAN DAN ANALISA
4.1 Pendahuluan ………………………...……………… 39
4.2 Pengujian dan Analisa

viii
Sistem Pengolahan Sinyal Suara ............................... 39
4.2.1 Perekaman Suara ………………..……..……. 39
4.2.2 Sampling …………………………….………. 42
4.2.3 Windowing …………………….……..…… . 43
4.2.4 FFT (Fast Fourier Transform) ……………… 45
4.2.5 Liftering ……………………………..….…… 47
4.2.6 Cepstrum FFT (Spectral Envelope) ………….. 48
4.2.7 Peak Extract (Fundamental Period) ……..…... 50
BAB V KESIMPULAN DAN SARAN
5.1 Kesimpulan ……………………………………...… 53
5.2 Saran …………………………………………...….. 53
DAFTAR PUSTAKA …………………………………………… 55
BIODATA PENULIS
LAMPIRAN

ix
DAFTAR GAMBAR

Gambar 2.1 Speaker Identification 5


Gambar 2.2 Speaker Verification 6
Gambar 2.3 Skema diagram organ penghasil 16
sinyal suara
Gambar 2.4 Bentuk sinyal suara kata /optik/ 17
dalam 2 frame (pria)
Gambar 2.5 Bentuk sinyal kata /optik/ dalam 18
proses sampling
Gambar 2.6 Bentuk sinyal kata /optik/ dalam 19
frame blocking
Gambar 2.7 Bentuk sinyal kata /optik/ dalam 21
Window Hamming
Gambar 2.8 Bentuk sinyal kata /optik/ dalam 23
domain frekuensi
Gambar 2.9 Contoh sinyal dalam domain kepstral 24
antara laki-laki dan perempuan
Gambar 3.1 Blok diagram sistem secara 27
keseluruhan
Gambar 3.2 Blok diagram sistem pengambilan 28
keputusan
Gambar 3.3 Tampilan software integrasi dari 30
Snack Dan Tcl/tk
Gambar 3.4 Sinyal hasil sampling kata /optik/ 31
dengan frekuensi 12000 Hz (2
frame)
Gambar 3.5 Flowchart dari proses sampling 32
Gambar 3.6 Frame blocking sinyal kata /optik/ 33
Gambar 3.7 Flowchart dari proses windowing 34
Gambar 3.8 Flowchart dari proses FFT 35
Gambar 3.9 Flowchart dari proses liftering 36
Gambar 3.10 Flowchart dari proses peak extract 37
Gambar 4.1 Tampilan software untuk mode 40
perekaman
Gambar 4.2 Perekaman kata /optik/ pada mode 41
perekaman
Gambar 4.3 Hasil sampling kata /optik/ pada 43

x
frame ke-11
Gambar 4.4 Hasil windowing kata /optik/ pada 45
frame ke-11
Gambar 4.5 Hasil FFT kata /optik/ pada frame 46
ke-11
Gambar 4.6 Hasil liftering kata /optik/ 48
Gambar 4.7 Hasil FFT untuk kata /optik/ 49
Gambar 4.8 Selubung spektral untuk kata /optik/ 50
Gambar 4.9 Fundamental period untuk kata 51
/optik/

xi
DAFTAR TABEL

Tabel 4.1 Sejumlah Ekstensi yang Dibangkitkan oleh 14


C++

xii
BAB I
PENDAHULUAN

1.1 LATAR BELAKANG


Suara merupakan modal besar yang dimiliki oleh manusia untuk
dapat mengkomunikasikan maksud dan tujuan dalam kehidupannya.
Berbagai hal dapat dilakukan dengan hanya mengeluarkan suara,
misalnya memberikan perintah kepada sesamanya. Dengan mudahnya
manusia dapat mengerti apa yang diucapkan oleh manusia yang lain
tanpa mengalami kesulitan sedikitpun [1].
Beberapa tahun terakhir perkembangan dunia teknologi informatika
dan komunikasi telah banyak mengalami kemajuan yang sangat pesat,
salah satunya adalah penelitian di bidang suara dimana sinyal informasi
yang dikirimkan tidak hanya berupa data teks tetapi juga suara manusia.
Dalam aplikasinya suara pengucap digunakan untuk mengidentifikasi
suatu kondisi serta kontrol akses, seperti voice dial, phone banking,
phone shopping, database access service, voice mail, security control,
dan remote access terhadap komputer [2]. Namun berbagai persoalan
akan muncul saat perintah suara diberikan kepada mesin. Hal ini
dikarenakan perbedaan karakter suara dari tiap individu [3].
Dalam laporan proyek akhir ini akan dibahas mengenai bagaimana
cara memberikan perlakuan kepada suatu sinyal suara atau wicara
dengan memanfaatkan teknologi pengenalan penutur (speaker
recognition) sehingga dapat dimengerti oleh sistem dan kemudian hasil
dari pengenalan suara itu digunakan untuk membangkitkan sinyal
DTMF dimana sinyal DTMF yang dihasilkan merupakan representasi
dari nomor telepon yang akan dihubungi.

1.2 TUJUAN
a. Mempelajari lebih lanjut tentang pengolahan sinyal digital,
khususnya pengenalan penutur (speaker recognition).
b. Merancang voice dial telephone dengan memanfaatkan sistem
pengenalan suara untuk proses dial telephone.
c. Hasil dari proyek akhir ini diharapkan dapat bermanfaat agar
waktu dalam panggilan telepon lebih efisien dan juga menambah
wawasan tentang speaker recognition sehingga dapat
diaplikasikan dalam bentuk lain.

1
2

Bab I Pendahuluan

1.3 BATASAN MASALAH


Permasalahan yang akan ditangani pada proyek akhir ini adalah
bagaimana memanfaatkan sistem pengenalan penutur (speaker
recognition) pada user untuk digunakan sebagai parameter dalam proses
pendialan nomor telepon atau yang dikenal sebagai “Voice Dial
Telephone”. Untuk itu diperlukan parameter-parameter dalam
pengolahan sinyal, seperti proses sampling, frame blocking, windowing,
FFT (Fast Fourier Transform),IFFT (Inverse Fast Fourier Transform),
liftering, peak extract.
Metode pengenalan penutur (speaker recognition) dalam proyek
akhir ini dibatasi hanya dengan dependent speaker dimana sistem hanya
dapat mengenali karakter suara pengucap tertentu saja. Hal ini
dikarenakan banyaknya kesulitan dalam menganalisa karakter sinyal
suara dari tiap orang yang berbeda satu sama lain dan suara yang
diucapkan oleh pengucap adalah nama laboratorium yang akan
dihubungi dari jurusan Teknik Telekomunikasi PENS-ITS.

1.4 METODOLOGI
Untuk perancangan voice dial telephone dengan menggunakan
teknik pengenalan penutur (speaker recognition), dibutuhkan langkah-
langkah sebagai berikut:
(a) Perancangan Sistem
Perancangan sistem dilakukan berdasarkan pada diagram
pembelajaran (enrollment phase) dan diagram pengujian (testing
phase) dimana untuk diagram enrollment phase sistem akan
melakukan dan menganalisa sedemikian rupa sinyal suara / wicara
dari user kemudian dimasukkan ke dalam database. Sedangkan
untuk pengujian, bahwa sinyal suara yang dimasukkan ke dalam
sistem akan dikenali melalui cara pembandingan dengan data pada
database, setelah itu sistem akan mengambil keputusan berdasarkan
hasil pembandingan data tersebut.
(b) 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. Dari tiap tahap
sistem dibuat suatu simulasi program dengan tujuan untuk
mengetahui dan memahami output dari masing-masing.
3

Bab I Pendahuluan

(b) Perekaman Suara


Untuk proses perekaman suara dilakukan dengan menggunakan
perangkat lunak (software) yaitu Snack / Tcl tk. Hasil dari
perekaman suara ini akan disimpan dalam file yang berekstensi
“.WAV”. Perekaman suara digunakan oleh user untuk membuat
standart suara yang berupa kata dari nama laboratorium berdasarkan
nomor pesawat telepon yang akan dihubungi.
(c) Pembuatan Database
Database digunakan sebagai standart suara yang merupakan
hasil perekaman suara berupa kata dari nama laboratorium yang
akan dihubungi.
(d) Integrasi dan Pengujian Sistem
Hasil dari analisa sinyal suara yang masuk ke dalam sistem
berupa fitur suara pengucap pada enrollment phase diintegrasikan
dengan testing phase dimana fitur tersebut akan digunakan sebagai
pembanding dengan database yang telah dibuat sebelumnya. Jika
keduanya sama, maka sistem akan membangkitkan sinyal DTMF
sehingga panggilan dapat dilakukan.
(e) Analisa Sistem
Dari pengujian tersebut kemudian dianalisa mengenai hasil
yang diperoleh secara keseluruhan serta memperbaiki kekurangan
yang ada.

1.5 SISTEMATIKA PEMBAHASAN


Buku laporan ini terdiri dari 5 (lima) bab pembahasan, dimana
masing-masing bab mempunyai kaitan satu sama lain, yaitu:
BAB 1 Pendahuluan :
menguraikan secara singkat latar belakang, tujuan, batasan
masalah, metodologi, dan sistematika pembahasan.
BAB 2 Teori Penunjang :
membahas secara garis besar tentang speaker recognition,
software pengolahan suara, dan pengolahan sinyal suara.
BAB 3 Perencanaan dan Pembuatan :
membahas tentang perencanaan dan pembuatan sistem yang
dibangun, meliputi proses sampling,,windowing, FFT (Fast Fourier
Transform), IFFT (Inverse Fast Fourier Transform), liftering, peak
extract.
4

Bab I Pendahuluan

BAB 4 Pengujian dan Analisa :


membahas tentang analisa dan hasil dari program yang dibuat.
BAB 5 Penutup :
memberi kesimpulan tentang hasil yang telah diperoleh dan
saran yang selayaknya dilakukan bila proyek akhir ini dilanjutkan.
B A B II
TEORI PENUNJANG

2.1 PRINSIP DASAR SPEAKER RECOGNITION


Speaker recognition adalah suatu proses pengenalan terhadap
pengucapan seseorang berdasarkan informasi individual yang
terkandung dalam model atau fitur pengucapan. Teknik ini
memungkinkan untuk menggunakan suara penutur sebagai verifikasi
terhadap identitas pengucapan dan juga kontrol akses.
Speaker recognition merupakan suatu metode yag meliputi
identifikasi dan verifikasi. Speaker identification adalah proses
penentuan dimana pengucap mengucapkan kata yang telah ditentukan
kemudian dicocokkan dengan model referensi. Jika terdapat kesamaan,
maka suara yang masuk akan dijadikan sebagai ciri identitas dari
pengucap. Speaker verification, di sisi lain, adalah proses penerimaan
dan penolakan ciri identitas dari sample suara yang dikenali sebagai
pengucap yang bersangkutan. Gambar 2.1 dan 2.2 memperlihatkan
struktur dasar dari identifikasi dan verifikasi.

Similarity

Reference
model Maximum Identification
Input Feature
(Speaker #1) selection result
speech extraction
(Speaker ID)

Similarity

Reference
model
(Speaker #N)

Gambar 2.1 Speaker Identification

5
6

Bab II Teori Penunjang

Verification
Input Feature result
Similarity Decision
speech extraction (Accept/Reject)

Reference
Speaker ID Threshold
model
(#M) (Speaker #M)

Gambar 2.2 Speaker Verification

Metode-metode speaker recognition dapat juga terdiri atas metode


independent dan dependent. Dalam sistem independent, pengucapan
yang dilakukan oleh tiap orang yang berbeda akan dikenali oleh sistem.
Di sisi lain, dalam sistem dependent pengenalan identitas pengucap yang
dilakukan oleh sistem berdasarkan pengucapan seseorang berdasarkan
satu atau lebih frase yang spesifik atau dengan kata lain sistem hanya
mengenali karakter suara pengucap tertentu saja.
Semua teknologi speaker recognition, identifikasi dan verifikasi,
independent dan dependent, masing-masing mempunyai keuntungan dan
kerugian serta menghendaki perlakuan dan teknik yang berbeda. Sistem
yang akan dibuat adalah dependent speaker.
Semua sistem pengenalan penutur harus memiliki dua fase yang
berbeda. Yang pertama adalah tahap pembelajaran atau enrollment
phase sedangkan yang kedua adalah tahap pengujian atau testing phase.
Dalam tahap pembelajaran, pengucapan yang dilakukan oleh penutur
diambil sebagai suatu sample suara sehingga sistem dapat membuat
model atau fitur sebagai referensi dari pengucap tersebut. Dalam kasus
sistem verifikasi, sebagai tambahan, speaker-specific threshold juga
diperhitungkan dari sample-sample pembelajaran. Selama tahap
pengujian (lihat Gambar 2.2), kata yang digunakan sebagai masukan
dicocokkan dengan model referensi yang disimpan dan pengambilan
keputusan pun dilakukan.
Dalam kenyataannya, sistem masih mengalami kesulitan dalam
mengenali perbedaan karakteristik pengucapan dari tiap orang. Sinyal
suara dalam tahap pembelajaran dan pengujian kemungkinan besar
7

Bab II Teori Penunjang

sangat berbeda dikarenakan beberapa faktor, antara lain perubahan suara


manusia yang dipengaruhi oleh waktu, kondisi kesehatan (misal:
pengucap mengalami flu), tempo pengucapan, dan sebagainya. Adapun
faktor-faktor lain, selain perbedaan karakteristik pengucap antara lain
accoustical noise dan kondisi saat perekaman (misal: pengucap
menggunakan michrophone yang berbeda).

2.2 SOFTWARE PENGOLAHAN SUARA


Dalam sistem speaker recognition yang telah dibuat ini
menggunakan beberapa software bantu, antara lain Snack, Tcl/tk, dan
C++. Ketiganya sangat penting dalam proses perekaman sampai dengan
tahap pengolahan suara yang pada akhirnya akan mengeksekusi perintah
dial telepon. Sebelum membahas lebih lanjut tentang pengolahan suara,
berikut akan dijelaskan sekilas tentang software tersebut.

2.2.1 Snack
Snack merupakan software yang digunakan untuk pemrosesan suara
yang dipakai sebagai extensi dalam suatu bahasa pemrograman. Snack
biasanya digunakan bersama-sama dengan bahasa pemrograman script
seperti Tcl/Tk, Python, Ruby. Dalam proyek akhir ini akan
menggunakan software snack versi 2.2.2.n
Snack memiliki banyak perintah dalam hubungannya pada
pemrosesan dan memvisualisasikan suara seperi memainkan, merekam,
menampilkan obyek suara. Selain itu Snack juga menyediakan obyek-
obyek suara dengan level yang lebih tinggi dan manajemen
penyimpanan yang fleksibel. Selain itu Snack dapat menangani sebagian
besar format file suara yang ada. 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
8

Bab II Teori Penunjang

interfaces).
2.2.2 Tcl / tk
Tcl merupakan singkatan dari Tool Control Language. Sedangkan
Tk adalah Graphical Toolkit extension dari Tcl. Tcl/tk menyediakan
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 penghitungannya. Catatan, didalam Tcl semua data di
representasikan sebagai string.

2.2.2.1 Perintah Dasar Tcl


Setiap masing – masing perintah Tcl mempunyai format perintah
seperti ini command arg1 arg2 arg3 .…. Tcl akan mengambil setiap
kata pada format perintah dan mengevaluasinya. Setelah mengevaluasi
setiap kata, kata pertama (command) dianggap sebagai nama fungsi dan
fungsi dieksekusi berdasarkan argument yang mengikutinya.
Untuk mengevaluasi setiap kata atau perintah yang diberikan,
Interpretor Tcl harus menganalisa setiap kata dengan syarat sebagai
berikut :
1. Jika kata di dalam tanda “ ”, maka kata berisi ruang dimana ruang
itu bisa disi kata/kalimat ataupun perintah. Seperti
% set a “Nanas”
Perintah ini terdapat tiga kata yaitu ‘set’ ‘a’ dan ‘”Nanas”’ yang
berartikan masukkan string “Nanas” ke variabel a.
2. Jika kata di dalam tanda { }, tidak mempunyai efek apapun tetapi
merupakan suatu data yang berada dalam ruangan .
3. Jika kata di dalam tanda [ ],maka kata berisi kalimat perintah
Contoh : % set c [string range $a 0 2]
Perintah ini memasukkan string “Nan” ke variable c, yang mana
tiga kata pertama dari kata ‘Nanas’.
4. Jika variable didepannya ada tanda $ ,maka perintah ini akan
menunjukkan isi dari variable tersebut
Contoh : % puts “$c”
Nan
9

Bab II Teori Penunjang

2.2.2.2 String dan List


Di Tcl, isi setiap variabel adalah string sehingga jika ingin
menyimpan angka di dalam variabel maka angka tersebut harus
ditransformasikan ke dalam String.
List merupakan type string yang spesial dimana list bisa berisi
lebih banyak element stringnya
Contoh :
% set data { 12 {23 4} 45 “Nanas”}
12 {23 4} 45 “Nanas”
% set data1 [lindex $data 1]
23 4
% set data1 [lindex $data 3]
Nanas

2.2.2.3 Expresi matematika


Dalam perhitungan di Tcl, operasi matematika menggunakan dua
tipe data yaitu float dan int. Perintah untuk melakukan penghitungan
adalah ‘expr’
Contoh :
% set result [expr (4+1)/2]
2
% set result [expr ( 4.0+1)/2]
2.5

2.2.2.4 Kondisi
Penkondisian di Tcl sama persis dengan pengkondisian di bahasa
C, kecuali untuk ‘foreach’ tidak sama dengan C. Syntax pengkondisian
di Tcl seperti dibawah ini.
• if {...condition...} {...body...}
• while {...condition...} {...body...}
• for {...init...} {...condition...} {...body...}
• foreach varnames {...list...} {...body...}
10

Bab II Teori Penunjang

2.2.2.5 Procedurs
Procedur di dalam pemrograman Tcl mirip dengan fungsi di
Program C.
Contoh :
% proc tambah {a b} {
< return [expr $a+$b}
<}
untuk memanggil procedurnya yaitu misal tambah 3 4

2.2.3 Membuat Ekstensi Snack di C/C++


Snack dapat ditambahkan dengan perintah baru yang beroperasi
pada obyek sound. Snack juga mungkin untuk menambah format file
sound baru dan tipe filternya. Kita juga bisa mendefinisikan beberapa
obyek perintah baru yang berhubungan dengan Snack sound dan
mengubah tracknya. 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 (source code) yang menunjukkan bagaimana speaker recognizer
dapat men-track obyek Snack sound dapat ditemukan di sini. Dibawah
ini adalah sebuah contoh kecil sebuah perintah dengan menambah
Snack. Kode dan file yang berhubungan dapat dicari dalam direktori ext
dari distribusi Snack.
Di bawah ini akan diberikan contoh program C/C++ yang
menggunakan exstensi snack .
Contoh :
#include "snack.h"

int Get_data(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));
11

Bab II Teori Penunjang

for (i = 0; i < Snack_GetLength(sound); i++)


{
if ((i/10)%2)
{
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
'Get_data'.
The syntax is: sndName Get_data
*/
EXPORT(int, Get_data_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;
}
12

Bab II Teori Penunjang

#endif
if (Tcl_PkgProvide(interp, "get_data", "1.0") != TCL_OK)
{
return TCL_ERROR;
}
Snack_AddSubCmd(SNACK_SOUND_CMD, "get_data",
(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
13

Bab II Teori Penunjang

2.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). Perangkat ini menyediakan lingkungan yang
dinamakan IDE ( Integrated Development Enviroment) yang
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
14

Bab II Teori Penunjang

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

Bab II Teori Penunjang

.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.3 SISTEM PENGOLAHAN SINYAL SUARA


Seperti yang telah dijelaskan sebelumnya, bahwa sinyal suara
sebagai kontrol akses dalam speaker recognition harus melalui prosedur
identifikasi dan verifikasi yang termasuk di dalamnya adalah
pembentukan parameter-parameter yang penting dalam pengolahan
sinyal suara yang dalam proyek akhir ini antara lain recording,
sampling, frame blocking, windowing, FFT (Fast Fourier Transform),
IFFT (Inverse Fast Fourier Transform), liftering, peak extract. Sebelum
penjelasan lebih lanjut tentang serangkaian proses yang ada di dalam
sistem ini, akan dijelaskan terlebih dahulu tentang pembentukan suara
manusia.

2.3.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 vokal tersebut terdiri atas : di bawah katup tenggorokan
(laryngeal pharynx), antara langit-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 di bawah ini :
16

Bab II Teori Penunjang

Rongga
hidung/nasal
cavity
Lintasan Langit-langit
vokal Lunak/velum Langit-langit
Keras/palatu
m

Bibir/labia

Pita

Gambar 2.3 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 :
17

Bab II Teori Penunjang

Data Sampling

3000
2000
Amplitudo

1000
0
-1000 0 200 400 600

-2000 pitch
Jumlah Data

Gambar 2.4 Bentuk sinyal suara kata /optik/ dalam 2 frame (pria)

Dari gambar 2.4 terlihat bahwa sinyal wicara mempunyai sifat quasi
periodik dan mempunyai unsur bunyi terkecil yang disebut sebagai
pitch. Panjang pitch berkisar 10 ms. Pitch manusia berbeda satu sama
lain terutama jenis kelamin laki-laki dan perempuan.

2.3.2 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 × Fsignal (2.1)


18

Bab II Teori Penunjang

Data Sampling

3000
2000
Amplitudo

1000
0
-1000 0 200 400 600

-2000
Jumlah Data

Gambar 2.5 Bentuk sinyal kata /optik/ dalam proses sampling

2.3.3 Frame Blocking


Pada langkah ini, sinyal wicara yang telah mengalami sampling,
s (n) , diblok dalam frame-frame dengan N sampel, dan digeser sebesar
M sampel dimana N ≈ 2 × M , seperti ditunjukkan pada gambar 2.6
sehingga didapatkan nilai dari sinyal yang baru adalah sebagai berikut :

xl (n) = s ( M • l + n) , n = 0,1,2,..., N − 1 l = 0,1,2,..., L − 1 (2.2)


19

Bab II Teori Penunjang

Data Sampling

3000
2000
Amplitudo

1000
0
-1000 0 N 200 400 600
N N
-2000 M
M
Jumlah Data

Gambar 2.6 Bentuk sinyal kata /optik/ dalam frame blocking

2.3.4 Windowing
Merupakan proses untuk membatasi lebar sinyal yang akan
dianalisa yang dapat mengurangi efek diskontinuitas pada ujung-ujung
frame yang dihasilkan oleh potongan-potongan sinyal. Korelasi antara
lebar window dalam domain waktu dan amplitudo berguna untuk
menyederhanakan sinyal dengan mengurangi puncak sinyalnya.
Jika kita mendefinisikan window seperti w( n), 0 ≤ n ≤ N − 1 ,
dimana N adalah jumlah sample dalam tiap frame, maka hasil dari
windowing adalah sinyal :

y l (n) = xl (n) w(n), 0 ≤ n ≤ N − 1 (2.3)

Ada beberapa jenis windowing yang dinamakan sesuai dengan


nama penemunya, yaitu :
20

Bab II Teori Penunjang

♦ Window Hamming

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


Wham(n) =
0 elsewhere
(2.4)

♦ Window Hanning

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

♦ Window Bartlett

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

♦ Window Blackman

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


WBl(n) =
0 elsewhere
(2.7)

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

Bab II Teori Penunjang

Data Windowing

1500
1000
amplitudo

500
0
-500 0 100 200 300
-1000
-1500
jumlah data

Gambar 2.7 Bentuk sinyal kata /optik/ dalam Window Hamming

2.3.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
spektrum. Fast Fourier Transformation atau transformasi Fourier cepat,
merupakan proses lanjutan dari DFT (Discrete Fourier Transformation).
Persamaan DFT (Discrete Fourier Transform) :

(2.8)
DFT (Discrete Fourier Transform) yang dibatasi pada set N sample
{xn} adalah sebagai berikut :

N −1
X n = ∑ xk e −2πjkn / N , n = 0,1,2,..., N − 1 (2.9)
k =0
Sebagai catatan bahwa di sini kita menggunakan j untuk menunjuk
pada unit imaginer, misal : j = − 1 . Pada umumnya xn adalah
bilangan kompleks. Deretan sinyal yang dihasilkan {xn} diartikan
sebagai berikut : frekuensi nol sama dengan n = 0, frekuensi positif
22

Bab II Teori Penunjang

0 < f < Fs / 2 sama dengan nilai 1 ≤ n ≤ N / 2 − 1 , sedangkan


frekuensi negatif − Fs / 2 < f < 0 sama dengan
N / 2 + 1 ≤ n ≤ N − 1 . Di sini, Fs adalah frekuensi sampling. Hasil
dari tahap ini disebut sebagai spectrum atau periodogram.
Transformasi fourier ini dilakukan untuk mentransformaikan sinyal
dari domain waktu ke domain frekuensi. Hal ini bertujuan agar sinyal
dapat diproses dalam spectral substraksi.
FFT adalah bentuk khusus dari persamaan integral fourier :

(2.10)
FFT dilakukan dengan membagi N buah titik pada transformasi
fourier diskrit menjadi 2, masing-masing (N/2) titik transformasi. Proses
memecah menjadi 2 bagian ini diteruskan dengan membagi (N/2) titik
menjadi (N/4) dan seterusnya hingga diperoleh titik minimum.
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.
Untuk proses selanjutnya, yakni IFFT (Inverse Fast Fourier
Transform) hanya diperlukan nilai real dari FFT. Oleh karena itu
diperlukan harga mutlak dari log nilai FFT.
23

Bab II Teori Penunjang

log 10 (magnitudo) Fast Fourier Transform

10
8
6
(dB)

4
2
0
0 100 200 300
frekuensi

Gambar 2.8 Bentuk sinyal kata /optik/ dalam domain frekuensi

2.3.6 Cepstrum
Cepstrum adalah fourier transform dari logaritma autospektrum.
Berguna untuk membatasi periodiksitas pada autospektrum. Cepstrum
juga berfungsi untuk menggandakan domain frekuensi dan konvolusi
pada domain waktu. Cepstrum merupakan serangkaian proses yang
terdiri dari FFT (Fast Fourier Transform), IFFT (Inverse Fast Fourier
Transform), liftering (cepstral window), dan peak extract (fundamental
period).
Bentuk matematis dari proses cepstrum bisa dipisahkan menjadi dua
variabel. Jika kita mengambil bentuk log dari magnitude kedua variabel
tersebut, maka diperoleh rumus :
Log |X(ω)| = log |G(ω) | + log |H(ω) | (2.11)

Menghitung invers dari Fourier Transform dengan rumus di atas,


menghasilkan quefrency, yang mempunyai bentuk matematis sebagai
berikut :

F −1 log X (ω ) = F −1 log G (ω ) + F −1 log H (ω ) (2.12)


24

Bab II Teori Penunjang

Quefrency adalah x-axis dari cepstrum yang merupakan suatu unit


dalam domain waktu.
Cepstrum bisa didefinisikan dengan beberapa cara sebagai berikut:
• Verbal : Cepstrum adalah Fourier Transform dari log dari
Fourier Transform
• Matematika : FT(log(Ft(sinyal))+j2 π m), dimana m adalah
bagian imaginer dari bilangan log komplex
• Algoritma : sin yal → FT → log → fase
unwrapping → FT → Ceptrum

Berikut adalah contoh gambar dari sinyal hasil cepstrum dari laki-
laki dan perempuan dengan kata yang sama. Dapat dilihat bahwa pada
suara wanita sering terjadi puncak-puncak daripada cepstrum pria.

Gambar 2.9 Contoh sinyal dalam domain kepstral antara laki-laki dan
perempuan
25

Bab II Teori Penunjang

2.3.7 IFFT (Inverse Fast Fourier Transform)


Inverse Fast Fourier Transform merupakan kebalikan dari
algoritma Discrete Fourier Transform yaitu suatu algoritma untuk
mengubah sinyal suara dari domain 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 spektrum. Parameter independent 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
domain waktu. Fitur khusus dari cepstrum yaitu berupa peak extract dan
selubung spektral.
2.3.8 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. Liftering
merupakan prose dari pemisahan elemen cepstrum dalam dua faktor,
yaitu cepstrum FFT (spectral envelope) dan peak extraction
(fundamental period).

2.3.9 Cepstrum FFT (Spectral Envelope)


Cepstrum FFT merupakan elemen quefrenci terendah dari proses
liftering yang membentuk selimut atau selubung dari FFT, jadi sinyal
yang sudah masuk proses liftering kemudian mengalami proses FFT lagi
serta dicari selubung dari FFT tersebut.

2.3.10 Peak Extract (Fundamental Period)


Data hasil liftering yang merupakan elemen quefrency tinggi,
diambil nilai puncaknya. Dan data yang diambil berupa 16 buah data
dari hasil liftering tersebut. Nilai puncak inilah yang nantinya akan
digunakan sebagai fitur representasi dari data yang masuk ke sistem dan
selanjutnya akan digunakan sebagai pembanding dengan database yang
menggunakan metode DTW (Dynamic Time Warping).
26

Bab II Teori Penunjang

----------Halaman ini sengaja dikosongkan----------


27

Bab II Teori Penunjang


BABIII
PERENCANAAN DAN PEMBUATAN

3.1 PENDAHULUAN
Dalam bab ini akan dibahas tentang pengolahan sinyal suara untuk
mendapatkan ciri atau parameter dari suara masuk. Selain itu juga akan
membahas tentang pengolahan hasil compare (perbandingan) keluaran
untuk menghasilkan atau membangkitkan sinyal DTMF.

3.2 SISTEM PENGOLAHAN SINYAL SUARA


Di bawah ini adalah gambar blok sistem yang akan dibuat dapat
ditunjukkan seperti gambar di bawah ini :

Microphone DTMF Signal

`
Sinyal suara

Sistem Pengolahan sinyal Suara

Gambar 3.1 Blok diagram sistem secara keseluruhan

Dari gambar di atas blok diagram pengolahan sinyal suara untuk


sistem pengambilan keputusan, tepatnya pada sistem pembelajaran
(enrollment) dalam hal ini ditandai dengan garis merah, seperti pada
gambar 3.2. Sedangkan selebihnya, yakni DTW (Dynamic Time
Warping), pembentukan database sebagai standart, dan aksi merupakan
tahap pengujian (testing).

27
28

Bab III Perencanaan dan Pembuatan

Gambar 3.2 Blok diagram sistem pengambilan keputusan

Dari gambar di atas dapat dijelaskan bahwa suara manusia yang


keluar menghasilkan sinyal analog yang bersifat kontinyu dan tidak
terbatas oleh waktu (infinite time interval). Sinyal analog tersebut
kemudian mengalami proses sampling setiap 20 ms dengan frekuensi
sampling sebesar 12000 Hz dengan tujuan agar sinyal analog tersebut
berubah menjadi sinyal diskrit. Setelah proses sampling, dilanjutkan
pada proses frame blocking, dimana sinyal analog yang berada dalam
domain waktu yang bersifat invariant time (tidak bergantung pada
waktu) harus dibentuk dalam potongan-potongan waktu yang terbatas
(dipotong-potong dalam slot waktu) tertentu yang disebut dengan frame.
Frame ini kemudian mengalami proses windowing. Proses windowing
dalam pengolahan sinyal hasil dari sampling bertujuan untuk
mengurangi efek diskontinuitas pada ujung-ujung frame yang dihasilkan
oleh potongan-potongan sinyal. Korelasi antara lebar windowing dalam
domain waktu dan amplitudo berguna untuk menyederhanakan sinyal
sehingga akan diperoleh domain frekuensi. Dengan FFT sinyal yang
akan disampling dalam domain waktu ditransformasikan ke domain
frekuensi.
Hasil dari Fourier transform yang sinyalnya mengandung nilai real
dan imaginer selanjutnya akan melalui proses mutlak log dari nilai FFT
29

Bab III Perencanaan dan Pembuatan

(Fast Fourier Transform) dimana dalam proses ini hanya diambil nilai
realnya saja untuk digunakan pada proses berikutnya.
Selanjutnya adalah IFFT dimana sinyal yang semula berada dalam
domain frekuensi akan dikonversikan ke dalam domain waktu.
Proses selanjutnya adalah liftering (cepstral window). Pada proses
ini mengambil 16 buah data yang dapat mewakili seluruh data. 16 buah
data ini akan diambil titik puncaknya yang nantinya dipakai sebagai fitur
yang dapat mempresentasikan masing – masing frame. Untuk
membuktikan 16 buah data ini dapat mewakili keseluruhan data dapat
digunakan proses FFT lagi. Kemudian fitur yang diperoleh tersebut
digunakan sebagai pembanding database dengan metode DTW.

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.
Dalam proyek akhir ini akan dibuat aplikasi seperti pada gambar di
bawah ini. Dimana aplikasi ini merupakan gabungan atau integrasi dari
Tcl/tk dan snack.
30

Bab III Perencanaan dan Pembuatan

Gambar 3.3 Tampilan software integrasi dari Snack Dan Tcl/tk

Pada program di atas, frekuensi sampling diset 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 perekaman disimpan dalam sebuah file
berekstensi “.wav”. Pada penekanan tombol ”perekaman”, perekaman
digunakan untuk membuat file standar untuk kelima kata yang akan
digunakan sebagai pembanding untuk sinyal masukan. Pada penekanan
tombol pengujian, perekaman digunakan untuk memproses langsung
sinyal dan selanjutnya dibandingkan dengan data-data standar dari
proses perekaman sebelumnya.
3.2.2 Sampling
Frekuensi sampling yang digunakan adalah sebesar 12000 Hz,
dimana dalam 1 detik sinyal tersebut terdapat 12000 titik sampling.
Sebagai contoh, pada gambar di bawah, mempunyai sinyal
sepanjang 20 ms disampling dengan frekuensi sampling sebesar 12000
Hz, akan menghasilkan titik sampling sebanyak 240 titik.
31

Bab III Perencanaan dan Pembuatan

Perhitungannya adalah sebagai berikut :


1 detik = 12000 titik sample
20 mili detik = y
y = 12000 Hz x 20 milidetik = 240 titik sample
1000 milidetik

Data Sampling

3000
2000
Amplitudo

1000
0
-1000 0 200 400 600

-2000
Jumlah Data

Gambar 3.4 Sinyal hasil sampling kata /optik/ dengan frekuensi


12000 Hz (2 frame)
32

Bab III Perencanaan dan Pembuatan

M u la i

S in y a l
M asu kan

B a c a P a n ja n g
S in y a l

B a g i M e n ja d i N
F ra m e

i= 0 ;i< N ;i+ +

A m b il 2 4 0
d a ta s a m p e l

T a m p ilk a n
n ila i s a m p e l

S e le s a i

Gambar 3.5 Flowchart dari proses sampling

3.2.3 Frame Blocking


Hasil perekaman suara merupakan sinyal analog yang berada dalam
domain waktu yang bersifat variant time, yaitu suatu fungsi yang
bergantung waktu. Sinyal yang telah mengalami sampling, kemudian
dibagi menjadi n buah frame, dengan jumlah sampel per frame sebesar
N, dan adjacent frame sebesar M sampel. Dimana pada gambar ini
M=0.5N. Pada frame pertama, terdiri dari N buah sampel. Frame kedua
dimulai pada sampel ke M, sehingga terjadi overlap sebesar N-M
sampel. Begitupula untuk frame ketiga, dimulai dari sampel ke 2M
sehingga terjadi overlap dari frame kedua sebesar N+M-2M sampel
juga. Proses ini berlanjut terus hingga seluruh sinyal terbagi menjadi
beberapa frame.
33

Bab III Perencanaan dan Pembuatan

Data Sampling

3000
2000
Amplitudo

1000
0
-1000 0 N 200 400 600
N N
-2000 M
M
Jumlah Data

Gambar 3.6 Frame blocking sinyal kata /optik/

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 diskontinuitas pada
ujung-ujung frame yang dihasilkan oleh potongan – potongan sinyal.
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)


34

Bab III Perencanaan dan Pembuatan

Proses windowing dapat dilihat pada flowchart berikut ini :


M ulai

240 data
sam pel

i=0;i<240;i++

Ha m m ing W indow
y[i]=x[i]*(0.54-0.46*cos(2*phi*(i-1)/240))

Tam pilkan nilai


ham m ing

Selesai

Gambar 3.7 Flowchart dari proses windowing

3.2.5 FFT (Fast Fourier Transform)


Transformasi Fourier cepat (FFT) adalah suatu metode yang sangat
efisien untuk menyelesaikan transformasi Fourier diskrit (DFT) yang
banyak dipakai untuk keperluan analisa sinyal. Sehingga dengan FFT
sinyal yang disampling dalam domain waktu akan ditransformasikan ke
domain frekuensi agar efisiensi suatu algoritma dapat ditentukan dan
sejauh mana dapat mereduksi jumlah perkalian dan penjumlahan serta
mereduksi lalu lintas data pada memori komputer sehingga prosesnya
jauh lebih cepat. 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
35

Bab III Perencanaan dan Pembuatan

Untuk proses selanjutnya, dari nilai FFT yang diperoleh hanya


diperlukan nilai realnya saja, oleh karena itu mutlak log dari nilai FFT
diperlukan.
Proses FFT sinyal masukan dapat dilihat dari flowchart berikut ini :

Gambar 3.8 Flowchart dari proses FFT

3.2.6 IFFT (Inverse Fast Fourier Transform)


IFFT merupakan suatu proses yang bertujuan untuk
mengkonversikan spektrum yang semula berada dalam domain frekuensi
menjadi domain waktu. Sehingga parameter yang semula adalah
frekuensi berubah menjadi quefrency dan hasil yang diperoleh
dinamakan cepstrum.
36

Bab III Perencanaan dan Pembuatan

3.2.7 Liftering (Cepstral Window)


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 flowchart dari proses liftering :

Gambar 3.9 Flowchart dari proses liftering


37

Bab III Perencanaan dan Pembuatan

3.2.8 Peak Extract (Fundamental Period)


Data hasil liftering yang merupakan elemen quefrency tinggi,
diambil nilai puncaknya. Dan data yang diambil berupa 16 buah data
dari hasil liftering tersebut. Untuk membuktikan bahwa 16 data ini telah
mewakili keseluruhan data maka dapat dilakukan proses FFT sekali lagi.

Gambar 3.10 Flowchart dari proses peak extract


38

Bab III Perencanaan dan Pembuatan

----------Halaman ini sengaja dikosongkan----------


BABV
KESIMPULAN DAN SARAN

5.1 KESIMPULAN
Dari pengujian dan analisa yang dilakukan dapat disimpulkan
bahwa :
1. Frekuensi sampling yang digunakan sebesar 12000 Hz
bertujuan agar memenuhi syarat bahwa frekuensi sampling
besarnya lebih dari sama dengan 2 kali frekuensi sinyal info
(finfo sama dengan fsuara yang berada di antara range 300-
5000 Hz)
2. Pemberian interval selama 200 ms bertujuan untuk
mengantisipasi adanya unvoiced plossive antara kata pertama
dan kedua sehingga sinyal tersebut dianggap masih merupakan
sinyal utama
3. Pada proses windowing ujung-ujung sinyal dinolkan agar
sinyal tersampling lebih halus serta untuk mengurangi efek
diskontinuitas. Hal ini terbukti bahwa pada titik sample 0-50
dan 20-seterusnya level sinyal adalah 0
4. Fitur yang terbentuk mewakili 16 data dalam tiap frame dari
keseluruhan sinyal suara. 16 data dari awal sample pada tiap
frame merupakan pembeda karakter suara seseorang. Terbukti
bahwa amplitudo yang spesifik berada tepat di awal data 0-5

5.2 SARAN
Mengingat masih banyaknya hal-hal yang belum dapat
diimplementasikan pada proyek akhir ini, maka kami
mempertimbangkan beberapa saran untuk perlu adanya perbaikan-
perbaikan proyek akhir ini, antara lain :
1. Sistem yang semula menggunakan metode dependent speaker
dirasa masih belum maksimal karena sistem tidak hanya
mengenali karakter suara tertentu saja melainkan semua orang
(independent speaker)
2. Kepekaan sistem dalam mengenali kondisi lingkungan saat
pengenalan suara sangat tinggi sehingga kesalahan tidak dapat
dihindari

53
54

Bab V Kesimpulan dan Saran

3. Sample sinyal yang diambil seharusnya tidak mengandung


noise, sehingga akurasi sistem dalam pembentukan fitur
nantinya tinggi.
DAFTAR PUSTAKA

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


Automatic Speaker Recognition System)”, Audio Visual
Communications Laboratory, Swiss Federal Institute of
Technology, Lausanne, Switzerland.
[2]. Digital Speech Processing, Synthesis, and Recognition, Sadaoki
Furui, Marcel Dekker, Inc., New York, P.408, 1989.
[3]. Lawrence Rabiner Biing – Hwang Juang, “Fundamentals of
Speech Recognition”, 1993.
[4]. Achmad Irfan, Abdul Rahman, ” Aplikasi Pengenalan wicara untuk
dial telepon”, Proyek Akhir PENS-ITS, 2005.
[5]. Tutorial on Speech Technology,
http://murray.newcastle.edu.au/users/staff/speech/home_pages/tuto
rial.html.
[6]. Brian Van Osdol, “Cepstrum”,
http://cnx.org/content/m12469/latest/

55
BIODATA PENULIS

Nama : Hidayatul Fitriyah (Fitri)


TTL : Gresik, 7 Juli 1985
Alamat : Jl. Proklamasi IX/7, Gresik
Telp : 081510565333
Email : delapitri@yahoo.com
Hobby : Jalan-jalan, olah raga, baca buku,
nonton, dengerin musik
Motto : Jadikanlah apa yang kita lakukan
sebagai ibadah, bermanfaat bagi
diri sendiri dan orang lain

RIWAYAT PENDIDIKAN

Tahun Pendidikan

1991 – 1997 SD I Semen Gresik


1997 – 2000 SLTP Semen Gresik
2000 – 2003 SMUN I Gresik
2003 – 2006 Politeknik Elektronika Negeri
Surabaya - ITS
Lampiran

™ Program Pengolahan Sinyal dengan Menggunakan Tcl/tk 8.3


dan Snack 2.2.2n

A. Program Tampilan Awal :

#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"

package require -exact snack 2.2

load libtest

snack::sound s

option add *font {Helvetica 10 bold}

pack [label .l1 -text "Aplikasi Pengenalan Penutur untuk Dial Telepon"]
pack [label .l2 -text "dengan Metode Dependent Speaker"]
pack [label .l3 -text "oleh"]
pack [label .l4 -text "Hidayatul Fitriyah dan Auruma Nurrachmad"]
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 Pengujian -command {Run pengujian.tcl} -state disabled
button .f.recording -text Perekaman -command {Run perekaman.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
if {$demoFlag != 0} {
Lampiran

$i eval set demoFlag $demoFlag


}
$i eval wm title . $script
$i eval source $script
}

B. Program Perekaman

#!/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 global\\lib\\global

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 "DATABASE"] -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
Lampiran

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}
button .a3.b4 -text Save -command {y write data_wav\\$filename.wav}
button .a3.b5 -text Load -command {y read data_wav\\$filename.wav;y input}
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

button .a4.b1 -text Optik -command {y optik}


button .a4.b2 -text Kajur -command {y kajur}
button .a4.b3 -text Digital -command {y digital}
button .a4.b4 -text Teleponi -command {y teleponi}
button .a4.b5 -text Multimedia -command {y multimedia}
pack .a4.b1 .a4.b2 .a4.b3 .a4.b4 .a4.b5 -side left -padx 5 -pady 10

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
}

.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

C. Program Pengujian
#!/bin/sh
#the next line restarts using wish \
exec wish8.4 "$0" $@"

package require sound


package require -exact snack 2.2

load global\\lib\\global
Lampiran

snack::sound z -channels 2
snack::sound x -file sound.wav -debug 0
snack::sound y
x configure -rate 12000 -encoding LIN16 -channels MONO

set width 600


set height 200
set pps 300
set color black
set frame 1

option add *font {Helvetica 10 bold}

sound::sound s1 -format lin16 -frequency 4500


sound::sound s2 -format lin16 -frequency 4500
sound::sound s3 -format lin16 -frequency 4500
sound::sound s4 -format lin16 -frequency 4500
sound::sound s5 -format lin16 -frequency 4500
sound::sound s6 -format lin16 -frequency 4500
sound::sound s7 -format lin16 -frequency 4500
sound::sound s8 -format lin16 -frequency 4500
sound::sound s9 -format lin16 -frequency 4500
sound::sound s0 -format lin16 -frequency 4500
sound::sound x -format lin16 -frequency 4500
sound::sound a

s1 length 900 -units samples


s2 length 900 -units samples
s3 length 900 -units samples
s4 length 900 -units samples
s5 length 900 -units samples
s6 length 900 -units samples
s7 length 900 -units samples
s8 length 900 -units samples
s9 length 900 -units samples
s0 length 900 -units samples
a length 900

set amp 10000


for {set i 0} {$i < [s1 length]} {incr i} {
s1 sample $i [expr
int(($amp*sin($i*6.283185/6.5))+($amp*sin($i*6.283185/3.72)))]
}
Lampiran

for {set i 0} {$i < [s2 length]} {incr i} {


s2 sample $i [expr
int(($amp*sin($i*6.283185/6.5))+($amp*sin($i*6.283185/3.36)))]
}
for {set i 0} {$i < [s3 length]} {incr i} {
s3 sample $i [expr
int(($amp*sin($i*6.283185/6.5))+($amp*sin($i*6.283185/3.1)))]
}
for {set i 0} {$i < [s4 length]} {incr i} {
s4 sample $i [expr
int(($amp*sin($i*6.283185/5.84))+($amp*sin($i*6.283185/3.72)))]
}
for {set i 0} {$i < [s5 length]} {incr i} {
s5 sample $i [expr
int(($amp*sin($i*6.283185/5.84))+($amp*sin($i*6.283185/3.36)))]
}
for {set i 0} {$i < [s6 length]} {incr i} {
s6 sample $i [expr
int(($amp*sin($i*6.283185/5.84))+($amp*sin($i*6.283185/3.1)))]
}
for {set i 0} {$i < [s7 length]} {incr i} {
s7 sample $i [expr
int(($amp*sin($i*6.283185/5.28))+($amp*sin($i*6.283185/3.72)))]
}
for {set i 0} {$i < [s8 length]} {incr i} {
s8 sample $i [expr
int(($amp*sin($i*6.283185/5.28))+($amp*sin($i*6.283185/3.36)))]
}
for {set i 0} {$i < [s9 length]} {incr i} {
s9 sample $i [expr
int(($amp*sin($i*6.283185/5.28))+($amp*sin($i*6.283185/3.1)))]
}
for {set i 0} {$i < [s0 length]} {incr i} {
s0 sample $i [expr
int(($amp*sin($i*6.283185/4.78))+($amp*sin($i*6.283185/3.36)))]
}
for {set i 0} {$i < [a length]} {incr i} {
}

pack [label .f1 -text "APLIKASI PENGENALAN PENUTUR \n UNTUK DIAL


TELEPON \n DENGAN METODE DEPENDENT SPEAKER \n\n Oleh\n Fitri
dan Auruma "] -pady 10
Lampiran

pack [frame .f4] -fill x -pady 5


label .f4.2 -text "Pengujian"
pack .f4.2 -side left -expand 1
pack [frame .f2]

canvas .f2.c -bg black -width 300 -height 200


snack::levelMeter .f2.lml -width 20 -length 150 -orient vertical -oncolor red -
offcolor pink
snack::levelMeter .f2.lmr -width 20 -length 150 -orient vertical -oncolor red -
offcolor pink

pack .f2.lml .f2.c .f2.lmr -side left -padx 5 -pady 10


pack [label .f3 -text "0.000 sec" -width 10]

pack [frame .f5]


label .f5.1 -text "Get Ready"
pack .f5.1 -side left -expand 1
proc single {w} {
variable singleclick_timer
set singleclick_timer($w) [after 500 [list singleclick $w]]
return
}

tk_messageBox -message {Single click untuk Record, Double click untuk Dial
Telephon, Right click untuk Play sound }

proc double {w} {


variable singleclick_timer
catch {
after cancel $singleclick_timer($w)
unset singleclick_timer($w)
}
y stop;z stop
.f5.1 configure -text "Stop"
.f5.1 configure -text "Dial Telephon"
run

proc run {} {
y input;y dtw
start
Lampiran

proc singleclick { w } {
variable singleclick_timer
catch {
unset singleclick_timer($w)
}
y record; z record
.f5.1 configure -text "Record"
return
.f5.1 configure -text ""
}

proc right {w} {


y reset
y play
.f5.1 configure -text "Play Sound"
}

bind . <Double-ButtonPress-1> {double w}


bind . <ButtonPress-1> {single w}
bind . <ButtonPress-3> {right w}

after 1 Update

proc Update {} {
set l [z max -start 0 -end -1 -channel 0]
.f3 config -text [format "%.3f sec" [y length -unit seconds]]
z length 0
.f2.lml configure -level $l
.f2.lmr configure -level $l
after 50 Update
}
.f2.c itemconf wave -pixelspersecond 300 -width 300
.f2.c create waveform 152 102 -anchor c -sound y -height $height -tags wave -
debug 0 -zerolevel 0 -frame $frame -fill white

proc start {} {
set data [read [open data\\hasil\\out.txt]]

if { $data == 0 } {
.f5.1 configure -text "Status Ready"
}
Lampiran

if { $data == 1 } {
.f5.1 configure -text "Call.... optik 4160"
x flush
x concatenate s4
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x concatenate a
x concatenate s0
x play
}
if { $data == 2 } {
.f5.1 configure -text "call.... kajur 1116"
x flush
x concatenate s1
x concatenate a
x concatenate s1
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x play
}
if { $data == 3 } {
.f5.1 configure -text "Call.... digital 1502"
x flush
x concatenate s1
x concatenate a
x concatenate s5
x concatenate a
x concatenate s0
x concatenate a
x concatenate s2
x play
}
if { $data == 4 } {
.f5.1 configure -text "Call.... teleponi 1501"
x flush
x concatenate s1
x concatenate a
x concatenate s5
x concatenate a
Lampiran

x concatenate s0
x concatenate a
x concatenate s1
x play
}
if { $data == 5 } {
.f5.1 configure -text "Call.... multimedia 4163"
x flush
x concatenate s4
x concatenate a
x concatenate s1
x concatenate a
x concatenate s6
x concatenate a
x concatenate s3
x play
}
}

™ Program Pengolahan Sinyal Suara dengan Menggunakan


Microsoft Visual C++

#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "snack.h"

#define beki 9
#define nlpc 256
#define inv 1.0f
#define inv2 -1.0f

static float G[300][300];


static float st_CEP[300][16];
static float in_CEP[300][16];

static int st_blk,in_blk;

float DP_match1(int);
float distance(int,int);
//void trace();
Lampiran

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

freset=fopen("data\\hasil\\out.txt","w");
fprintf(freset,"%d\n",0);

fclose(freset);

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

for(i=0;i<jml_sin;i++)
jml+=xx[i];
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+3*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);
}

FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;
Lampiran

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

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

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

for(frame=0;frame<frame_no-1;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",ms=ms+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++)
{
Lampiran

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

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",ms=ms+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",ms=ms+spd,real[k]);
}

/***** Cepstrum *****/

cal_fft(real,imag,beki,inv);
Lampiran

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

fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);

return TCL_OK;
}
//,*flog
FILE *fsignal,*finfo,*fframe,*fsignalframe,*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 Telkom(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST


objv[])
{
Lampiran

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");
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++;
}
Lampiran

for(frame=0;frame<frame_no-1;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",ms=ms+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 *****/


Lampiran

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",ms=ms+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",ms=ms+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;

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

}*/
}

fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);

return TCL_OK;
}

FILE *fsignal,*finfo,*fframe,*fsignalframe,*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 Optik(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST


objv[])
{
fsignal=fopen("data\\standart\\sinyal_2.txt","w");
finfo=fopen("data\\standart\\info_2.txt","w");
fframe=fopen("data\\standart\\frame_2.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_2.txt","w");
fhamm=fopen("data\\standart\\hamm_2.txt","w");
ffft=fopen("data\\standart\\fft_2.txt","w");
flift=fopen("data\\standart\\lift_2.txt","w");
flog=fopen("data\\standart\\log_2.txt","w");
fceps=fopen("data\\standart\\ceps_2.txt","w");

/****** Get the sound structure for this sound ******/


Lampiran

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

for(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}

/***** hamming window *****/


Lampiran

hammr(real,imag,nlpc);

for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+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 *****/

for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}

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

fprintf(flift,"%f\t%f\n",ms=ms+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",ms=ms+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;

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

fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
Lampiran

fclose(fceps);

return TCL_OK;
}

FILE *fsignal,*finfo,*fframe,*fsignalframe,*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 Mikro(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST


objv[])
{
fsignal=fopen("data\\standart\\sinyal_3.txt","w");
finfo=fopen("data\\standart\\info_3.txt","w");
fframe=fopen("data\\standart\\frame_3.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_3.txt","w");
fhamm=fopen("data\\standart\\hamm_3.txt","w");
ffft=fopen("data\\standart\\fft_3.txt","w");
flift=fopen("data\\standart\\lift_3.txt","w");
flog=fopen("data\\standart\\log_3.txt","w");
fceps=fopen("data\\standart\\ceps_3.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]);
}
Lampiran

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

for(frame=0;frame<frame_no-1;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",ms=ms+spd,real[k]);

for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
Lampiran

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

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",ms=ms+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
Lampiran

real[k]=(float)log10(0.000001);
imag[k]=0;

fprintf(flog,"%f\t%f\n",ms=ms+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;

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

fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);

return TCL_OK;
}

FILE *fsignal,*finfo,*fframe,*fsignalframe,*fhamm,*ffft,*flift,*flog,*fceps;
Sound *sound;

double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
Lampiran

float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;

void hammr();
void cal_fft();

int Sinyal(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST


objv[])
{
fsignal=fopen("data\\standart\\sinyal_4.txt","w");
finfo=fopen("data\\standart\\info_4.txt","w");
fframe=fopen("data\\standart\\frame_4.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_4.txt","w");
fhamm=fopen("data\\standart\\hamm_4.txt","w");
ffft=fopen("data\\standart\\fft_4.txt","w");
flift=fopen("data\\standart\\lift_4.txt","w");
flog=fopen("data\\standart\\log_4.txt","w");
fceps=fopen("data\\standart\\ceps_4.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;
Lampiran

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

for(frame=0;frame<frame_no-1;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",ms=ms+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)
Lampiran

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

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",ms=ms+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",ms=ms+spd,real[k]);
}

/***** Cepstrum *****/

cal_fft(real,imag,beki,inv);

/*for(k=0;k<256;k++)
Lampiran

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(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);

return TCL_OK;
}

FILE *fsignal,*finfo,*fframe,*fsignalframe,*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 Jarkom(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST


objv[])
{
fsignal=fopen("data\\standart\\sinyal_5.txt","w");
finfo=fopen("data\\standart\\info_5.txt","w");
Lampiran

fframe=fopen("data\\standart\\frame_5.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_5.txt","w");
fhamm=fopen("data\\standart\\hamm_5.txt","w");
ffft=fopen("data\\standart\\fft_5.txt","w");
flift=fopen("data\\standart\\lift_5.txt","w");
flog=fopen("data\\standart\\log_5.txt","w");
fceps=fopen("data\\standart\\ceps_5.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++;
}
}
Lampiran

for(frame=0;frame<frame_no-1;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",ms=ms+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);
Lampiran

/***** 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",ms=ms+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",ms=ms+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;

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

fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
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,*fstd2,*fstd3,*fstd4,*fstd5;
FILE *fframe,*fout1,*fout2;

int i,j,r;
static int out=1;
float DP_dist,hasil[6],min;

float in_data,std_data_1,std_data_2,std_data_3,std_data_4,std_data_5;

float in_in,in_1,in_2,in_3,in_4,in_5;

fin=fopen("data\\input\\log_in.txt","r");
fstd1=fopen("data\\standart\\log_1.txt","r");
fstd2=fopen("data\\standart\\log_2.txt","r");
fstd3=fopen("data\\standart\\log_3.txt","r");
fstd4=fopen("data\\standart\\log_4.txt","r");
fstd5=fopen("data\\standart\\log_5.txt","r");

fout1=fopen("data\\hasil\\out1.txt","a");
fout2=fopen("data\\hasil\\out.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++)
Lampiran

{
fscanf(fin,"%f\t%f\n",&in_in,&in_data);
in_CEP[i][j]=in_data;
}
}

/***** Menghitung jarak antara sinyal input dan standar Telkom


*****/

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

/***** Menghitung jarak antara sinyal input dan standar Optik *****/

fframe=fopen("data\\standart\\frame_2.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);

for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd2,"%f\t%f\n",&in_2,&std_data_2);
st_CEP[i][j]=std_data_2;
}
}
Lampiran

r=7;

DP_dist=DP_match1(r);
hasil[2]=DP_dist;
// trace();

/***** Menghitung jarak antara sinyal input dan standar Mikro *****/

fframe=fopen("data\\standart\\frame_3.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);

for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd3,"%f\t%f\n",&in_3,&std_data_3);
st_CEP[i][j]=std_data_3;
}
}

r=7;

DP_dist=DP_match1(r);
hasil[3]=DP_dist;
// trace();

/***** Menghitung jarak antara sinyal input dan standar Sinyal


*****/

fframe=fopen("data\\standart\\frame_4.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);

for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd4,"%f\t%f\n",&in_4,&std_data_4);
st_CEP[i][j]=std_data_4;
}
}
Lampiran

r=7;

DP_dist=DP_match1(r);
hasil[4]=DP_dist;
// trace();

/***** Menghitung jarak antara sinyal input dan standar Jarkom


*****/

fframe=fopen("data\\standart\\frame_5.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);

for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd5,"%f\t%f\n",&in_5,&std_data_5);
st_CEP[i][j]=std_data_5;
}
}

r=7;

DP_dist=DP_match1(r);
hasil[5]=DP_dist;
// trace();

for(i=1;i<=5;i++)
fprintf(fout1,"%f\t",hasil[i]);

min=hasil[1];
for(i=1;i<=5;i++)
{
if(min>=hasil[i])
{
min=hasil[i];
out=i;
}
}

fprintf(fout2,"%d\t",out);
Lampiran

fclose(fin);
fclose(fstd1);
fclose(fstd2);
fclose(fstd3);
fclose(fstd4);
fclose(fstd5);
fclose(fout1);
fclose(fout2);

return TCL_OK;
}

/*
Initialize the rekamdata package and create a new sound
command'rekamdata'.
The syntax is: sndName rekamdata
*/

EXPORT(int, Global_Init)(Tcl_Interp *interp)


{
#ifdef USE_TCL_STUBS
if (Tcl_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, "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);
Lampiran

Snack_AddSubCmd(SNACK_SOUND_CMD, "telkom",
(Snack_CmdProc *) Telkom, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "optik",
(Snack_CmdProc *) Optik, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "mikro",
(Snack_CmdProc *) Mikro, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "sinyal",
(Snack_CmdProc *) Sinyal, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "jarkom",
(Snack_CmdProc *) Jarkom, 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 preemp(x,y,n)
float *x,*y;
int n;
{
int i;

--x;
--y;

for(i=1;i<n;++i)
y[i]=x[i+1]-x[i];

/* ====== linear interpolation y(n-2),y(n-1) ---> y(n) ====== */

// y[n]=(float)(2.0*y[n-1]-y[n-2]);
//}

void hammr(x,y,n)
float *x,*y;
Lampiran

int n;
{
int i;

--x;
--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);
Lampiran

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:
if(k>=j)
goto L50;

j-=k;
k=(int)(k/2.0);
goto L40;
Lampiran

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)
j++;
g0=(float)1.0e+30;
g1=(float)1.0e+30;
Lampiran

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

Anda mungkin juga menyukai