Oleh:
INDAH KURNIA SARI
7203 030 047
JURUSAN TELEKOMUNIKASI
POLITEKNIK ELEKTRONIKA NEGERI SURABAYA
INSTITUT TEKNOLOGI SEPULUH NOPEMBER
SURABAYA
2006
i
APLIKASI PENGENALAN PENUTUR
UNTUK SISTEM ABSENSI
DENGAN METODE PENUTUR DEPENDENT
(FASE PEMBELAJARAN)
Oleh:
Disetujui oleh
3. Hary Oktavianto, ST
NIP. 132 300 375
Mengetahui,
Ketua Jurusan Telekomunikasi
iii
ABSTRACT
iv
KATA PENGANTAR
Penulis
v
UCAPAN TERIMA KASIH
Melalui kesempatan ini, penulis ingin menyampaikan ungkapan
rasa terima kasih dari dalam hati atas terselesainya tugas akhir ini.
Khususnya rasa syukur kepada Allah SWT yang telah banyak
memberikan kekuatan dan rahmat-Nya kepada penulis. Dan tanpa
menghilangkan rasa hormat yang mendalam kami mengucapkan rasa
terima kasih kepada pihak-pihak yang telah membantu penulis antara
lain :
vi
DAFTAR ISI
Halaman
HALAMAN JUDUL i
LEMBAR PENGESAHAN ii
ABSTRAK iii
ABSTRACT iv
KATA PENGANTAR v
UCAPAN TERIMA KASIH vi
DAFTAR ISI vii
DAFTAR GAMBAR ix
DAFTAR TABEL xi
DAFTAR PERSAMAAN xii
BAB I PENDAHULUAN
1.1 Latar Belakang 1
1.2 Tujuan 1
1.3 Permasalahan 2
1.4 Batasan Masalah 2
1.5 Metodologi 2
1.6 Sistematika Pembahasan 3
BAB II TEORI PENUNJANG
2.1 Snack 5
2.2 Tcl/tk 6
2.3 Membuat Extensi snack di C/C++ 6
2.4 Sekilas Tentang Visual C++ 9
2.5 Sistem Pengolahan Sinyal Suara 11
2.5.1 Sinyal Suara Manusia 11
2.5.1.1 Sinyal Diskrit 13
2.5.2 Proses Sampling 14
2.5.3 Frame Blocking 15
2.5.4 Windowing 16
2.5.5 FFT (Fast Fourier Transform) 18
2.5.6 IFFT (Inverse Fast Fourier Transform) 20
2.5.7 Liftering 21
2.5.8 Awal dan Akhir Sinyal Suara 21
2.5.8.1 Power 21
2.5.8.2 Front-End Detection 21
vii
BAB III PERENCANAAN DAN PEMBUATAN
3.1 Pendahuluan 23
3.2 Sistem Pengolahan Sinyal Suara 23
3.2.1 Perekaman Suara 24
3.2.2 Sampling 27
3.2.3 Frame Blocking 30
3.2.4 Windowing 32
3.2.5 Fast Fourier Transform 33
3.2.6 IFFT 38
3.2.7 Liftering 38
3.2.8 Mutlak Log 40
3.2.9 FFT Spectrum 42
3.2.10 FFT Cepstrum 44
3.3 Awal Dan Akhir Suatu Sinyal 46
3.3.1 Power 46
BAB IV PENGUJIAN DAN ANALISA
4.1 Pendahuluan 47
4.2 Pengujian Dan Analisa Sistem Pengolahan 47
Sinyal Suara
4.2.1 Perekaman Suara 47
4.2.1.1 Dengan Menggunakan Snack dan 47
Tcl/Tk
4.2.1.2 Dengan Menggunakan Wavesurfer 52
4.2.2 Proses Sampling 54
4.2.3 Proses Windowing 55
4.2.4 Fast Fourier Transform 57
4.2.4.1 Dengan Menggunakan Snack dan 58
Tcl/Tk
4.2.4.2 Dengan Menggunakan Wavesurfer 59
4.2.5 Liftering 59
4.2.6 FFT Cepstrum 60
BAB V PENUTUP
5.1 Kesimpulan 63
5.2 Saran 63
DAFTAR PUSTAKA 65
LAMPIRAN
RIWAYAT HIDUP PENULIS
viii
DAFTAR GAMBAR
Halaman
Gambar 2.1 Contoh aplikasi snack 5
Gambar 2.2 Skema diagram organ penghasil sinyal suara 12
Gambar 2.3 Sinyal suara untuk bunyi vokal “a” didalam 1 frame 13
Gambar 2.4 Bentuk sinyal Diskrit 14
Gambar 2.5 Bentuk sinyal sinus 15
Gambar 2.6 Bentuk sinyal sinus yang telah di sampling 15
Gambar 2.7 Bentuk sinyal yang di Frame Blocking 16
Gambar 2.8 Sinyal kata “indah” tanpa di window 18
Gambar 2.9 Sinyal kata “indah” yang telah di window 18
Hamming
Gambar 2.10 Sinyal di domain waktu 20
Gambar 2.11 Sinyal di domain frekuensi 20
Gambar 3.1 Sistem secara keseluruhan 23
Gambar 3.2 Blok Diagram Sistem keseluruhan 24
Gambar 3.3 Tampilan Software Integrasi dari Snack dan Tcl/Tk 26
Gambar 3.4 Flowchart Sistem Graphical User Interface 27
Gambar 3.5 Sinyal hasil sampling kata “indah” 1 frame 28
Gambar 3.6 Flowchart dari proses sampling 29
Gambar 3.7 Frame blocking sinyal 30
Gambar 3.8 Flowchart dari proses frame blocking 31
Gambar 3.9 Flowchart dari proses windowing 33
Gambar 3.10 Flowchart dari proses FFT 37
Gambar 3.11 Flowchart dari proses liftering 39
Gambar 3.12 Flowchart dari proses mutlak log 41
Gambar 3.13 Flowchart dari proses FFT Spectrum 43
Gambar 3.14 Flowchart dari proses FFT Cepstrum 45
Gambar 3.15 Flowchart dari proses power 46
Gambar 4.1 Tampilan awal perangkat lunak menggunakan 48
Tcl/Tk dan Snack
Gambar 4.2 Tampilan software untuk mode perekaman 49
Gambar 4.3 Tampilan software untuk mode pengujian 50
Gambar 4.4 Tampilan software untuk mode database 51
Gambar 4.5 Perekaman kata “indah” pada Mode Perekaman 52
Gambar 4.6 Perekaman kata “indah” dengan menggunakan 53
wavesurfer
ix
Gambar 4.7 Kotak dialog setting perekaman perangkat lunak 53
wavesurfer
Gambar 4.8 Hasil Sampling kata “indah” pada frame ke-1 55
Gambar 4.9 Hasil windowing kata “indah” pada frame ke-1 57
Gambar 4.10 Fast Fourier Transform untuk kata “indah” pada 58
frame ke-1 dengan menggunakan snack/Tcl/Tk
Gambar 4.11 Fast Fourier Transform untuk kata “indah” pada 59
frame ke-1 dengan menggunakan wavesurfer
Gambar 4.12 Hasil Spectrum dan Cepstrum untuk kata “indah” 61
x
DAFTAR TABEL
Halaman
Tabel 2.1 Sejumlah ekstensi yang dibangkitkan oleh C++ 11
xi
DAFTAR PERSAMAAN
Halaman
Persamaan 2.1 13
Persamaan 2.2 14
Persamaan 2.3 16
Persamaan 2.4 17
Persamaan 2.5 17
Persamaan 2.6 17
Persamaan 2.7 19
Persamaan 2.8 19
Persamaan 2.9 19
Persamaan 2.10 21
Persamaan 2.11 21
Persamaan 3.1 32
Persamaan 3.2 34
xii
BAB I
PENDAHULUAN
1.2 Tujuan
- Mengimplementasikan suatu sistem pengenalan sinyal suara untuk
suatu proses absensi yang menggunakan metode dependent speaker.
- Mempelajari lebih lanjut tentang pengolahan suatu sinyal digital
khususnya pengenalan sinyal suara atau yang biasa disebut dengan
speech recognition.
1.3 Permasalahan
1
Permasalahan dari proyek akhir ini menitikberatkan pada speech
processing, dimana pada speech processing ini terdapat suatu
parameter–parameter yang harus diketahui dari pengolahan sinyal digital
yang digunakan untuk proses pengenalan suara. Parameter – parameter
tersebut adalah proses sampling, frame blocking, windowing, FFT (Fast
Fourier Transform), IFFT (Inverse Fast Fourier Transform), Liftering,
FFT Cepstrum dan DTW (Dynamic Time Warping). Untuk melakukan
penelitian tentang parameter tersebut, perlu dikembangkan suatu
program yang dapat mensimulasikan parameter-parameter tersebut
untuk mewakili proses yang sebenarnya. Metode yang digunakan pada
proyek akhir ini adalah metode dependent speaker dimana pengenalan
identitas pembicara sangat diutamakan.
1.5 Metodologi
Dalam pembuatan proyek akhir ini dibutuhkan langkah-langkah
sebagai berikut:
• Perancangan Sistem
Perancangan sistem tersebut berdasarkan pada petunjuk-
petunjuk yang sudah ada.
• Perancangan dan Pengenalan Perangkat Lunak (Software)
Perancangan dan pengenalan software meliputi software snack
2.2.2 Tcl/Tk 8.3.0 dan juga software bahasa C.
2
Dari hasi perancangan software tersebut diadakan pengujian
terhadap kinerja dari masing-masing bagian.
• Pengujian Sistem
Setelah itu maka dapat dilakukan pengujian secara keseluruhan
dari semua sistem yang telah dibuat.
• Analisa Sistem
Kemudian kita dapat menganalisa sistem tersebut dengan
mencari kekurangan-kekurangan yang ada supaya kita bisa
memperbaiki kekurangan-kekurangan tersebut.
Bab I Pendahuluan
Menguraikan tentang latar belakang, tujuan, permasalahan,
batasan masalah, metodologi, dan sistematika pembahasan
masalah yang digunakan dalam pembuatan proyek akhir ini.
3
Membahas tentang pengujian dari sistem yang telah dibuat,
hasil dari pengujian yang telah dilakukan beserta dengan
analisanya.
Bab V Penutup
Berisi tentang kesimpulan dan saran yang berdasarkan
analisa hasil data yang diperoleh.
BAB II
4
TEORI PENUNJANG
2.1 Snack
Snack adalah sebuah software yang digunakan untuk pemrosesan
suara yang dipakai sebagai extensi dalam suatu bahasa script. Dan
bahasa script yang biasa digunakan bersama – sama dengan snack yaitu
Tcl/Tk, Phyton, Ruby. Dalam proyek akhir ini menggunakan software
snack versi 2.2.2 dan Tcl/Tk 8.3.0.
Snack memiliki perintah – perintah untuk play, record, process, dan
memvisualisasi suara. Snack menyediakan objek suara tingkat tinggi,
dengan manajemen penyimpanan yang fleksibel dan streaming support.
Snack dapat bekerja pada banyak format file suara dan juga dapat
menampilkan visualisasi dari suatu sinyal suara secara real – time.
Snack dapat diperluas dengan perintah-perintah baru yang
beroperasi dalam suatu obyek suara. Selain itu juga memungkinkan
untuk menambah suatu format file suara dan tipe filter yang baru. Snack
dapat digunakan untuk array yang lebar untuk sesuatu yang
berhubungan dengan file-file suara dan data audio. Dari satu baris
perintah yang mudah, seperti memainkan suatu file suara atau
menemukan nilai ekstrim sinyalnya sampai aplikasi-aplikasi analisis
suara yang kompleks dengan suatu tampilan grafis (graphical user
interfaces).
5
bermacam-macam item standar antarmuka GUI untuk memfasilitasi user
untuk mmbuat sebuah tampilan atau desain secara cepat dan juga bisa
untuk pengembangan aplikasi tingkat tinggi lainnya.
Untuk bahasa pemrograman di Tcl/Tk bentuknya sama seperti
bahasa pemrograman di C/C++ terutama pada loop structures, definisi
fungsi dan logika perhitungannya. Didalam Tcl semua data di
representasikan sebagai string.
6
{
Snack_SetSample(sound, 0, i, 10000);
}
else
{
Snack_SetSample(sound, 0, i, -10000);
}
}
return TCL_OK;
}
/*
Initialize the square package and create a new sound command 'square'.
The syntax is: sndName square
*/
EXPORT(int, Square_Init)(Tcl_Interp *interp)
{
#ifdef USE_TCL_STUBS
if (Tcl_InitStubs(interp, "8", 0) == NULL)
{
return TCL_ERROR;
}
#endif
#ifdef USE_TK_STUBS
if (Tk_InitStubs(interp, "8", 0) == NULL)
{
return TCL_ERROR;
}
#endif
#ifdef USE_SNACK_STUBS
if (Snack_InitStubs(interp, "2", 0) == NULL)
{
return TCL_ERROR;
}
#endif
if (Tcl_PkgProvide(interp, "square", "1.0") != TCL_OK)
7
{
return TCL_ERROR;
}
Snack_AddSubCmd(SNACK_SOUND_CMD, "square", (Snack_CmdProc
*)
Square, NULL);
return TCL_OK;
}
8
memungkinkan pemakai membuat, mengkompailisasi, menggabungkan,
dan menguji program dengan cepat dan mudah.
Beberapa komponen penting dalam Visual C++ adalah sebagai berikut:
• Editor
Editor menyediakan sarana bagi pemrogram untuk menuliskan
program. Yang menarik, editor yang disediakan mampu
mengenali kata-kata yang tercadang C++ dan akan memberi
warna tersendiri terhadap kata-kata yang seperti itu.
Keuntungannya, program menjadi lebih mudah dibaca dan
sekiranya kita melakukan kesalahan dalam menuliskan kata-
kata maka akan lebih cepat terdeteksi.
• Kompiler
Kompiler adalah perangkat lunak yang berfungsi untuk
menerjemahkan kode sumber (source code) ke dalam bentuk
bahasa mesin. Piranti ini dapat memberikan pesan-pesan
kesalahan jika terjadi kesalahan kaidah penulisan program
yang terdeteksi pada tahap proses kompalisasi. Hasil
kompalisasi berupa kode objek (object code) yang disimpan
dalam berkas berekstensi .obj (disebut berkas objek).
• Linker
Linker adalah perangkat lunak yang berfungsi menggabungkan
berbagai modul yang dihasilkan oleh kompiler dan modul kode
dari berbagai pustaka C++, serta membentuk menjadi kode
yang dapat dieksekusi. Sebagaimana kompiler , linker juga
dapat mendeteksi kesalahan. Kesalahan yang terjadi sewaktu
proses linking bisa disebabkan karena ada bagian pustaka atau
bagian program yang tidak ditemukan.
• Pustaka
Visual C++ menyediakan berbagai pustaka (library) yang
memudahkan pemrogram dalam melakukan berbagai operasi
seperti menghitung akar kuadrat dan mengakses database.
Pustaka-pustaka yang tersedia antara lain berupa:
o Standart C++ Library (berisi semua rutin yang
tersedia pada kebanyakan kompiler C++)
9
o Microsoft Foundation Classes and Templates
(MFC&T), yang berkaitan dengan pemrograman
Windows.
• AppWizard
Perangkat ini bermanfaat untuk membangkitkan suatu kerangka
dasar aplikasi Windows yang sangat memudahkan pemrogram
untuk membuat aplikasi Windows.
• ClassWizard
Perangkat ini bermanfaat untuk mengedit kelas-kelas yang
dibangkitkan oleh AppWizard.
Ekstensi Keterangan
.dsp Berkas ini berisi definisi dasar sebuah proyek,
berisi informasi tentang bagaimana aplikasi
diciptakan berdasarkan berkas-berkas yang
terdapat pada project workspace.
.dsw Berisi informasi tentang isi proyek.
.opt Berisi data tentang pengaturan-pengaturan
10
dalam proyek; misalnya, menyimpan informasi
tentang kemungkinan aplikasi bisa di debug
atau tidak.
.cpp Berisi kode sumber C++
.h Merupakan berkas judul (header file), yang
umumnya berisi definisi kelas atau berisi
prototipe fungsi.
.rc Berisi resource Microsoft Windows (ikon,
bitmap, dan berbagai kontrol) yang digunakan
oleh aplikasi
.ico Berkas ikon untuk aplikasi
.exe Berkas yang dapat dieksekusi secara langsung
(executable).
11
Gambar 2.2 Skema Diagram Organ Penghasil Sinyal Suara
Sinyal suara merupakan hasil dari suara manusia, dimana sinyal suara
mempunyai frekuensi kerja antara 0 sampai dengan 5000 Hz. Bentuk
gelombang sinyal wicara mempunyai bentuk yang unik seperti pada
gambar 2.3.
12
15000
10000
5000
0
0 50 100 150 200 250 300
-5000
-10000
Gambar 2.3 Sinyal suara untuk bunyi vokal “a” didalam 1 frame
13
Gambar 2.4 Bentuk sinyal Diskrit
14
Gambar 2.5 Bentuk sinyal sinus
15
Jadi jumlah sampel tiap frame = (12000 x 0.002) / 1
= 240 sampel
M
M
N
Gambar 2.7 Bentuk sinyal yang di Frame Blocking
2.5.4 Windowing
Sinyal suara yang dipotong-potong menjadi beberapa frame akan
menyebabkan efek diskotinuitas sehingga menyebabkan kesalahan data
pada proses fourier transform. Windowing diperlukan untuk mengurangi
efek diskontinuitas dari potongan – potongan sinyal.
Dimana jenis windowing ada beberapa macam yaitu Hamming,
Hanning, Bartlet, Rectanguler dan Blackman. Persamaan windowing
sebagai berikut :
♦ Window Hamming
Persamaan (2.3)
♦ Window Hanning
{1 − cos[2πn /( N − 1)]} / 2 0 ≤ n ≤ N −1
Whan(n) =
0 elsewhere
16
Persamaan (2.4)
♦ Window Bartlett
2n /( N − 1) 0 ≤ n ≤ (N −1) / 2
WB(n) = 2 − 2n /( N − 1) (N −1) / 2 ≤ n ≤ N −1
0 elsewhere
Persamaan (2.5)
♦ Window Blackman
Persamaan (2.6)
Dimana:
N = Jumlah data dalam satu window
n = urutan data ke-n
17
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
Gambar 2.8 Sinyal kata “indah” tanpa di window pada frame ke-1
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
Gambar 2.9 Sinyal kata “indah” yang telah di window Hamming pada frame ke-1
18
terhingga (finite duration sequence). DFT berperan penting untuk
implementasi algoritma suatu varitas pengolahan sinyal, karena efisien
untuk komputasi berbagai aplikasi.
Fast fourier Transformation atau transformasi Fourier cepat,
merupakan proses lanjutan dari DFT ( Diskrit Fourier Transformation ).
Transformasi Fourier ini dilakukan untuk mentransformaikan sinyal dari
domain waktu ke domain frekuensi.
FFT adalah bentuk khusus dari persamaan integral fourier :
∫
− jωt
H = h(t )e dt (2.7)
Dengan k : 0,1,2,…,N-1
19
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
7.6
7.4
log10(magnitudo) (dB)
7.2
6.8
6.6
6.4
6.2
0 1000 2000 3000 4000 5000 6000 7000
Frekuensi (Hz)
20
domain waktu. Feature khusus dari cepstrum yaitu berupa struktur dan
selubung spectral.
2.5.7 Liftering
Pada proses ini mengambil 16 buah data yang dapat mewakili seluruh
data. 16 buah data inilah yang nantinya dipakai sebagai fitur yang dapat
mempresentasikan masing – masing frame.
239
p= ∑
i =0
xi 2 (2.10)
21
BAB III
PERENCANAAN DAN PEMBUATAN
3.1 Pendahuluan
Dalam bab ini akan dibahas tentang pengolahan sinyal suara
untuk mendapatkan ciri atau parameter dari suara yang masuk. Selain itu
juga membahas tentang pengolahan sinyal suara tersebut yang
22
digunakan untuk sistem absensi dan instalasi software pada proyek akhir
ini menggunakan snack 2.2.2 dan tcl/tk 8.3.0 serta cara membuat file
ekstensi (.dll) dalam bahasa pemrograman C++.
Microphone PC Speaker
Sinyal Suara
23
Gambar 3.2 Blok Diagram Sistem Keseluruhan
24
2. Perintah pembuatan tombol-tombol untuk perekaman
button .a3.b1 -text Play -command {y play}
button .a3.b2 -text Record -command {y record;z record}
button .a3.b3 -text Stop -command {y stop;z stop;y input;y
database}
button .a3.b4 -text Save -command {y write
data_wav\\$filename.wav;y input;y database}
button .a3.b5 -text Load -command {y read
data_wav\\$filename.wav;y input;y database}
button .a3.b6 -text Exit -command exit
entry .a3.entry -textvariable filename
pack .a3.b1 .a3.b2 .a3.b3 .a3.entry .a3.b4 .a3.b5 .a3.b6 -side left -
padx 5 -pady 10
25
Gambar 3.3 Tampilan Software integrasi dari Snack Dan Tcl/tk
26
Adapun proses untuk sistem yang akan dibuat dapat digambarkan
dengan diagram alir sebagai berikut :
3.2.2 Sampling
Frekuensi sampling yang digunakan adalah sebesar 12000 Hz,
dimana dalam 1 detik sinyal tersebut terdapat 12000 titik sampling
dengan cara mengesetnya pada program Tcl/Tk 8.3.0 dan Snack2.2.
Kemudian untuk mendapatkan data sampel dari suara yang direkam dan
disimpan dalam file berekstensi “.wav” maka dibuat program berbasis
C++ yang diintegrasikan dengan Tcl/Tk 8.3.0 dan Snack2.2.
27
sound=Snack_GetSound(interp,Tcl_GetStringFromObj(objv[0,
NULL));
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k] = (float)Snack_GetSample(sound,0,k);
fprintf(fsignal,"%f\n",x[k]);
}
Data Sampling
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
28
Gambar 3.6 Flowchart dari proses sampling
29
sampel per frame sebesar N dan adjacent frame sebesar M sampel,
dimana M=0.5N. Dengan begitu dapat memudahkan perhitungan dan
analisa suara. Jumlah sampel dalam satu frame tergantung tiap berapa
detik suara akan disampel dan berapa besar frekuensi samplingnya.
Dalam proyek akhir ini penulis mengambil sampel tiap 20 ms
dengan frekuensi sampling sebesar 12000 Hz. Ini berarti tiap satu frame
terdiri dari 240 sampel dengan perhitungan sebagai berikut :
M
M
N
Gambar 3.7 Frame blocking sinyal
Jadi pada satu frame terdapat sebagian nilai yang bernilai sama dengan
frame selanjutnya, atau dengan kata lain pada proyek akhir ini 120
sample terakhir sama dengan 120 sample pertama pada frame
selanjutnya.
start=0;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
30
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
}
3.2.4 Windowing
Windowing yang digunakan pada proyek akhir ini adalah window
hamming. Digunakan windowing ini karena mempunyai hasil yang lebih
baik dalam pembatasan sinyal yang akan dianalisa. Setelah proses
pengambilan sampel maka langkah selanjutnya adalah proses
windowing yang berfungsi untuk mengurangi efek diskontinyuitas pada
ujung-ujung frame yang di hasilkan oleh potongan – potongan sinyal.
31
Persamaan dari window hamming adalah sebagai berikut :
void hammr(x,y,n)
float *x,*y;
int n;
{
int i;
--x;
--y;
for(i=0;i<=n;++i)
{
y[i]=x[i]*(float)(0.54-0.46*cos(2.0*3.14159265*(i)/(float)n))
}
}
32
Gambar 3.9 Flowchart dari proses windowing
33
Adapun untuk proses tersebut menggunakan persamaan sebagai
berikut :
N −1
H (k ) = ∑ h( n )e
n =0
− j 2πnk / N
(3.2)
dengan k = 0,1,2,….,N-1
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;
for(lm=1;lm<=lmx;++lm)
{
34
c=(float)cos(arg);
s=(float)(mode*sin(arg));
arg=arg+scl;
for (li=lix; lix<0 ? li>=np : li<=np; li+=lix)
{
j1=li-lix+lm;
j2=j1+lmx;
t1=x[j1]-x[j2];
t2=y[j1]-y[j2];
x[j1]=x[j1]+x[j2];
y[j1]=y[j1]+y[j2];
x[j2]=c*t1+s*t2;
y[j2]=c*t2-s*t1;
}
}
scl=(float)(2.0*scl);
}
j=1;
nv2=(int)(np/2.0);
npm1=np-1;
for(i=1;i<=npm1;++i)
{
if(i>=j)
goto L30;
t1=x[j];
t2=y[j];
x[j]=x[i];
y[j]=y[i];
x[i]=t1;
y[i]=t2;
L30:
k=nv2;
L40:
35
if(k>=j)
goto L50;
j-=k;
k=(int)(k/2.0);
goto L40;
L50:
j=j+k;
}
}
36
Gambar 3.10 Flowchart dari proses FFT
3.2.6 Invers FFT
37
Invers Fourier Transform adalah kebalikan dari algoritma fourier
transform yaitu algoritma untuk mengubah sinyal suara dari domain
frekuensi menjadi domain waktu.
3.2.7 Liftering
Pada proses ini mengambil 16 buah data yang dapat mewakili
seluruh data. 16 buah data inilah yang nantinya dipakai sebagai fitur
yang dapat mempresentasikan masing – masing frame. Untuk
membuktikan 16 buah data ini dapat mewakili keseluruhan data, dapat
dilakukan proses fourier transform sekali lagi.
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]);
38
Gambar 3.11 Flowchart dari proses Liftering
3.2.8 Mutlak Log (Data Sample yg diambil)
39
Dari 16 data liftering menghasilkan nilai real dan imajiner. Untuk
proses selanjutnya kita membutuhkan nilai real saja, karena itu
diperlukan proses mutlak log.
for(k=0;k<16;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\n",real[k]);
}
40
Gambar 3.12 Flowchart dari proses Mutlak Log
41
Untuk mendapatkan spectrum dari sinyal suara yang diolah,
maka setelah proses IFFT dapat dilakukan proses FFT lagi dengan nilai
orde sebesar 256. Dan berikut merupakan program C++ untuk
mrndapatkan spectrum dari sinyal suara yang diolah :
orde=256;
cal_fft(real,imag,beki,inv);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
42
Gambar 3.13 Flowchart dari proses pengambilan spectrum
43
Pada proses liftering dilakukan pengambilan 16 data dari 256
data yang ada, dimana 16 data itu dapat digunakan sebagai fitur untuk
merepresentasikan masing-masing frame. Untuk membuktikan 16 buah
data ini dapat mewakili keseluruhan data, setelah proses liftering dapat
dilakukan proses FFT sekali.
Berikut merupakan program C++ unuk mendapatkan cepstrum dari
sinyal suara yang diolah :
orde=256;
for(k=orde;k<512-orde;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
cal_fft(real,imag,beki,inv);
for(k=0;k<512;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
44
Gambar 3.14 Flowchart dari proses pengambilan cepstrum
3.3 Awal Dan Akhir Suatu Sinyal
3.3.1 Power
45
Untuk mendapatkan suatu sinyal suara tanpa adanya noise maka
sinyal harus benar-benar dipotong tepat pada awal dan akhir suatu sinyal
pada setiap frame. Oleh karena itu dipakai power sebagai salah satu cara
yang efektif dalam menentukan awal dan akhir suatu sinyal suara.
Dimana tiap frame mempunyai power yang merupakan hasil
kuadratisasi dari penyampelan tiap frame yang kemudian hasil
keseluruhan diakar, seperti yang terlihat pada diagram alir berikut ini :
BAB IV
PENGUJIAN DAN ANALISA
46
4.1 Pendahuluan
Dalam bab ini akan menjelaskan tentang pengujian dan analisa
terhadap cara kerja software yang telah dibuat. Dengan demikian kita
dapat mengetahui tentang keberhasilan dan kekurangan yang ada pada
sistem atau software yang telah dibuat dalam proyek akhir ini. Pengujian
yang akan dilakukan meliputi hal-hal berikut :
1. Pengujian dan analisa sistem pengolahan sinyal suara.
2. Pengujian dan analisa hasil pengolahan sinyal suara yang
kemudian masuk pada database.
47
Gambar 4.1 Tampilan awal perangkat lunak menggunakan Tcl/Tk dan
Snack
48
Gambar 4.2 Tampilan Software untuk Mode Perekaman
49
6. Tombol Database berfungsi untuk menampilkan tampilan
database
7. Tombol Exit berfungsi untuk keluar dari mode perekaman.
50
3. Tombol Stop berfungsi untuk menghentikan proses perekaman
4. Tombol Reset berfungsi untuk kembali dalam keadaan semula.
5. Tombol Exit berfungsi untuk keluar dari mode pengujian.
51
Gambar 4.5 Perekaman kata “Indah” pada Mode Perekaman
Jika tombol Record ditekan maka program akan merekam suatu kata
contoh kata “indah”. Pada tampilan canvas dari Mode Perekaman akan
secara otomatis akan menggambarkan bentuj sinyal suara yang telah
direkam tersebut. Hasil dari proses perekaman kata “indah” dapat kita
lihat pada gambar 4.5.
52
Gambar 4.6 Tampilan hasil perekaman kata “indah” dengan perangkat
lunak menggunakan Wavesurfer
53
Pada data diatas dapat dilihat bahwa suara yang direkam dengan
menggunakan perangkat lunak Wavesurfer mempunyai header dan tail
yang berisi keterangan perekaman yaitu :
Sampel ke Amplitudo
1 2380
2 2013
3 1769
4 1965
5 2096
6 2014
7 1224
8 1219
9 1170
10 735
11 292
12 -30
13 -42
14 -247
15 -563
16 -694
17 -642
54
18 -618
19 -504
20 -598
……… ……..
Data Sampling
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
55
Sampel ke Amplitudo
1 190.7752
2 162.309
3 144.0285
4 162.1517
5 175.9285
6 172.526
7 107.3482
8 109.7735
9 108.4705
10 70.32048
11 28.89133
12 -3.07542
13 -4.46817
14 -27.3066
15 -64.7537
16 -83.1198
17 -80.1285
18 -80.4247
19 -68.415
20 -84.6937
……… ……….
56
Data Windowing
4000
3000
2000
Amplitudo
1000
0
0 50 100 150 200 250 300
-1000
-2000
-3000
Jumlah Data
Frekuensi Magnitudo
0 10.13406
23.4375 10.003432
46.875 9.625627
57
70.3125 9.044689
93.75 8.528451
117.1875 8.997069
140.625 9.305222
164.0625 9.369651
187.5 9.325483
210.9375 9.293427
234.375 9.322831
257.8125 9.407032
281.25 9.429989
304.6875 9.248124
328.125 8.824898
351.5625 8.694233
375 9.158479
398.4375 9.562833
421.875 9.679983
……….. …………
12
10log(magnitudo) (dB)
10
8
6
4
2
0
0 2000 4000 6000 8000
Frekuensi (Hz)
Gambar 4.10 Fast Fourier Transform untuk kata “indah” pada frame ke-1
dengan menggunakan Snack dan Tcl/Tk
58
4.2.4.2 Dengan menggunakan Wavesurfer
Gambar 4.11 Fast Fourier Transform untuk kata “indah” pada frame ke-1 dengan
menggunakan Wavesurfer
4.2.5 Liftering
Pada proses ini mengambil 16 buah data yang dapat mewakili
seluruh data. 16 buah data inilah yang nantinya dipakai sebagai fitur
yang dapat mempresentasikan masing – masing frame. Berikut
merupakan hasil dari liftering dari kata “indah” :
59
4 1.819694
5 2.146674
6 1.647008
7 3.052993
8 3.054889
9 3.152562
10 1.81403
11 1.661876
12 1.818581
13 2.411279
14 1.843486
15 -1.1223
16 1.106728
60
117.1875 7.4125 7.398185
140.625 7.410701 7.434025
164.0625 7.408587 7.436045
187.5 7.406163 7.423129
210.9375 7.403438 7.414341
234.375 7.400421 7.408137
257.8125 7.397125 7.396852
281.25 7.393563 7.390301
304.6875 7.389754 7.399877
328.125 7.385715 7.414151
………. ………. ………..
7.6
log10(magnitudo) (dB)
7.4
7.2
Cepstrum
7
Spektrum
6.8
6.6
6.4
0 2000 4000 6000 8000
Frekuensi (Hz)
Gambar 4.12 Hasil Spectrum dan Cepstrum untuk kata “indah” pada frame
ke-1
61
BAB V
PENUTUP
5.1 Kesimpulan
Berdasarkan pada hasil dari pengujian yang kita lakukan dan
analisa yang kita dapatkan, kita dapat mengambil kesimpulan yaitu :
1. Pengaksesan absensi dapat dilakukan dengan memberi perintah
melalui suara.
2. Sinyal suara manusia dapat dicari ciri atau parameternya dengan
menggunakan metode FFT cepstrum.
3. Pengambilan 16 data awal pada proses liftering dapat mewakili
keseluruhan data.
4. FFT cepstrum merupakan selubung dari FFT spectrum.
5.2 Saran
Dari hasil yang telah dicapai pada proyek akhir ini , maka kami
mempertimbangkan beberapa saran. Dan adapun tujuan dari saran-saran
tersebut untuk perbaikan-perbaikan proyek akhir kami ini dalam hal :
1. Suara masukan yang diucapkan oleh pengucap harus memiliki
intonasi yang sama dengan standart yang ada pada database.
2. Pengambilan data untuk membuktikan kebenaran sistem dapat
dilakukan secara otomatis.
3. Tampilan dapat lebih baik dengan menambahkan desain-desain
yang menarik.
4. Pengurangan noise harus ditingkatkan dengan memperhatikan
power dan standart deviasi dari sinyal suara tersebut agar
pengambilan awal dan akhir suatu sinyal suara dapat lebih
akurat.
5. Perlu dilakukan latihan pengambilan sampel suara tentang jarak
efektif antara microphone dengan mulut.
62
DAFTAR PUSTAKA
63
LAMPIRAN
1.1 Program Tampilan Awal
#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"
package require -exact snack 2.2
load lib\\libglobal
snack::sound s
option add *font {Helvetica 10 bold}
pack [label .l1 -text "Aplikasi Pengenalan Wicara Untuk Sistem Absensi
"]
pack [label .l2 -text "Dengan Metode Dependent Speaker"]
pack [label .l3 -text "by"]
pack [label .l4 -text "Adi Prayitno & Indah Kurnia Sari"]
pack [label .l5 -text ""]
proc Start {} {
s reset
.f.running configure -state normal
.f.recording configure -state normal
}
64
if {$demoFlag != 0} {
$i eval set demoFlag $demoFlag
}
$i eval wm title . $script
$i eval source $script
}
#!/bin/sh
# the next line restarts using wish \
exec wish8.4 "$0" "$@"
# 'info sharedlibext' returns '.dll' on Windows and '.so' on most Unix
systems
load lib\\libglobal
snack::sound z -channels 2
snack::sound x -file sound.wav -debug 0
snack::sound y
65
canvas .a1.canvas -bg white -width 300 -height 200
snack::levelMeter .a1.levelMeter -width 20 -length 200 -orient vertical -
oncolor blue
pack .a1.levelMeter .a1.canvas -side left -padx 5
66
$i eval set demoFlag $demoFlag
}
$i eval wm title . $script
$i eval source $script
}
#!/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
67
pack [label .a1.t1 -text "APLIKASI SPEAKER RECOGNITION
UNTUK SISTEM ABSENSI \n DENGAN METODE DEPENDENT
SPEAKER"] -pady 10
pack [label .a1.t2 -text "Mode Pengujian"] -pady 10
after 1 Update
proc Update {} {
set l [z max -start 0 -end -1 -channel 0]
.a2.time config -text [format "%.3f sec" [u length -unit
seconds]]
z length 0
.a1.levelMeter configure -level $l
after 50 Update
}
proc Announce {} {
set data [read [open data\\hasil\\out.txt]]
set data1 [read [open data\\hasil\\threshold.txt]]
68
x play
} else {
if { $data == 0 } {
.a4.l configure -text "Silahkan Masukkan ID Anda."
}
if { $data == 1 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Indah"
x play
}
if { $data == 2 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Ifa"
x play
}
if { $data == 3 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Fitri"
x play
}
if { $data == 4 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Teguh"
x play
}
if { $data == 5 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Rahma"
x play
}
if { $data == 6 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Bitha"
x play
}
if { $data == 7 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Bibib"
x play
}
69
if { $data == 8 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Vandry"
x play
}
if { $data == 9 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Taufik"
x play
}
if { $data == 10 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Dina"
x play
}
if { $data == 11 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Winda"
x play
}
if { $data == 12 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Retno"
x play
}
if { $data == 13 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Adi"
x play
}
if { $data == 14 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Nilluh"
x play
}
if { $data == 15 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Bagus"
x play
}
70
if { $data == 16 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Wuri"
x play
}
if { $data == 17 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Auriza"
x play
}
if { $data == 18 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Ali"
x play
}
if { $data == 19 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Rudy"
x play
}
if { $data == 20 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Teti"
x play
}
if { $data == 21 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Muhsin"
x play
}
if { $data == 22 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Yugo"
x play
}
if { $data == 23 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Imam"
x play
}
71
if { $data == 24 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Fatur"
x play
}
if { $data == 25 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Zulfan"
x play
}
if { $data == 26 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Puthut"
x play
}
if { $data == 27 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Sari"
x play
}
if { $data == 28 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Aulia"
x play
}
if { $data == 29 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Ruri"
x play
}
if { $data == 30 } {
x read data_wav\\absen_diterima.wav
.a4.l configure -text "Hai Auruma"
x play
}
}
}
72
.a1.canvas create waveform 152 102 -anchor c -sound u -height $height
-tags wave -debug 0 -zerolevel 0 -frame $frame -fill black
#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
float DP_match1(int);
float distance(int,int);
void trace();
sound = Snack_GetSound(interp,
Tcl_GetStringFromObj(objv[0], NULL));
for(i=0;i<Snack_GetLength(sound);i++)
73
{
if((i/10)%2)
{
Snack_SetSample(sound,0,i,10000);
}
else
{
Snack_SetSample(sound,0,i,-10000);
}
}
return TCL_OK;
}
freset=fopen("data\\hasil\\out.txt","w");
fprintf(freset,"%d\n",0);
freset1=fopen("data\\hasil\\threshold.txt","w");
fprintf(freset1,"%d\n",0);
fclose(freset);
fclose(freset1);
return TCL_OK;
}
int front_end_clip(xx,yy,jml_sin)
float *xx,*yy;
int jml_sin;
{
int i,mulai,akhir,jml_sin_new;
float jml=0,mean,dev,jumdev=0,sd,batas;
for(i=0;i<jml_sin;i++)
jml+=xx[i];
74
mean=jml/jml_sin;
for(i=0;i<jml_sin;i++)
{
dev=(float)fabs(xx[i]-mean);
jumdev+=dev*dev;
}
sd=(float)sqrt(jumdev/jml_sin);
batas=mean+sd;
for(i=0;i<jml_sin;i++)
{
if(xx[i]>=batas)
{
mulai=i;
break;
}
}
for(i=jml_sin;i>0;i--)
{
if(xx[i]>=batas)
{
akhir=i;
break;
}
}
jml_sin_new=0;
for(i=mulai;i<akhir;i++)
{
yy[jml_sin_new]=xx[i];
jml_sin_new++;
}
return(jml_sin_new);
}
float Power(data)
float *data;
75
{
int i;
float jum=0,power;
for(i=0;i<240;i++)
jum += (float)pow(data[i],2);
power=(float)sqrt(jum);
return(power);
}
FILE
*fsignal,*finfo,*fframe,*fsignalframe,*fpower,*fhamm,*ffft,*flift,*flog,
*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
76
sound = Snack_GetSound(interp,
Tcl_GetStringFromObj(objv[0], NULL));
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
out_pow_in[frame]=Power(temp);
fprintf(fpower,"%f\n",out_pow_in[frame]);
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
77
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",(k+1)*spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
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]);
}
cal_fft(real,imag,beki,inv2);
78
for(k=16;k<512-16;k++)
{
real[k]=0.0;
imag[k]=0.0;
}
for(k=0;k<256;k++)
fprintf(flift,"%f\t%f\n",(k+1)*spd,real[k]);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(flog,"%f\t%f\n",(k+1)*spd,real[k]);
}
cal_fft(real,imag,beki,inv);
for(k=0;k<256;k++)
{
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
79
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fpower);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
FILE
*fsignal,*finfo,*fframe,*fsignalframe,*fpower,*fhamm,*ffft,*flift,*flog,
*fceps;
Sound *sound;
double temp_log1;
float x[30000],y[30000],temp[30000];
float real[512],imag[512];
float ms,spd;
int k,frame,frame_no,signal_length,signal_length_new,start;
void hammr();
void cal_fft();
80
fpower=fopen("data\\standart\\power_1.txt","w");
fhamm=fopen("data\\standart\\hamm_1.txt","w");
ffft=fopen("data\\standart\\fft_1.txt","w");
flift=fopen("data\\standart\\lift_1.txt","w");
flog=fopen("data\\standart\\log_1.txt","w");
fceps=fopen("data\\standart\\ceps_1.txt","w");
sound = Snack_GetSound(interp,
Tcl_GetStringFromObj(objv[0], NULL));
signal_length = Snack_GetLength(sound);
for (k=0;k<signal_length;k++)
{
x[k]=(float)Snack_GetSample(sound, 0, k);
fprintf(fsignal,"%f\n",x[k]);
}
signal_length_new = front_end_clip(x,&y,signal_length);
for (k=0;k<signal_length_new;k++)
fprintf(finfo,"%f\n",y[k]);
frame_no = signal_length_new/120;
fprintf(fframe,"%d\n",frame_no);
start=0;
ms=0;
spd=(float)20/240;
for(frame=0;frame<frame_no-1;frame++)
{
start=(frame)*120;
for(k=0;k<240;k++)
{
temp[k]=y[start];
fprintf(fsignalframe,"%f\n",temp[k]);
start++;
}
81
out_pow_in[frame]=Power(temp);
fprintf(fpower,"%f\n",out_pow_in[frame]);
for (k=0;k<240;k++)
{
real[k]=temp[k];
imag[k]=0;
}
hammr(real,imag,nlpc);
for(k=0;k<240;k++)
fprintf(fhamm,"%f\t%f\n",(k+1)*spd,real[k]);
for(k=240;k<512;k++)
{
real[k]=0;
imag[k]=0;
}
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;
82
fprintf(ffft,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
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+1)*spd,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+1)*spd,real[k]);
}
cal_fft(real,imag,beki,inv);
for(k=0;k<256;k++)
{
83
temp_log1=(double)(real[k]*real[k]+imag[k]*imag[k]);
if(temp_log1>0)
real[k]=(float)log10(temp_log1);
else
real[k]=(float)log10(0.000001);
imag[k]=0;
fprintf(fceps,"%f\t%f\n",k*6000.f/256.f,real[k]);
}
}
fclose(fsignal);
fclose(finfo);
fclose(fframe);
fclose(fsignalframe);
fclose(fpower);
fclose(fhamm);
fclose(ffft);
fclose(flift);
fclose(flog);
fclose(fceps);
return TCL_OK;
}
int i,j,r;
int out;
float DP_dist,hasil[31],min,threshold;
float in_data,std_data_1;
float in_in,in_1;
84
fin=fopen("data\\input\\log_in.txt","r");
fstd1=fopen("data\\standart\\log_1.txt","r");
fout1=fopen("data\\hasil\\out1.txt","a");
fout2=fopen("data\\hasil\\out.txt","w");
fthreshold=fopen("data\\hasil\\threshold.txt","w");
fframe=fopen("data\\input\\frame_in.txt","r");
fscanf(fframe,"%d\n",&in_blk);
fclose(fframe);
for(i=0;i<in_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fin,"%f\t%f\n",&in_in,&in_data);
in_CEP[i][j]=in_data;
}
}
for(i=0;i<st_blk;i++)
{
for(j=0;j<16;j++)
{
fscanf(fstd1,"%f\t%f\n",&in_1,&std_data_1);
st_CEP[i][j]=std_data_1;
}
}
r=7;
DP_dist=DP_match1(r);
hasil[1]=DP_dist;
85
trace();
for(i=1;i<=30;i++)
fprintf(fout1,"%f\t",hasil[i]);
min=hasil[1];
for(i=1;i<=30;i++)
{
if(min>=hasil[i])
{
min=hasil[i];
out=i;
}
}
threshold=hasil[out];
fprintf(fout2,"%d\n",out);
fprintf(fthreshold,"%f\n",hasil[out]);
fclose(fin);
fclose(fstd1);
fclose(fout1);
fclose(fout2);
fclose(fthreshold);
return TCL_OK;
}
/*
Initialize the square package and create a new sound command
'global'.
The syntax is: sndName global
*/
EXPORT(int, Global_Init)(Tcl_Interp *interp)
{
#ifdef USE_TCL_STUBS
if (Tcl_InitStubs(interp, "8", 0) == NULL) {
return TCL_ERROR;
}
#endif
86
#ifdef USE_SNACK_STUBS
if (Snack_InitStubs(interp, "2", 0) == NULL) {
return TCL_ERROR;
}
#endif
Snack_AddSubCmd(SNACK_SOUND_CMD, "signal",
(Snack_CmdProc *) Signal, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "reset",
(Snack_CmdProc *) Reset, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "input",
(Snack_CmdProc *) Input, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "database",
(Snack_CmdProc *) Database, NULL);
Snack_AddSubCmd(SNACK_SOUND_CMD, "dtw",
(Snack_CmdProc *) Dtw, NULL);
return TCL_OK;
}
#ifdef __cplusplus
#endif
void hammr(x,y,n)
float *x,*y;
int n;
{
int i;
--x;
87
--y;
for(i=0;i<=n;++i)
{
x[i]=x[i]*(float)(0.54-
0.46*cos(2.0*3.141592654*(i)/(float)n));
y[i]=y[i]*(float)(0.54-
0.46*cos(2.0*3.141592654*(i)/(float)n));
}
}
void cal_fft(x,y,l,mode)
float *x,*y,mode;
int l;
{
int np,lmx,lo,lix,lm,li,j1,j2,nv2,npm1,i,j,k;
float scl,arg,c,s,t1,t2;
for(i=0;i<pow(2,l);i++)
y[i]=0;
--x;
--y;
for(lo=1;lo<=l;++lo)
{
lix=lmx;
lmx=(int)(lmx/2.0);
arg=0.0;
for(lm=1;lm<=lmx;++lm)
{
c=(float)cos(arg);
s=(float)(mode*sin(arg));
arg=arg+scl;
for (li=lix; lix<0 ? li>=np : li<=np; li+=lix)
{
88
j1=li-lix+lm;
j2=j1+lmx;
t1=x[j1]-x[j2];
t2=y[j1]-y[j2];
x[j1]=x[j1]+x[j2];
y[j1]=y[j1]+y[j2];
x[j2]=c*t1+s*t2;
y[j2]=c*t2-s*t1;
}
}
scl=(float)(2.0*scl);
}
j=1;
nv2=(int)(np/2.0);
npm1=np-1;
for(i=1;i<=npm1;++i)
{
if(i>=j)
goto L30;
t1=x[j];
t2=y[j];
x[j]=x[i];
y[j]=y[i];
x[i]=t1;
y[i]=t2;
L30:
k=nv2;
L40:
if(k>=j)
goto L50;
j-=k;
k=(int)(k/2.0);
goto L40;
89
L50:
j=j+k;
}
}
float DP_match1(r)
int r;
{
int i,j;
int I,J,up,dp;
float dist,g,g0,g1,g2,g3,a;
float DP_mdist=0.0;
for(i=0;i<in_blk;i++)
{
for(j=0;j<st_blk;j++)
{
G[i][j] = (float)1.0e+30;
}
}
I=in_blk-1;
J=st_blk-1;
a=(float)st_blk/(float)in_blk;
dist=distance(0,0);
G[0][0]=(float)(2.0*dist);
dist=0.0;
for(i=0;i<=I;i++)
{
up=(int)(a*i+r);
if(up>J)
up=J;
dp=(int)(a*i-r);
if(dp<0)
dp=0;
for(j=dp;j<=up;j++)
{
if(i==0 && j==0)
90
j++;
g0=(float)1.0e+30;
g1=(float)1.0e+30;
g2=(float)1.0e+30;
dist = distance(i,j);
if(j-1>=0)
g0 = (float)(G[i][j-1]+dist);
if(i-1>=0 && j-1>=0)
g1 = (float)(G[i-1][j-1]+2.0*dist);
if(i-1>=0)
g2 = (float)(G[i-1][j]+dist);
g3 = (g0<g1) ? g0:g1;
g = (g2<g3) ? g2:g3;
G[i][j] = g;
}
}
DP_mdist = G[I][J]/(st_blk+in_blk);
return(DP_mdist);
}
float distance(ab_t,ab_r)
int ab_t,ab_r;
{
int i;
float a,kyori;
a=0.0;
kyori=0.0;
for(i=0;i<16;i++)
{
a=(in_CEP[ab_t][i]-st_CEP[ab_r][i]);
kyori+=a*a;
}
return(kyori);
}
91
void trace() /*WARPING FUNCTION decision (in case dp_match1)*/
{
FILE *fjejak,*fsin_warp;
FILE *fframe_in,*fframe_1;
FILE *fpower,*fpower_1;
int i,j,k,l,n,p;
int slope_i,slope_i1,slope_j;
int jml_in,jml_1;
float D0,D1,D2,D3;
float dist,distance();
float power_in[5000],power_1[5000];
fjejak=fopen("data\\hasil\\jejak.txt","w");
fframe_in=fopen("data\\input\\frame_in.txt","r");
fframe_1=fopen("data\\standart\\frame_1.txt","r");
fpower=fopen("data\\input\\power.txt","r");
fpower_1=fopen("data\\standart\\power_1.txt","r");
fsin_warp=fopen("data\\hasil\\sin_warp.txt","w");
fscanf(fframe_in,"%d\n",&jml_in);
for(l=0;l<jml_in;l++)
fscanf(fpower,"%f\n",&power_in[l]);
fscanf(fframe_1,"%d\n",&jml_1);
for(l=0;l<jml_1;l++)
fscanf(fpower_1,"%f\n",&power_1[l]);
n=in_blk+st_blk-1;
for(p=0;p<n;p++)
{
dist_I[p]=0;
dist_J[p]=0;
}
i=in_blk-1;
j=st_blk-1;
dist_I[0]=i;
dist_J[0]=j;
for(k=1;k<n;k++)
92
{
dist=distance(i,j);
D0=(float)1.0e+30;
D1=(float)1.0e+30;
D2=(float)1.0e+30;
D3=(float)1.0e+30;
if(i>0)
{
D0=G[i-1][j]+dist;
D3=D0;
}
if(j>0)
{
if(i>0)
D1=(float)(G[i-1][j-1]+dist*2.0);
D2=G[i][j-1]+dist;
D3=(D1<D2) ? D1:D2;
slope_i1=(D1<D2) ? 1:0;
}
slope_i=(D3<D0) ? slope_i1:1;
slope_j=(D3<D0) ? 1:0;
i=i-slope_i;
j=j-slope_j;
if(i<0 || j<0)
break;
dist_I[k]=i; /*absis dan ordinat jejak dtw */
dist_J[k]=j;
fprintf(fjejak,"%d\t%d\n",dist_I[k],dist_J[k]);
fprintf(fsin_warp,"%f\t%f\n",power_in[jml_in -
dist_I[k]],power_1[jml_1 - dist_J[k]]);
}
fclose(fjejak);
fclose(fsin_warp);
}
93
RIWAYAT HIDUP PENULIS
94
95
96