Gambar 4.5. Tampilan GUI Program Pengenalan Pada tampilan GUI digunakan tools pada Matlab seperti axes, pop_upmenu, text,
dan pushbutton.User dapat menjalankan program pengenalan ucapan dengan mengisi pengaturan user, lebar segmentaveragingdan nilai k pada KNN pada pop_upmenu yang
akan diproses untuk pengenalan ucapan. Setelah memilih pengaturan yang diinginkan, program bisa dijalankan dengan menekan tombolREKAM apabila user tidak melakukan
pengaturan pada variasi nilai yang terdapat pada aplikasi GUI maka program tidak bisa dijalankan. Hasil rekama
n suara akan ditampilan pada “PLOT INPUT UCAPAN” dan hasil ektraksi rekaman suara akan ditampilkan di “PLOT EKSTRAKSI CIRI” seperti pada
gambar 4.5. Tombolpushbutton “RESET” berfungsi jika user ingin merestart program
pengenalan ucapan. Tombol pushbuttonKELUAR digunakan jika user ingin menyelesaikan program dan keluar dari tampilan utama program pengenalan ucapan.
4.2.1. Pop Up Menu
Pada aplikasi pengenalai ini terdapat 2 variasi nilai yang digunakan untuk melakukan pengenalan ucapan yaitu nilai k pada knn dan nilai segmentaveraging. Variasi
user menggunakan popupmenu 1 dengan nilai variasi 1;2;3. Variasi nilai segmentaveraging
menggunakan popupmenu2 dengan nilai variasi 8;16;32;62. Variasi nilai k pada knn menggunakan popupmenu3 dengan nilai variasi 1;3;5;7. Program variasi
pada popupmenu 1 akan dituliskan seperti berikut:
indeks=gethandles.popupmenu1,Value; switch indeks
case 1 user=1;
case 2 user=2;
case 3 user=3;
end handles.xuser=user;
guidatahObject,handles;
Pada program pop up menu 1 diguanakan untuk variasi user dengan variasi 1;2;3. Inisialisasi tiap nilai dengan variabel “user” kebudian diubah menjadi “xuser”
menggunakan fungsi “handles”. Proses ini sama dengan program popupmenu sebelumnya.
segav=gethandles.popupmenu2,Value; switch segav
case 1 frame=8;
case 2 frame=16;
case 3 frame=32;
case 4 frame=64;
end handles.varse=frame;
guidatahObject,handles;
Pada program pop up menu 2 diguanakan untuk variasi nilai segmentaveraging dengan nilai 8;16;32;64. Inisialisasi tiap nilai dengan variabel “frame” kemudian diubah menjadi
“varse” menggunakan fungsi “handles”. Proses ini sama dengan program popupmenu
sebelumnya.
nknn=gethandles.popupmenu3,Value; switch nknn
case 1 knn=1;
case 2 knn=3;
case 3 knn=5;
case 4 knn=7;
end handles.varknn=knn;
guidatahObject,handles;
Pada program pop up menu 3 digunakan untuk variasi nilai k pada knn dengan nilai 1;3;5;7
. Inisialisasi tiap nilai dengan variabel “knn” kemudian diubah menjadi “varknn” menggunakan fungsi “handles”. Proses ini sama dengan program popupmenu sebelumnya.
4.2.2. Tombol Rekam
Tombol “REKAM” merupakan tombol yang berfungsi melakukan pengenalan ucapan mulai dari inisialisasi perekamansampling, preemphasis, normalisasi,
pemotongan sinyal,zeropadding, framingwindowing, ektraksi ciri, korelasi, penentuan hasil keluaran pada GUI dan pengiriman data serial menuju mikrokontroler.
Program perekaman pengenalan ucapan dibuat sesuai perancangan diagram blok pada gambar 3.17. Penulisan program untuk melakukan perekaman sebagai berikut.
sample_length=2; sample_freq=6000;
sample_time=sample_lengthsample_freq; x=wavrecordsample_time, sample_freq;
Program perekaman ucapan angka memakai frekuensi sampling 6000 Hz dan durasi perekaman 2 detik. Program sample_time berfungsi untuk menampilkan gambar
perekaman sebesar 12000 Hz. Ucapan angka yang telah direkam ditampilkan dalam “Plot
input ucapan ”. Program untuk menampilkan gambar sinyal hasil perekaman ucapan angka
adalah sebagai berikut :
axeshandles.axes1; plotx;
Program preprocessing dilakukan agar masukan data sinyal ucapan dapat diolah terlebih dahulu. Program preprocessing terdiri dari 4 bagian yaitu preemphasis,
normalisasi , pemotongan sinyal dan zeropadding. Program dituliskan sebagai berikut:
varuser=handles.xuser; varse=handles.varse;
vark=handles.varknn; Preemphasis
b0=0.3; x0=x;
usig=4096; alpha=0.95;
for k=2:lengthx0 x0k=x0k-alphax0k-1;
end Normalisasi
x1=x0maxabsx0; PEMOTONGAN SINYAL:
Potong kiri b1=findx1b0 | x1-b0;
x11:b11=[]; Potong kanan
x2=fliplrx1; b2=findx2b0 | x2-b0;
x21:b21=[]; x2=fliplrx2;
ZERO PADDING x2usig=0;
x3=x21:usig;
Proses preemphasis merupakan proses awal dimana sinyal masukan akan diupdate nilainya dari sebelumnya. Nilai preemphasis menggunakan fungsi for dan dimulai dari 2
dimana jika dimulai dari 1 tidak terdapat nilai sebelumnya. Proses perhitungan preemphasis
sesuai pada perancangan dengan nilai alpha 0.95. Proses preemphasis mengacu pada flowchart yang telah dibuat pada gambar 3.18
Proses normalisasi melakukan perubahan skala pada data dengan memasukan rumus sesuai pada perancangan. Terdapat fungsi Matlab untuk memudahkan program
yakni “max” untuk mencari nilai tertinggi dan “abs” untuk mengubah semua data menjadi mutlak atau bernilai positif. Proses normalisasi mengacu pada perancangan flowchart yang
telah dibuat pada gambar 3.19. Prosesselanjutnya adalah pemotongan sinyal proses dimana nilai data yang berada
pada kondisi lebih besar dari batas potong atau lebih kecil dari negatif batas potong akan diambil datanya. Hasil dari tersebut tidak menampilkan nilai datanya melainkan
menampilkan nomor urutan datanya. Data urutan pertama menjadi batas akhir pemotongan data, sehingga data hasil normalisasi akan dihilangkan dari awal hingga data tersebut.
Proses zeropadding dilakukan dengan menambahkan dengan deretan nilai data “0”
setelah data hasil pemotongan sinyal. Terdapat pendeklarasian variabel “usig” yang
merupakan ukuran deretan data dengan nilainya sebanyak 4096 sesuai perancangan. Program penambahan deretan “0” hingga data ke 4096.
Setelah proses preprocessing dilanjutkan dengan proses framing dan windowing sebelum masuk pada tahap proses ektraksi ciri. Program framing dan windowing dituliskan
sebagai berikut:
pjseg=512; ovlseg=128;
h=hammingpjseg; n=1;k=1;
while n==1 pjx0=lengthx3;
if pjx0=pjseg xseg=x31:pjseg;
xseg=xseg.h; segmtx:,k=xseg;
x31:pjseg-ovlseg=[]; k=k+1;
elseif pjx0==0 n=0;
else x3pjseg=0;
xseg=x3.h; segmtx:,k=xseg;
n=0; end
end
Pada tahap proses framing dan windowing dibutuhkan pendeklarasian nilai panjang frame
[15]dan nilai overlap[20]. Proses framing menggunakan program while dimana mencari kesamaan data dengan panjang frame. Didalam proses framing terdapat proses
windowing dmana berfungsi untuk membuat pola pada sinyal. Hasil dari proses
sebelumnya dibandingan panjang sinyal data dengan panjang frame. Jika data lebih besar dari panjang framemenuju proseswindowing, lalu akan di kurangi dengan nilai overlap
pada pendeklarasian sebesar 128. Jika data lebih kecil dari panjang frame akan ditambahkan data 0 sesuai panjang frame. Pada proses windowing yang terdapat pada
framing menggunakan jendela hamming. Proses Matlab terdapat fungsi untuk
menggunakan jendela hamming dengan formula”hammingL”. Variabel “L” merupakan
banyaknya deretan data yang akan diproses. Penulisan program yang dipakai untuk menentukan pola hamming ditulis
“hammingpjseg”. Proses framing dan windowing mengacu pada flowchart yang ditulis pada gambar 3.21.
Program ektraksi ciri terdapat 2 proses yaitu DFT dan segmentaveraging. Program ektraksi ciri dituliskan sebagai berikut:
Ektraksi ciri menggunakan DFT [baris,kolom]=size segmtx;
for k=1:kolom hdft=absdftxsegmtx:,k;
x4:,k=hdft:; end
x4=x4:; x4=x41:lengthx42,:;
Segment averaging x5=reshapex4,varse,[];
x5=meanx5; x=x5:;
axeshandles.axes2
barx;
Pada ektraksi ciri pemanggilan fungsi DFT digunakan fungsi ekternal dimana program dibuat terpisah dari program inti. Fungsi ekternal dibuat mengacu pada rumus
2.15. Program fungsi ekternal untuk ektraksi ciri DFT dituliskan sebagai berikut :
Perhitungan DFT function y=dftx
N=lengthx; y=zeros1,N;
for k=1:N for n=1:N
w=exp-1i2pik-1n-1N; a=xnw;
yk=yk+a; end
end
Proses dilakukan dengan memanggil fungsi yang sudah dibuat pada M-file dengan nama fungsi
“dft”, kemudian nilai datanya diabsolutkan dengan bantuan fungsi Matlab “abs”. Pada fungsi mengacu pada persamaan 2.15 dengan indeks n dimulai dari 1 karena
proses pada Matlab tidak mengenal indeks 0[27]. Proses transformasi tersebut dilanjutkan dengan mengambil setengah bagian sinyal data dengan program yang ditulis
“x4=x41:lengthx42,:”. Fungsi “length”merupakan fungsi untuk mencari banyaknnya deretan data, sehingga fungsi “lengthx4 akan mencari banyaknya deretan data pada
variabel x4. Variabel
“x4” merupakan hasil dari transformasi DFT. Program mengacu pada flowchart perancangan gambar 3.22.
Proses segmentaveraging dilakukan dengan menggunakan fungsi pada Matlab yaitu “reshapex5,varsegment,[ ]”. Nilai “x5” merupakan data hasil ektraksi ciri segment
averaging , sedangkan nilai “varse” merupakan lebar segment averaging data. Data hasil
segment averaging tersebut akan ditampilkan dengan bentuk grafik dengan menggunakan
fungsi “bar”. Fungsi “bar” merupakan grafik dengan gambar berbentuk batang sesuai panjang data
. Fungsi “axeshandles.axes2” digunakan untuk memilih axis pada kolom plot ekstraksi sebagai tempat menampilkan grafiik.
Program pengenalan pola dilakukan dengan cara perhitungan nilai koeralasi data masukan terhadap basis data. Pendekatan terbaik adalah data yang mempunyai nilai
korelasi terbesar. Proses selanjutnya setelah penggambaran sinyal ucapan adalah proses pemanggilan
database yang telah disesuaiakn dengan variasi segmentaveraging. Program database
menggunakan logika “ifelse” agar database mempunyai kesamaan dengan nilai variasi yang telah dipilih sebelumnya oleh user. Program pembuatan database mengacu pada
lampiran L31. Program pemanggilan database dapat ditulis sebagai berikut:
if varse==8 varuser==1 load db01dseg8;
elseif varse==16 varuser==1 load db01dseg16;
elseif varse==32 varuser==1 load db01dseg32;
elseif varse==64 varuser==1 load db01dseg64;
Program diatas untuk memanggil database yang akan dibandingkan dengan ucapan yang telah terekam. Data base yang dipanggil sesuai dengan masukan user mana yang
dipilh dan variasi segment averaging yang dipilih oleh usertersebut pada pop_upmenu sebelumnya. Kondisi pemanggilan fungsi harus sesuai dengan variasi dan pemanggilan
database .
Proses selanjutnya adalah membandingkan database dengan data masukan dari user
secara real time. Perbandingan database dan masukan sinyal tersebut menggunakan perhitungan korelasi. Program perhitungan korelasi sebagai berikut :
for n=1:100 jarakn=korelasix,z:,n;
end
Pada perhitungan korelasi menggunakan pemanggilan fungsi ekternal dimana program perhitungan berada diluar program utama. Pemanggilan fungsi dengan memanggil
fungsi “korelasi”. Program pembuatan fungsi ekternal sebagai berikut:
function k=korelasix,z mx=meanx;
my=meanz; k1=x-mx.z-my;
k2=sumk1; k3=sumx-mx.2;
k4=sumz-my.2; k5=sqrtk3.k4;
k=k2k5;
Pada program penghitungan nilai korelasi digunakan dua variabel yaitu „x‟ dan „z‟. „x‟ adalah hasil penghitungan ekstraksi ciri secara real time dan „z‟ adalah database.
Setelah didapatkan penghitungan nilai korelasi selanjutnya masuk dalam program penentuan keluaran. Program penentuan keluaran berfungsi untuk menentukan apakah
ucapan terdeteksi sebagai ucapan atau dikenali secara “error”. Program penentuan keluaran sebagai berikut :
knn kk=vark;
m=10; [s1,s2]=sortjarak,descend;
kj=s11:kk; kn=s21:kk;
hk=ceilknm; kout=modehk
idx=findhk==kout; lokth=idx1;
nilai=kjidx; th=s1lokth;
jarakk=th if kout == 1 varuser==1 th 0.7207
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 1 varuser==1 th 0.7207
korout = {satu} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,a
fcloses; deletes;
clear s; elseif kout == 2 varuser==1 th 0.7539
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 2 varuser==1 th 0.7539
korout = {dua} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,b
fcloses; deletes;
clear s;
elseif kout == 3 varuser==1 th 0.6230 korout = {ERROR}
hasilout=korout; sethandles.edit1,string,hasilout
elseif kout == 3 varuser==1 th 0.6230 korout = {tiga}
hasilout=korout; sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,c
fcloses; deletes;
clear s; elseif kout == 4 varuser==1 th 0.7306
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 4 varuser==1 th 0.7306
korout = {empat} kirim = d;
hasilout=korout; sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,d
fcloses; deletes;
clear s; elseif kout == 5 varuser==1 th 0.7005
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 5 varuser==1 th 0.7005
korout = {lima} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,e
fcloses; deletes;
clear s; elseif kout == 6 varuser==1 th 0.6100
korout = {ERROR}
hasilout=korout; sethandles.edit1,string,hasilout
elseif kout == 6 varuser==1 th 0.6100 korout = {enam}
hasilout=korout; sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,f
fcloses; deletes;
clear s; elseif kout == 7 varuser==1 th 0.7002
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 7 varuser==1 th 0.7002
korout = {tujuh} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,g
fcloses; deletes;
clear s; elseif kout == 8 varuser==1 th 0.7510
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 8 varuser==1 th 0.7510
korout = {delapan} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,h
fcloses; deletes;
clear s; elseif kout == 9 varuser==1 th 0.7903
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 9 varuser==1 th 0.7903
korout = {sembilan}
kirim = i; hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,i
fcloses; deletes;
clear s; elseif kout == 10 varuser==1 th 0.7340
korout = {ERROR} hasilout=korout;
sethandles.edit1,string,hasilout elseif kout == 10 varuser==1 th 0.7340
korout = {nol} hasilout=korout;
sethandles.edit1,string,hasilout
s=serialCOM15,BaudRate,9600,DataBits,8,parity,none,Sto pBits,1,FlowControl,none;
fopens; fprintfs,c,j
fcloses; deletes;
clear s;
Pada program penentuan keluaran diatas menggunakan metode k-Nearest Neighbor
dan untuk menentukan bukan ucapan menggunakan metode thersholding. Variasi KNN menggunakan variabel
“vark. Pada metode k-NearestNeigbor bertujuan untuk mengambil kelas terdekat dari perhitungan korelasi
. Fungsi “descend” pada program berfungsi untuk mengurutkan nilai korelasi dari yang terbesar sampai yang terkecil.
Metode thresholding bertujuan untuk menentukan hasil keluaran yang tidak sesuai dengan ucapan pada database
dengan penamaan “ ERROR”.
4.2.3. Tombol Reset