DCT dan Pembanding (Jarak Divergensi)
4.1.2 Pushbutton 1 Tombol “ REKAM ”
Gambar 4.8. Listing program “USER”
Program di atas berisi inisialisasi “USER” dengan masukan tiga user. Inisialisasi tersebut digunakan untuk memilih masing-masing user yang sudah ditentukan pada perancangan. Inisialisasi “Case” digunakan untuk menentukan user yang akan dikenali ucapannya di database sesuai dengan user yang dipilih.
4.1.2 Pushbutton 1 Tombol “REKAM”
Pushbutton 1 merupakan tombol “REKAM” dan merupakan tombol utama dalam proses perekaman ucapan user untuk mengatur kecepatan putar kipas AC. Tombol “REKAM” berisikan beberapa sub proses program untuk proses perekaman ucapan user. Sub proses tersebut terdiri dari perekaman ucapan user , Normalisasi, pemotongan Sinyal (potong kiri, potong kanan),windowing (Hamming), zero padding, ekstraksi ciri DCT, pengambilan variabel batas potong, Segment averaging, KNN dan pemilihan user. Listing program perekaman ucapan user diperlihatkan pada gambar 4.9.
Gambar 4.9. Listing program “REKAM”
Listing program “REKAM” di atas berisi perekaman ucapan user. Program sample_length merupakan durasi perekaman ucapan selama 1,5 detik dan program sample_freq merupakan frekuensi yang digunakan yaitu 6000 Hz. Pada program
sample_length=1,5; sample_freq=6000; sample_time=(sample_length*sample_freq); x=wavrecord(sample_time, sample_freq); axes(handles.axes1) plot(x);
function popupmenu7_Callback(hObject, eventdata, handles) indeks=get(handles.popupmenu6,'Value'); switch indeks case 1 user=1; case 2 user=2; case 3 user=3; end handles.xuser=user; guidata(hObject,handles);
sample_time didapat hasil perkalian antar durasi waktu dan frekuensi yang akan ditampilkan pada gambar hasil rekaman sebesar 2400 Hz. Program wavrecord digunakan untuk merekam ucapan user dan hasil perekaman akan ditampilkan dalam bentuk plot pada “HASIL REKAMAN”. Listing Program axes(handles.axes1) digunakan untuk menampilkan hasil perekaman. Handles digunakan untuk mengatur masukan dan keluaran program. Hasil rekaman ucapan user, diinisialisasi dengan “x”. Inisialisasi “x” ini yang di -plot-kan ke dalam “axes.1”.
Setelah perekaman ucapan user dengan variabel batas potong, segment averaging, KNN, dan pemilihan user selesai dilakukan maka tampilan berupa plot pada “HASIL REKAMAN” maka proses selanjutnya yaitu proses ekstraksi ciri DCT dengan hasil keluarannya berupa plot yang akan ditampilkan pada “HASIL EKSTRAKSI DCT”. Pada proses eksraksi ciri DCT akan ada beberapa proses yang dijalankan yaitu preprocessing yang di dalamnya terdapat Normalisasi, pemotongan sinyal (potong kiri, potong kanan), windowing (Hamming), zero padding, DCT dan segment averaging (frame averaging) yang disimpan dalam variabel “y” . Listing program ditunjukkan pada gambar 4.10.
Gambar 4.10. Listing program ekstraksi ciri DCT b0=handles.bpotong; fram=handles.frame; suser=handles.xuser; knn=handles.nearest; %Normalisasi x1=x/max(abs(x)); %potong kiri b1=find(x1>b0 | x1<-b0); x1(1:b1(1))=[]; %potong kanan x2=fliplr(x1'); b2=find(x2>b0|x2<-b0); x2(1:b2(1))=[]; x2=fliplr(x2); %hamming h=hamming(length(x2)); x3=x2.*h'; %zero padding usig=2048; x3(usig)=0;
Gambar 4.10. (lanjutan) Listing program ekstraksi ciri DCT
Listing program di atas bertujuan untuk menampilkan keluaran plot pada “HASIL EKSTRAKSI DCT”. Setelah proses perekaman ucapan user dilanjutkan dengan Pre processing. Dari hasil ekstraksi ciri DCT di atas maka program axes(handles.axes2) akan digunakan untuk menampilkan hasil perekaman dengan plot variabel “y”. Hasil rekaman ucapan user yang diplotkan dalam axes2.
Proses selanjutnya setelah gambar plot hasil ekstraksi ciri adalah proses pemanggilan database yang disesuaikan dengan variasi nilai batas potong dan segment averaging yang telah dipilih sebelumnya. Listing program pemanggilan database ditunjukan pada gambar 4.11.
Gambar 4.11. Listing program pemanggilan database
if(b0==0.2) & (fram==4) & (suser==1) load db024
elseif(b0==0.3) & (fram==4) & (suser==1) load db034
elseif(b0==0.4) & (fram==4) & (suser==1) load db044
elseif(b0==0.5) & (fram==4) & (suser==1) load db054
elseif(b0==0.2) & (fram==8) & (suser==1) load db028
elseif(b0==0.3) & (fram==8) & (suser==1) load db038
elseif(b0==0.4) & (fram==8) & (suser==1) load db048 X4=x3(1:usig); %DCT x5=abs(dct(x4)); x5=log(x5); %reshape x6=reshape(x1,fram,[]); x7=mean(x6); y=x7(:); axes(handles.axes2) plot(y);
Gambar 4.11. (lanjutan) Listing program pemanggilan database
elseif(b0==0.5) & (fram==8) & (suser==1) load db058
elseif(b0==0.2) & (fram==16) & (suser==1) load db0216
elseif(b0==0.3) & (fram==16) & (suser==1) load db0316
elseif (b0==0.4) & (fram==16) & (suser==1) load db0416
elseif (b0==0.5) & (fram==16) & (suser==1) load db0516
elseif (b0==0.2) & (fram==32) & (suser==1) load db0232
elseif(b0==0.3) & (fram==32) & (suser==1) load db0332
elseif(b0==0.4) & (fram==32) & (suser==1) load db0432
elseif(b0==0.5) & (fram==32) & (suser==1) load db0532
elseif (b0==0.2) & (fram==64) & (suser==1) load db0264
elseif(b0==0.3) & (fram==64) & (suser==1) load db0364
elseif(b0==0.4) & (fram==64) & (suser==1) load db0464
elseif(b0==0.5) & (fram==64) & (suser==1) load db0564
elseif (b0==0.2) & (fram==128) & (suser==1) load db02128
elseif(b0==0.3) & (fram==128) & (suser==1) load db03128
elseif(b0==0.4) & (fram==128) & (suser==1) load db04128
elseif(b0==0.5) & (fram==128) & (suser==1) load db05128
Gambar 4.11. (lanjutan) Listing program pemanggilan database
elseif (b0==0.2) & (fram==256) & (suser==1) load db02256
elseif(b0==0.3) & (fram==256) & (suser==1) load db03256
elseif(b0==0.4) & (fram==256) & (suser==1) load db04256
elseif(b0==0.5) & (fram==256) & (suser==1) load db05256
elseif(b0==0.2) & (fram==4) & (suser==2) load db124
elseif(b0==0.3) & (fram==4) & (suser==2) load db134
elseif(b0==0.4) & (fram==4) & (suser==2) load db144
elseif(b0==0.5) & (fram==4) & (suser==2) load db154
elseif(b0==0.2) & (fram==8) & (suser==2) load db128
elseif(b0==0.3) & (fram==8) & (suser==2) load db138
elseif(b0==0.4) & (fram==8) & (suser==2) load db148
elseif(b0==0.5) & (fram==8) & (suser==2) load db158
elseif(b0==0.2) & (fram==16) & (suser==2) load db1216
elseif(b0==0.3) & (fram==16) & (suser==2) load db1316
elseif (b0==0.4) & (fram==16) & (suser==2) load db1416
elseif (b0==0.5) & (fram==16) & (suser==2) load db1516
elseif (b0==0.2) & (fram==32) & (suser==2) load db1232
Gambar 4.11. (lanjutan) Listing program pemanggilan database
elseif(b0==0.3) & (fram==32) & (suser==2) load db1332
elseif(b0==0.4) & (fram==32) & (suser==2) load db1432
elseif(b0==0.5) & (fram==32) & (suser==2) load db1532
elseif (b0==0.2) & (fram==64) & (suser==2) load db1264
elseif(b0==0.3) & (fram==64) & (suser==2) load db1364
elseif(b0==0.4) & (fram==64) & (suser==2) load db1464
elseif(b0==0.5) & (fram==64) & (suser==2) load db1564
elseif (b0==0.2) & (fram==128) & (suser==2) load db12128
elseif(b0==0.3) & (fram==128) & (suser==2) load db13128
elseif(b0==0.4) & (fram==128) & (suser==2) load db14128
elseif(b0==0.5) & (fram==128) & (suser==2) load db15128
elseif (b0==0.2) & (fram==256) & (suser==2) load db12256
elseif(b0==0.3) & (fram==256) & (suser==2) load db13256
elseif(b0==0.4) & (fram==256) & (suser==2) load db14256
elseif(b0==0.5) & (fram==256) & (suser==2) load db15256
elseif(b0==0.2) & (fram==4) & (suser==3) load db224
elseif(b0==0.3) & (fram==4) & (suser==3) load db234
Gambar 4.11. (lanjutan) Listing program pemanggilan database
elseif(b0==0.4) & (fram==4) & (suser==3) load db244
elseif(b0==0.5) & (fram==4) & (suser==3) load db254
elseif(b0==0.2) & (fram==8) & (suser==3) load db228
elseif(b0==0.3) & (fram==8) & (suser==3) load db238
elseif(b0==0.4) & (fram==8) & (suser==3) load db248
elseif(b0==0.5) & (fram==8) & (suser==3) load db258
elseif(b0==0.2) & (fram==16) & (suser==3) load db2216
elseif(b0==0.3) & (fram==16) & (suser==3) load db2316
elseif (b0==0.4) & (fram==16) & (suser==3) load db2416
elseif (b0==0.5) & (fram==16) & (suser==3) load db2516
elseif (b0==0.2) & (fram==32) & (suser==3) load db2232
elseif(b0==0.3) & (fram==32) & (suser==3) load db2332
elseif(b0==0.4) & (fram==32) & (suser==3) load db2432
elseif(b0==0.5) & (fram==32) & (suser==3) load db2532
elseif (b0==0.2) & (fram==64) & (suser==3) load db2264
elseif(b0==0.3) & (fram==64) & (suser==3) load db2364
elseif(b0==0.4) & (fram==64) & (suser==3) load db2464
Gambar 4.11. (lanjutan) Listing program pemanggilan database
Listing program di atas merupakan pemanggilan database yang di dalam database terdapat program variabel batas potong, program segment averaging dan program pemilihan user. Program tersebut digunakan untuk mencocokan data yang telah tersimpan dengan data ucapan user. Proses pemanggilan database menggunakan fungsi if else fungsi logika yang digunakan bertujuan agar dapat mencocokan variabel batas potong, segment averaging dan pemilihan user yang dipilih oleh user.
Proses pembuatan database berdasarkan masing-masing nilai variabel batas potong, segment averaging dan pemilihan user yang sudah ditentukan dan disimpan dalam bentuk file.mat di dalam satu directory dengan nama seperti contoh pada Gambar 4.11. Listing program database yaitu db25256. Tujuan pembuatan file.mat agar mudah dilakukan pemanggilan di dalam program database dan di dalam file.mat terdapat data ucapan hidup, cepat, lambat, dan mati yang sudah dimasukan variabel batas potong, segment averaging dan pemilihan user yang sudah ditentukan untuk pengenalan ucapan. Pada saat pembuatan database setiap nama file.wav sesuai dengan ucapan masing-masing user yaitu user 1 menggunakan nama file 1 sampai 10, user 2 menggunakan nama file 11 sampai 20 dan user 3 menggunakan nama file 21 sampai 30. Pembuatan database ini diperlihatkan pada program “function z=zciri(fwav,b0,fram)“. listing program pembuatan database diperlihatkan pada gambar 4.12.
elseif(b0==0.5) & (fram==64) & (suser==3) load db2564
elseif (b0==0.2) & (fram==256) & (suser==3) load db22256
elseif(b0==0.3) & (fram==256) & (suser==3) load db23256
elseif(b0==0.4) & (fram==256) & (suser==3) load db24256
elseif(b0==0.5) & (fram==256) & (suser==3) load db25256
Gambar 4.12. Listing program pembuatan database
function dbxciri b0=0.5;
fram=256;
z1=zciri ('hidup',b0,fram); z2=zciri ('cepat',b0,fram); z3=zciri ('lambat',b0,fram); z4=zciri ('mati',b0,fram);
z=[z1 z2 z3 z4]; save db25256z %=============================================================== %INTERNAL FUNCTION function z=zciri(fwav,b0,fram)
x1=wavread([fwav '21.wav']);y=potong(x1,b0);e1=xdct(y,fram); x2=wavread([fwav '22.wav']);y=potong(x2,b0);e2=xdct(y,fram); x3=wavread([fwav '23.wav']);y=potong(x3,b0);e3=xdct(y,fram); x4=wavread([fwav '24.wav']);y=potong(x4,b0);e4=xdct(y,fram); x5=wavread([fwav '25.wav']);y=potong(x5,b0);e5=xdct(y,fram); x6=wavread([fwav '26.wav']);y=potong(x6,b0);e6=xdct(y,fram); x7=wavread([fwav '27.wav']);y=potong(x7,b0);e7=xdct(y,fram); x8=wavread([fwav '28.wav']);y=potong(x8,b0);e8=xdct(y,fram); x9=wavread([fwav '29.wav']);y=potong(x9,b0);e9=xdct(y,fram); x10=wavread([fwav '30.wav']);y=potong(x10,b0);e10=xdct(y,fram); z=[e1 e2 e3 e4 e5 e6 e7 e8 e9 e10]; %=============================================================== function bp=potong(x0,b0); %Normalisasi x1=x0/max(abs(x0)); %potong kiri b1=find(x1>b0 | x1<-b0); x1(1:b1(1))=[]; %Potong kanan x2=fliplr(x1'); b2=find(x2>b0 | x2<-b0); x2(1:b2(1))=[]; x2=fliplr(x2); bp=x2; %===============================================================
Gambar 4.12. (lanjutan) Listing program pembuatan database
Listing program database di atas mirip dengan program pada Gambar 4.11. Pada inisialisasi Internal Function terdapat variabel x1 sampai x10 yang merupakan pemanggilan teradap file ucapan hidup, cepat, lambat dan mati yang sudah direkam dan disimpan dalam bentuk wav. Proses selanjutnya yaitu eksraksi ciri DCT dan beberapa proses yang dijalankan yaitu preprocessing yang di dalamnya terdapat Normalisasi, pemotongan sinyal (potong kiri, potong kanan), windowing (Hamming), zero padding, DCT dan segment averaging.
Proses selanjutnya setelah proses pemanggilan database yang sudah dibandingkan dengan ucapan user menggunakan fungsi jarak divergensi adalah proses k-nearest neighbor untuk penentuan keluarannya sesuai nilai KNN yang sudah di tentukan yaitu 1, 3, 5 dan 7. Listing program perhitungan pembanding (jarak divergensi) dan k-nearest neighbor dipelihatkan pada gambar 4.13.
Gambar 4.13. Listing program perhitungan fungsi K-Nearest Neighbor
function y=xdct(x0,fram); %windowing h=hamming(length(x0)); x0=x0.*h'; %zero padding usig=2048; x0(usig)=0; x0=x0(1:usig); %DCT x1=abs(dct(x0)); x1=log(x1); %reshape x2=reshape(x1,fram,[]); x2=mean(x2); y=x2(:); for n=1:40 divergensix(n)=divergensi(y,z(:,n)); end divergensimin=find(min(divergensix)==divergensix); mindivergensix=min(divergensix) [x1,x2]=sort(divergensix,'ascend')
Gambar 4.13. (lanjutan) Listing program perhitungan fungsi K-Nearest Neighbor Listing program pada Gambar 4.13. digunakan untuk perhitungan fungsi jarak dan K-Nearest Neighbor. Program “ascend” digunakan untuk menentukan nilai jarak minimal dan dari hasil nilai jarak digunakan untuk menentukan ucapan user yang berhasil dikenali dan akan ditampikan dalam bentuk teks seperti pada program “diveout={'hidup','cepat','lambat','mati'}”. Program “k=knn” digunakan untuk menentukan banyaknya nilai sampel terdekat yang sering muncul dengan menggunakan variasi nilai KNN yaitu 1, 3, 5 dan 7. Setelah beberapa proses pada Gambar 4.13. dilakukan maka proses selanjutnya adalah pengiriman data “string” ke mikrokontroler. Listing program pengiriman serial diperlihatkan pada gambar 4.14.
Gambar 4.14. Listing program pengiriman data serial ke mikrokontroler
Listing program di atas digunakan untuk mengirim data secara serial ke mikrokontroler. Program “fprintf(s,'%c','H')” digunakan untuk mengirim data ucapan user yang berhasil dikenali berupa karakter kode ascii ke mikrokontroler melalui K 125 R. Tabel 4.1. memperlihatkan data ucapan hasil pengenalan yang akan dikirim.
k=knn kj=x1(1:k); kn=x2(1:k) hk=ceil(kn/10) z=modus(hk)
diveout={'hidup','cepat','lambat','mati'}; hasilout=diveout(z);
set(handles.edit1,'string',hasilout);
srl=strcmp('hidup',hasilout);
if srl==1
delete(instrfind); pause (0.1);
s=serial('COM1','BaudRate',9600,'DataBits',8,'parity','none','StopBits',1,'FlowControl','n one'); fopen(s); fprintf(s,'%c','H') fclose(s); delete(s); clear s; end
Tabel 4.1. Tabel Pengenalan Pada Mikrokontroler