Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Dosen Pembimbing :
Drs. Miftahul Huda, MT
Oleh:
Disetujui oleh
Tim Penguji Proyek Akhir: Dosen Pembimbing:
3. Sritrusta Sukaridhoto, ST
NIP.132.300.372
Mengetahui:
Ketua Jurusan Telekomunikasi
ii
ABSTRAK
iii
ABSTRACT
iv
KATA PENGANTAR
Penulis
v
UCAPAN TERIMA KASIH
Penyusun
vi
DAFTAR ISI
HALAMAN JUDUL i
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
vii
2.2.2 String Dan List …………………………………….. 18
2.2.3 Expresi matematika ………………………………... 19
2.2.4 Kondisi …………………………………………….. 19
2.2.5 Procedur ……………………………………………. 19
2.3. Snack …………………………………………………….. 20
2.4. Membuat Extensi snack di C/ C++ …………………....... 21
viii
4.4 Hasil pengujian terhadap proses DTW ………………........ 63
BAB V PENUTUP
5.1 Kesimpulan ……………………………………………….. 67
5.2 Saran ………………………………………………………. 67
ix
DAFTAR GAMBAR
x
Gambar 3.12 Flochart proses cepstrum 36
Gambar 3.13 Flowchart proses dynamic programming 37
Gambar 3.14 Flowchart proses power 38
Gambar 4.1 Tampilan software untuk model perekaman 44
Gambar 4.2 Tampilan software untuk model perekaman 45
Gambar 4.3 Hasil front end kata ”word” 48
Gambar 4.4 Hasil frame kata ”word” 49
Gambar 4.5 Hasil window kata “word” 50
Gambar 4.6 Hasil FFT kata “word” 52
Gambar 4.7 Hasil liftering kata “word” 53
Gambar 4.8 Hasil cepstrum kata “word” 54
xi
DAFTAR TABEL
xii
BAB I
PENDAHULUAN
1.2 TUJUAN
Tujuan pengolahan sinyal wicara sebagai kendali akses ini adalah
untuk mengolah sinyal wicara agar dapat dikenali sebagai perintah untuk
membuka suatu aplikasi pada komputer.
1.3 PERMASALAHAN
a) Pengambilan data input yang merupakan sinyal suara dengan
menggunakan software tcl/tk dan menjadikannya sebagai data
standart dalam database.
1
2
b) Bagaimana cara pematchingan sinyal yang masuk dengan sinyal
yang ada pada database sehingga sinyal independent bisa dikenali
sebagai perintah untuk membuka program aplikasi.
1.5 METODOLOGI
Proyek Akhir ini dilakukan melalui beberapa tahap yaitu sebagai
berikut:
¾ Perekaman Suara Sebagai Sample
Perekaman suara dari 20 orang dengan jenis kelamin yang berbeda
yaitu 10 orang wanita dan 10 orang laki-laki dengan kata yang sama.
Perekaman tersebut dilakukan secara berulang-ulang dengan kata yang
berbeda dari perekaman sebelumnya. Kata-kata yang direkam
merupakan feature yang ada pada komputer, dalam hal ini antara lain:
microsoft word, excel, explorer, power point, dan notepad.
¾ Pembuatan Database
Pembuatan database dari sinyal-sinyal suara yang telah
diambil/direkam sebagai sinyal standart dari feature-feature aplikasi
komputer yang akan digunakan dalam proyek akhir ini, yaitu microsoft
word, excel, explorer, power point, dan notepad.
3
¾ Proses Pematchingan
Pematchingan dan pengambilan rata-rata dari masing-masing user
pada database sehingga pada saat ada sinyal independent (sinyal baru)
yang masuk dapat dicari nilai errornya. Data dengan nilai error terkecil
diasumsikan mempunyai tipikal suara yang sama dengan sinyal suara
standart dan akan diijinkan untuk melakukan akses pada komputer
untuk membuka suatu program aplikasi.
BAB 1 : PENDAHULUAN
Pada bab ini akan diterangkan secara singkat mengenai latar
belakang, tujuan dan manfaat, batasan masalah, dan sistematika
pembahasan proyek akhir.
BAB 5 : PENUTUP
Bab ini berisi tentang kesimpulan yang diambil dari hasil
analisa serta saran-saran yang diharapkan dapat memberikan
pengembangan dan penyempurnaan proyek akhir ini.
4
Rongga
hidung/nasal
cavity
Lintasan Langit-langit
vokal Lunak/velumLangit-langit
Keras/palatu
m
Bibir/labia
Pita
5
6
berikut:
2000
1500
1000
500
0 Series1
-500 1 27 53 79 105 131 157 183 209 235
-1000
-1500
-2000
Gambar 2.2. sinyal suara untuk bunyi vokal “O” didalam 1 frame (pria)
2.1.4 Windowing
Pada langkah ini dilakukan fungsi weighting pada setiap frame
yang telah dibentuk pada langkah sebelumnya. Windowing diperlukan
untuk mengurangi efek diskontinuitas dari potongan – potongan
sinyal[1].
Dimana jenis windowing ada beberapa macam yaitu Hamming,
Hanning, Bartlet, Rectanguler dan Blackman[6]. Persamaan windowing
sebagai berikut :
♦ Window Hamming
{1 − cos[2πn /( N − 1)]} / 2 0 ≤ n ≤ N −1
Whan(n) =
0 elsewhere
♦ Window Bartlett
2n /( N − 1) 0 ≤ n ≤ (N −1) / 2
WB(n) = 2 − 2n /( N − 1) (N −1) / 2 ≤ n ≤ N −1
0 elsewhere
♦ Window Blackman
H = ∫ h(t) e-jwt dt
H(k) = ∑ h(n)e
Dengan k : 0,1,2,…,N-1
2.1.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[8].
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(ω) |
Menghitung invers dari Fourier Transform dengan rumus dia
atas, menghasilkan quefrency, yang mempunyai bentuk matematis
sebagai berikut:
F −1 log X (ω ) = F −1 log G (ω ) + F −1 log H (ω )
Quefrency adalah x-axis dari cepstrum yang merupakan suatu
unit dalam domain waktu.
Cepstrum bisa didefinisikan dengan beberapa cara sebagai
berikut[8]:
• Verbal : Cepstrum adalah Fourier Transform dari log dari
Fourier Transform
12
j
F=c 1,c 2,…,c k,…,cK ck=(I k,Jk)
J
i
0 1 2 3 4 5 6 I
∑ d (ck )wk
k =1
D( F ) = K
2.1
∑ wk
k =1
∑ wk = I + J
k =1
2.5
j A djustm ent
w indow
bJ
W arping function
j=i+j C K = ( I,J )
bj C = ( i,,j )
C4
C2 C5
b2
C3
b1 C1
i
a1 a2 ai aI
⎡ k ⎤ ⎡ k ⎤
∑
c1,...,ck−1⎢
∑
g(ck) = g(i, j) = min ⎢ d(cm)wm⎥ + min ⎢ d(cm)wm+ d(ck)wk⎥
⎥⎦ c1,...,ck−1⎢⎣m=−1 ⎥⎦
⎣m=−1
2.7
⎡ k ⎤
⎣
∑
= min ⎢ min { d(cm)wm}+ d(ck)wk⎥ + min[g(ck −1) + d(ck)wk]
c1,...,ck−1⎢c1,...,ck−1
m=−1 ⎥⎦ ck−1
Oleh karena itu jarak antara dua rentetan waktu A dan B setelah
DTW dapat diperoleh sebagai berikut :
Kita set dari kondisi awal untuk g(1,1)=2d(1,1) dan j=1, dan
hitung persamaan 2.7 dengan variasi I dalam sepanjang adjusment
window. Perhitungan ini diulangi dengan menaikkan j sampai j=1. Jarak
keseluruhan antara dua rentetan waktu A dan B dapat diperoleh dari
g(I,J)/(I+J).
II
P1 Æ (1,1)(1,0)
P2 Æ (1,1)
P3 Æ (1,1)(0,1)
III
P1 Æ (2,1)
P2 Æ (1,1)
P3 Æ (1,2)
2.3 Snack
Snack merupakan software yang digunakan untuk pemrosesan
suara yang dipakai sebagai extensi dalam suatu bahasa pemrograman[4].
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[4]. 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
interfaces).
21
#/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
24
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 (pembandingan) keluaran
agar bisa dikenali sebagai perintah untuk membuka aplikasi komputer
dan instalasi software yang pada proyek akhir ini menggunakan snack
dan tcl/tk serta cara membuat file ekstensi .dll.
25
26
6. Pada menu Link pilih input kemudian isi seperti pada petunjuk
dibawah ini :
A. Pada Object / Library Moduls ketik tclstub83.lib tkstub83.lib
snackstub22.lib
B. Pada Ignore Library ketik MSVCRT,LIBC
C. Pada Additional Library Path ketik C:\Program
Files\Tcl\lib\,C:\Program Files\Tcl\lib\snack2.2\
29
Sinyal
suara
Sampling Frame Windowing FFT
Blocking
Open
Aplikasi
Data
base
3.4.2 Sampling
Seperti yang telah dijelaskan pada sub bab 2.1.2, disebutkan bahwa
frekuensi sampling yang digunakan adalah sebesar 12000 Hz, dimana
dalam 1 detik sinyal tersebut terdapat 12000 titik sampling.
Sebagai contoh, pada gambar dibawah, mempunyai sinyal
sepanjang 20 ms disampling dengan frekuensi sampling sebesar 12000
Hz, akan menghasilkan titik sampling sebanyak 240 titik.
32
6000
4000
2000
0
0 50 100 150 200 250 300
-2000
-4000
-6000
M u la i
S in y a l
M a s u k a n
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
3.4.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.
Persamaan dari window hamming adalah sebagai berikut :
Mulai
240 data
sampel
i=0;i<240;i++
Hamming W indow
y[i]=x[i]*(0.54-0.46*cos(2*phi*(i-1)/240))
Tampilkan nilai
hamming
Selesai
240 data
sampel
512 data
sampel
i=0;i<512;i++
tmp_log1=(xr[k]*xr[k]+xc[k]*xc[k])
Tidak
tmp_log1 > 0
Ya
xr[k]=10*log10(tmp_log1) xr[k]=10*log10(0.000001)
Tampilkan nilai
FFT
Selesai
3.4.6 Cepstrum
Cepstrum adalah fourier transform dari logaritma autospektrum.
Berguna untuk membatasi periodiksitas pada autospektrum. Cepstrum
juga berfungsi untuk menggandakan domain frekuensi. Alur dari proses
cepstrum ditunjukkan dalam flowchart dibawah ini:
36
Mulai
FFT
Liftering
FFT
Temp_log1 > 0
xr[k]=10*log10(tmp_log1) xr[k]=10*log10(0.000001)
Selesai
M u la i
i= 0 ;i< N ;i+ +
j= 0 ;j< 1 5 ;j+ +
C e p s tr u m
S ta n d a r
S td _ C e p s [i][j]
C e p s tr u m
In p u t
In p _ C e p s [i][j]
D P _ d is t = D P _ m a tc h 1 (r )
D P _ d is t
S e le s a i
M u la i
P o w e r= 0
i= 0 ; i< 2 4 0 ; i+ +
P o w e r = P o w e r + s q r t ( x i* x i)
S e le s a i
#!/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
#image create photo test -speaker.gif
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]]
if { $data == 100 } {
.a4.l configure -text "notepad"
41
4.1 Pendahuluan
Pada bab ini akan menjelaskan tentang pengujian dan analisa
terhadap kinerja software yang telah dibuat. Dengan demikian akan
diketahui tingkat keberhasilan dan tingkat kekurangan dari sistem atau
software yang telah dibuat dalam proyek akhir kali ini.
Pengujian yang dilakukan meliputi :
1. Pengujian dan analisa sistem pengolahan sinyal suara
2. Pengijian dan analisa hasil DTW programming
3. Pengujian dan analisa perintah membuka aplikasi komputer
43
44
Pada gambar diatas ada empat 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 Rec 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 di kotak enrty. Dalam
penulisan nama file harus berakhiran .wav
45
0
0
0
0
0
0
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
-1
0
0
-4
-11
-15
…...
47
20000
15000
10000
5000
0
0 500 1000 1500 2000
- 5000
- 10000
- 15000
- 20000
5363
3987
2387
772
-1281
-2686
-3428
-4633
-5226
…..
15000
10000
5000
0
0 50 100 150 200 250 300
-5000
-10000
-15000
0
-30.5328
15.22472
49.3978
49.49345
49.40797
61.52465
51.88983
48.32829
77.31812
93.9732
90.18658
97.31226
97.95297
61.56849
26.04348
16.90727
-3.58391
-28.1854
-22.3372
……
15000
10000
5000
0
0 100 200 300
-5000
-10000
-15000
23.4375
46.875
70.3125
93.75
117.1875
140.625
164.0625
187.5
210.9375
234.375
257.8125
281.25
304.6875
328.125
351.5625
375
398.4375
421.875
52
445.3125
468.75
492.1875
515.625
539.0625
562.5
585.9375
………….
12
10
0
0 2000 4000 6000 8000
4.2.6 Liftering
Pengujian selanjutnya setelah proses FFT adalah liftering. Sebelum
proses liftering dilakukan hasil dari FFT di invers terlebih dahulu. Hasil
dari IFFT (Invers Fast Fourier Transform) diliftering dengan cara
memprosesnya kembali dengan Fast Fourier Transform (FFT) yang
bertujuan untuk mendapatkan hasil yang sebenarnya. Pada liftering ini
data yang diambil adalah 16 data saja tiap framenya yang bisa mewakili
semua data yang telah terolah dalam FFT.
Hasil liftering dari kata “word” dalam bentuk text adalah sebagai
berikut:
53
3778.073
461.6266
59.36542
142.1309
7.593797
-54.139
64.98378
8.605387
-63.7242
96.76607
-80.3779
-46.2153
-59.2706
-81.9811
37.50924
40.94503
4000
3500
3000
2500
2000
1500
1000
500
0
-500 0 5 10 15 20
4.2.7 Cepstrum
Cepstrum pada dasarnya sama dengan FFT, hanya saja hasil dari
cepstrum harus melewati beberapa proses, seperti yang telah dijelaskan
di atas yaitu dari hasil FFT harus di invers dulu untuk mendapatkan nilai
lifternya dan untuk mendapatkan nilai cepstrum maka nilai lifter tersebut
harus diproses dengan FFT kembali, hasil dari proses FFT kedua inilah
54
7
6
5
4
3
2
1
0
0 100 200 300
1.00, pada saat diinputkan kata sembarang akan tetap mengenali dan
memproses inputan tersebut sebagai sebuah perintah sehingga tingkat
akurasinya buruk.
Dari tabel 4.1 – 4.15 dapat dianalisa bahwa:
1. Nilai treshold antara 0.5 – 1.00 memiliki tingkat prosentasi
keakuratan yang berbeda-beda, untuk treshold=0.5, prosentase
ketepatan sistem dalan mengeksekusi adalah dibawah 50%, untuk
treshold=0.75, prosentase ketepatan sistem dalam mengeksekusi
adalah sekitar 50% - 60% dan akurasi terbaik didapat pada nilai
treshold sebesar 1.00, pada nilai prosentase keberhasilan sistem
dalam mengeksekusi data hampir mendekati 100%. Sedangkan
untuk nilai di atas 1.00 tingkat akurasinya buruk sebab setiap
inputan (sembarang inputan) tetap diproses oleh sistem dan
dikenali sebagai perintah eksekusi. Dengan kata lain semakin kecil
nilai treshold maka semakin kecil nilai batas toleransi untuk nilai
hasil pematchingan dan semakin besar nilai treshold maka semakin
besar pula nilai toleransi untuk hasil pematchingan pada sistem.
2. Dengan menggunakan Dynamic time warping dan nilai minimal
serta sorting, pengukuran jarak yang terkecil digunakan sebagai
penunjuk perintah yang benar.
3. Prosentase keberhasilan pengucap / speaker pertama untuk ke-lima
(5) macam perintah pada nilaii treshold=1.00 hampir semua
mendekati 100%, dimana dapat dilihat dari nilai-nilai yang di-blok
tebal, semuanya menunjukkan pada sinyal masukan dan sinyal
standar yang sama.
4. Dengan didapatkannya hasil diatas, maka dapat dikatakan bahwa
cepstrum merupakan salah satu parameter yang tepat untuk
digunakan sebagai pembanding ciri sinyal suara individu.
5. Hasil pengujian menunjukkan bahwa ciri sinyal suara yang
dihasilkan oleh pengucap / speaker pertama dan sebagai pemberi
standar adalah mendekati sama.
6. Perbedaan jenis kelamin membawa perbedaan yang sangat jauh
pada ciri sinyal suara, dimana suara untuk wanita memiliki
frekuensi yang lebih tinggi dari suara pria.
64
5.1 Kesimpulan
Berdasarkan pada hasil pengujian dan analisa terhadap hasil yang
didapatkan, maka dapat diambil suatu kesimpulan yaitu :
1. Pengoperasian aplikasi komputer dapat dilakukan dengan
menggunakani perintah suara.
2. Dengan menggunakan metode dynamic programming – dynamic
time warping, dapat dicari pemadanan suatu wicara dengan
mengukur jarak antara sinyal input dengan sinyal standar.
3. Sistem pengucap tak bebas atau dependent speaker memiliki
tingkat akurasi yang tinggi untuk pengucap masukan dan pengucap
standar yang sama.
4. Akurasi sistem pengucap bebas (independent speaker) hampir
mendekati nilai standart walaupun tidak bernilai 100%, hal ini
dikarenakan frekuensi suara manusia yang berbeda-beda satu sama
lainnya.
5. Nilai treshold mempengaruhi berhasil tidaknya user untuk
mengeksekusi program, treshold dengan nilai 1,00 adalah nilai
treshold terbaik yang bisa digunakan untuk megeksekusi program.
6. Keberhasilan sistem dapat ditunjukkan dengan perhasilnya perintah
suara mengeksekusi aplikasi program pada komputer.
5.2 Saran
Mengingat masih banyaknya hal-hal yang belum dapat
diimplementasikan pada proyek akhir ini, maka kami
mempertimbangkan beberapa saran untuk perbaikan-perbaikan proyek
akhir kami ini dalam hal :
1. Tingkat pengurangan noise pada waktu perekaman suara yang
semakin baik.
2. Desain tampilan software yang semakin baik. Dalam hal ini
penulis menyarankan untuk menggunakan visual Tcl.
3. Otomatis sistem, sehingga pengguna tidak perlu lagi
menggerakkan mouse untuk memberikan perintah.
67
68
[1] http://www.relisoft.com/Science/Physics/fft.html.
[2] http://en.wikipedia.org/wiki/Fast_Fourier_Transform.
[3] http://www.speech.cs.smu.edu/comp.speech/Section6/Q6.6.html#i
ntro.
[4] Huda Miftahul, Bima, “Pelatihan Tcl/Snack”, PENS – ITS,
Surabaya, 2005.
[5] Ambardar Ashok, “Analog and Digital Signal Processing – 2nd ed”,
Brooks/Cole Publising Company, 1999.
[6] John. G. Proakis, Dimitris. G. Monolakis, “Digital Signal
Processing: principles, algorithms, and application”, Prentice Hall,
Inc, New Jersey, 1995.
[7] Lawrence Rabiner, Biing Hwang Juan, “Fundamentals of Speech
Recognition”, Prentice Hall International Inc, 1993.
[8] Sadaoki Furui. “Digital Speech Processing Synthesis, and
Recognition”, Marcell Dekker, Inc, New York, 1989.
69
LAMPIRAN
#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],out_pow_2[5000],out_pow_3[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++)
{
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);
70
71
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];
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);
}
72
float Power(data)
float *data;
{
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");
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;
73
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(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=240;k<256;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=256;k<512;k++)
{
real[k]=0;
imag[k]=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(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
74
cal_fft(real,imag,beki,inv2);
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]);
fprintf(flog,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
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);
75
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 dtbase(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
{
fsignal=fopen("data\\standart\\sinyal_w1.txt","w");
finfo=fopen("data\\standart\\info_w1.txt","w");
fframe=fopen("data\\standart\\frame_w1.txt","w");
fsignalframe=fopen("data\\standart\\signalframe_w1.txt","w");
fpower=fopen("data\\standart\\power_w1.txt","w");
fhamm=fopen("data\\standart\\hamm_w1.txt","w");
ffft=fopen("data\\standart\\fft_w1.txt","w");
flift=fopen("data\\standart\\lift_w1.txt","w");
flog=fopen("data\\standart\\log_w1.txt","w");
fceps=fopen("data\\standart\\ceps_w1.txt","w");
{
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(frame=0;frame<frame_no-1;frame++)
{
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=240;k<512;k++)
fprintf(fhamm,"%f\t%f\n",ms=ms+spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=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(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
77
cal_fft(real,imag,beki,inv2);
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]);
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*6000.f/256.f,real[k]);
}
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);
78
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,*fstd2,*fstd3,*fstd4,*fstd5;
FILE *fframe,*fout1,*fout2,*frata1,*fthreshold;
int i,j,r;
static int out=1;
float DP_dist,hasil[101],min,rata,rata1,threshold;
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_w1.txt","r");
fstd2=fopen("data\\standart\\log_w2.txt","r");
fstd3=fopen("data\\standart\\log_w3.txt","r");
fstd4=fopen("data\\standart\\log_w4.txt","r");
fstd5=fopen("data\\standart\\log_w5.txt","r");
fout1=fopen("data\\hasil\\out1.txt","a");
fout2=fopen("data\\hasil\\out.txt","w");
frata1=fopen("data\\hasil\\rata.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 word 1 *****/
fframe=fopen("data\\standart\\frame_w1.txt","r");
fscanf(fframe,"%d\n",&st_blk);
fclose(fframe);
for(i=0;i<st_blk;i++)
{
79
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 word 2 *****/
fframe=fopen("data\\standart\\frame_w2.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;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[2]=DP_dist;
// trace();
/***** Menghitung jarak antara sinyal input dan standar word 3 *****/
fframe=fopen("data\\standart\\frame_w3.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();
80
/***** Menghitung jarak antara sinyal input dan standar word 4 *****/
fframe=fopen("data\\standart\\frame_w4.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;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[4]=DP_dist;
// trace();
/***** Menghitung jarak antara sinyal input dan standar word 5 *****/
fframe=fopen("data\\standart\\frame_w5.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\n",hasil[i]);
min=hasil[1];
for(i=1;i<=5;i++)
{
if(min>=hasil[i])
{
min=hasil[i];
out=i;
}
}
threshold=hasil[out];
rata=0;
for(i=1;i<=5;i++)
81
{
rata+=hasil[i];
}
rata1=rata/5;
fprintf(fout2,"%d\n",out);
fprintf(fthreshold,"%f\n",hasil[out]);
fprintf(frata1,"%f\n",rata1);
fclose(fin);
fclose(fstd1);
fclose(fstd2);
fclose(fstd3);
fclose(fstd4);
fclose(fstd5);
fclose(fout1);
fclose(fout2);
fclose(frata1);
fclose(fthreshold);
return TCL_OK;
}
/*
Initialize the square package and create a new sound command 'global'.
The syntax is: sndName global
*/
#ifdef USE_SNACK_STUBS
if (Snack_InitStubs(interp, "2", 0) == NULL) {
return TCL_ERROR;
}
#endif
Snack_AddSubCmd(SNACK_SOUND_CMD, "reset",(Snack_CmdProc *)
Reset,NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "signal",(Snack_CmdProc *)
Signal,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;
--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;
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;
83
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)
{
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);
}
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;
L50:
j=j+k;
}
}
float DP_match1(r)
84
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;
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;
}
}
85
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);
}
i=in_blk-1;
j=st_blk-1;
dist_I[0]=i;
dist_J[0]=j;
for(k=1;k<n;k++)
{
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_w1[jml_1 - dist_J[k]]);
}
fclose(fjejak);
fclose(fsin_warp);
}
Nama : Yesika Eka Kartikasari
Tempat/Tanggal Lahir : Tuban, 27 Maret 1985
Alamat Asal :Tuwirikulon, Kec.Merakurak, Kab.Tuban
Telepon/Hp : (0356) 711774 / 081553254868
Alamat Surabaya : Jl. Tegal Mulyorejo Baru No.73
Telepon : (031) 5912351
Hobi : Doing something interest
Cita-cita : Become the real women
Motto : Life is what you think and what you do,
so….Do the best to get the best things
”Tiada suatu bencana pun yang menimpa di bumi dan (tidak pula)
pula pada diri kalian kecuali telah tertulis dalam kitab (Lauh Mahfuzh)
sebelum kami menciptakannya. Sesungguhnya yang demikian itu mudah
bagi Allah. (Kami jelaskan itu)
supaya kalian tidak putus asa atas apa yang luput dari kalian, dan
supaya kalian tidak
terlalu gembira terhadap apa yang diberikan kepada kalian.
Allah tidak menyukai orang yang sombong lagi membangkang.”
(QS. Al-Hadid : 22-23)
xiii