Kamis, 20 Desember 2018

BubbleSort Matlab

>> A=rand(1,8)

A =

    0.4505    0.0838    0.2290    0.9133    0.1524    0.8258    0.5383    0.9961

>> B=bubblesort(A)

B =

    0.0838    0.1524    0.2290    0.4505    0.5383    0.8258    0.9133    0.9961


Adapun Fungsinya adalah sbb:


function x = bubblesort(x)

n = length(x);
while (n > 0)
    nnew = 0;
    for i = 2:n
        if (x(i) < x(i - 1))
            x = swap(x,i,i - 1);
            nnew = i;
        end
    end
    n = nnew;
end

end

function x = swap(x,i,j)
val = x(i);
x(i) = x(j);
x(j) = val;

end


Rabu, 19 Desember 2018

Implementasi Matlab Untuk Tingkat kesegaran Ikan


Yuk Kita Buat GUInya :



Jika nanti dijalankan ahsilnya sbb:




Lalu atur propertis nama TAGnya di setiap itemnya


Lalu pada Button kita kasih Koding




Code ahirnya dalah sbb:

function varargout = myGUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @myGUI_OpeningFcn, ...
                   'gui_OutputFcn',  @myGUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function myGUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);



function btnPilih_Callback(hObject, eventdata, handles)
[handles.namafile,handles.direktori]=uigetfile({'*.xls;*.xlsx','file excel(*.xls,*.xlsx)';'*.*','semua file(*.*)'},'buka file xls master');
I=fullfile(handles.direktori,handles.namafile);

if ~isequal(handles.namafile, 0)
set(handles.edPath,'String',I);
    [a,b,c]=xlsread(I); 

    header= {'Kategori', 'Jam', 'Jenis Ikan', 'bagian', 'R', 'G', 'B'};
    ba=size(c,1);
    co=size(c,2);
    mulaike=2;
    mydata=c(mulaike:ba,1:co);
    rnames = linspace(1,ba-mulaike+1,ba-mulaike+1);

jml=['Total Data Latih ' num2str(ba-1) ' Item']
        set(handles.myTabel1,'data',mydata,'ColumnName',header,'RowName',rnames);
        set(handles.myTabel1,'Userdata',mydata);
        set(handles.txtTotal,'String',jml);
       
       
 r1=10;
 r2=18;
 r3=27;

 ar1=cell2mat(c(2:r1,5));
 ag1=cell2mat(c(2:r1,6));
 ab1=cell2mat(c(2:r1,7));

 ar2=cell2mat(c(r1+1:r2,5));
 ag2=cell2mat(c(r1+1:r2,6));
 ab2=cell2mat(c(r1+1:r2,7));

 ar3=cell2mat(c(r2+1:r3,5));
 ag3=cell2mat(c(r2+1:r3,6));
 ab3=cell2mat(c(r2+1:r3,7));

minr1=min(ar1);
ming1=min(ag1);
minb1=min(ab1);

minr2=min(ar2);
ming2=min(ag2);
minb2=min(ab2);

minr3=min(ar3);
ming3=min(ag3);
minb3=min(ab3);


maxr1=max(ar1);
maxg1=max(ag1);
maxb1=max(ab1);

maxr2=max(ar2);
maxg2=max(ag2);
maxb2=max(ab2);

maxr3=max(ar3);
maxg3=max(ag3);
maxb3=max(ab3);



header= {'Kategori', 'Rmin', 'Rmax', 'Gmin', 'Gmax', 'Bmin', 'Bmax'};
rnames = linspace(1,3,3);
mydata2(1,1)={'Segar'};
mydata2(1,2)={minr1};
mydata2(1,3)={maxr1};
mydata2(1,4)={ming1};
mydata2(1,5)={maxg1};
mydata2(1,6)={minb1};
mydata2(1,7)={maxb1};

mydata2(2,1)={'Cukup Segar'};
mydata2(2,2)={minr2};
mydata2(2,3)={maxr2};
mydata2(2,4)={ming2};
mydata2(2,5)={maxg2};
mydata2(2,6)={minb2};
mydata2(2,7)={maxb2};

mydata2(3,1)={'Tidak Segar'};
mydata2(3,2)={minr3};
mydata2(3,3)={maxr3};
mydata2(3,4)={ming3};
mydata2(3,5)={maxg3};
mydata2(3,6)={minb3};
mydata2(3,7)={maxb3};

set(handles.myTabel2,'data',mydata2,'ColumnName',header,'RowName',rnames);
set(handles.myTabel2,'Userdata',mydata2);
       
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
header= {'Linguistic Term', 'R', 'G', 'B'};
rnames = linspace(1,3,3);
mydata3(1,1)={'Low'};
mydata3(1,2)={'10-91'};
mydata3(1,3)={'11-76'};
mydata3(1,4)={'14-87'};

mydata3(2,1)={'Medium'};
mydata3(2,2)={'14-93'};
mydata3(2,3)={'16-90'};
mydata3(2,4)={'27-88'};

mydata3(3,1)={'High'};
mydata3(3,2)={'44-96'};
mydata3(3,3)={'42-93'};
mydata3(3,4)={'41-97'};

set(handles.myTabel3,'data',mydata3,'ColumnName',header,'RowName',rnames);
set(handles.myTabel3,'Userdata',mydata3);


header= {'Linguistic Term', 'Range'};
rnames = linspace(1,3,3);
mydata4(1,1)={'Segar'};
mydata4(1,2)={'11-76'};

mydata4(2,1)={'Cukup Segar'};
mydata4(2,2)={'27-88'};

mydata4(3,1)={'Tidak Segar'};
mydata4(3,2)={'41-97'};

set(handles.myTabel4,'data',mydata4,'ColumnName',header,'RowName',rnames);
set(handles.myTabel4,'Userdata',mydata4);


end   



function btnBersih_Callback(hObject, eventdata, handles)
proyek=guidata(gcbo);
mau=questdlg(['Reset ' get(proyek.figure1,'Name')''],['Anda ingin Reset  Aplikasi ini?'],'Ya','Tidak','Ya');
if strcmp(mau,'Tidak')
return;
else
    %str=date;
    %set(handles.edjoindate,'String',str);
    set(handles.myTabel1,'data',[],'ColumnName',[],'RowName',[]);
    set(handles.myTabel1,'Userdata',[]);
    set(handles.myTabel2,'data',[],'ColumnName',[],'RowName',[]);
    set(handles.myTabel2,'Userdata',[]);
   
     set(handles.myTabel3,'data',[],'ColumnName',[],'RowName',[]);
    set(handles.myTabel3,'Userdata',[]);
     set(handles.myTabel4,'data',[],'ColumnName',[],'RowName',[]);
     set(handles.myTabel4,'Userdata',[]);
   
   
     set(handles.edPath,'String','');
     set(handles.edMR,'String','');
     set(handles.edMG,'String','');
     set(handles.edMB,'String','');
     set(handles.edPath2,'String','');
   
     set(handles.edHasil1,'String','');
     set(handles.edHasil2,'String','');
     set(handles.edProses,'String','');
   
     set(handles.txtTotal,'String','Total DataLatih 0 Item');

     cla(handles.axes1,'reset');
     cla(handles.axes2,'reset');
     cla(handles.axes3,'reset');
     cla(handles.axes4,'reset');
     cla(handles.axes5,'reset');
   
end


function btnPilih2_Callback(hObject, eventdata, handles)

[handles.namafile,handles.direktori]=uigetfile({'*.jpg;*.bmp','file Image(*.jpg,*.bmp,*.bmp)';'*.*','semua file(*.*)'},'buka file xls master');
I=fullfile(handles.direktori,handles.namafile);

if ~isequal(handles.namafile, 0)
    Matrix=imread(I);
    set(handles.figure1,'CurrentAxes',handles.axes1);
    imshow(Matrix);
    set(handles.axes1,'Userdata',Matrix);
   
   
    MatrixHSV=rgb2hsv(Matrix);
    set(handles.figure1,'CurrentAxes',handles.axes5);
    imshow(MatrixHSV);
    set(handles.axes5,'Userdata',MatrixHSV);
   
    set(handles.btnRGB,'Enable','on');
    set(handles.edPath2,'String',I);
end


function btnRGB_Callback(hObject, eventdata, handles)
Matrix=get(handles.axes1,'Userdata');

R=Matrix(:,:,1);
    set(handles.figure1,'CurrentAxes',handles.axes2);
    imshow(R);
    set(handles.axes2,'Userdata',R);
   
G=Matrix(:,:,2);
    set(handles.figure1,'CurrentAxes',handles.axes3);
    imshow(G);
    set(handles.axes3,'Userdata',G);
   
B=Matrix(:,:,3);
    set(handles.figure1,'CurrentAxes',handles.axes4);
    imshow(B);
    set(handles.axes4,'Userdata',B);
   
MR=mean(mean(R));
MG=mean(mean(G));
MB=mean(mean(B));
set(handles.edMR,'String',num2str(MR));
set(handles.edMG,'String',num2str(MG));
set(handles.edMB,'String',num2str(MB));
 set(handles.btnRGB,'Enable','off');


function btnExit_Callback(hObject, eventdata, handles)
close;













Minggu, 11 November 2018

Menu Editor Matlab

Setelah membuat halaman kosong + backgroud, agar menarik dan hemat tempat buatlah menu editor

Tools-Menu Editor

Buat link sebagai berikut:


function mnuAdmin_Callback(hObject, eventdata, handles)
admin; %memanggil halaman admin

function mnuEmployes_Callback(hObject, eventdata, handles)
matlabEmploye;%memanggil halaman employee

function mnuValue_Callback(hObject, eventdata, handles)
value;%memanggil halaman value

function mnuAplikasi_Callback(hObject, eventdata, handles)
aplikasi;%memanggil halaman aplikasi

function mnuLogout_Callback(hObject, eventdata, handles)
exit;%keluar aplikasi


CMIIW

Matlab 64bit ke Database



1.Download driver Matlab ke databse mysql  mysql-connector-java-3.1.14-bin
2.File jar yag di dapat copas ke C:\Program Files\MATLAB\R2017a\java\jar

3.Buka file C:\Program Files\MATLAB\R2017a\toolbox\local\classpath.txt menggunakan notepad, dan letakkan kode sbb di bagian bawahnya:
$matlabroot/java/jar/mysql-connector-java-3.1.14-bin.jar




4.Buat database db_matlab dengan tabel sbb

CREATE TABLE `tb_admin` (
  `kode_admin` varchar(15) NOT NULL,
  `name` varchar(30) NOT NULL,
  `username` varchar(20) NOT NULL,
  `password` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `tb_employe` (
  `nik` varchar(15) NOT NULL,
  `name` varchar(30) NOT NULL,
  `join_date` varchar(20) NOT NULL,
  `divisi` varchar(20) NOT NULL,
  `department` varchar(20) NOT NULL,
  `tempat_lahir` varchar(30) NOT NULL,
  `tanggal_lahir` varchar(20) NOT NULL,
  `jenis_kelamin` varchar(20) NOT NULL,
  `agama` varchar(15) NOT NULL,
  `pendidikan_terakhir` varchar(15) NOT NULL,
  `jurusan` varchar(30) NOT NULL,
  `status` varchar(30) NOT NULL,
  `alamat` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `tb_value` (
  `id` int(11) NOT NULL,
  `nik` varchar(20) NOT NULL,
  `tanggal_nilai` varchar(20) NOT NULL,
  `month` varchar(20) NOT NULL,
  `year` varchar(10) NOT NULL,
  `age` varchar(10) NOT NULL,
  `nilai` varchar(10) NOT NULL,
  `note` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `tb_admin`
  ADD UNIQUE KEY `kode_admin` (`kode_admin`);

ALTER TABLE `tb_value`
  ADD UNIQUE KEY `id` (`id`);

ALTER TABLE `tb_value`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=607;
COMMIT;

++++++++++++++++++++++++++++
Sehingga hasilnya adalah sebagai berikut





Atau penampakan keseluruhannya adalah sbb:

5.Langkah selanjutnya adalah kita membuat code CRUD:create Read Update dan Delete tb_admin

A.Buat fungsi koneksiadmin() gunanya sebagai penghubung tb_admin dengan database

function [con,table,kolom] = koneksiadmin()
url = 'jdbc:mysql://localhost:3306/';
table='tb_admin';
kolom = {'kode_admin', 'name', 'username', 'password'};
con = database('db_matlab', 'root', '', 'com.mysql.jdbc.Driver', url);
end

B.Buat fungsi lihatadmin() gunanya sebagai code melihat tb_admin database ke database

function [ kolom,mydata,no ] = lihatadmin(varargin)
[con,table,kolom]=koneksiadmin();

tabel=varargin{1};
SQL=['SELECT * FROM ' tabel];
    if length(varargin)==3
        pk=varargin{2};
        kode=varargin{3};

        setdbprefs('NullNumberWrite', 'NaN');
        SQL=['select * from ' tabel ' where ' pk ' like ''%', kode, '%'''];
    end
    curs = exec(con,SQL);
    curs = fetch(curs);
    mydata=curs.Data;
    baris=size(mydata,1);
    no=linspace(1,baris,baris); 
end




C.Membuat Fungsi autoadmin(), gunanya untuk membuat kode autocode kode_admin.....

function [ AU ] = autoadmin( varargin )
[con,table,kolom]=koneksiadmin();
%kode='KAT1407000';
tabel=varargin{1};
pk=varargin{2};
pre=varargin{3};
setdbprefs('NullNumberWrite', 'NaN');
    SQL=['SELECT * FROM ' tabel '  order by ' pk ' desc' ];
    curs = exec(con,SQL);
    curs = fetch(curs);
    mydata=curs.Data;
    baris=size(mydata,1);
 
th=year(date);
bl=month(date);
thn=num2str(th);
thn=thn(3:4);
bln=num2str(bl);
C=1;
if bl<10
    bln=['0' bln];
end
kode=[pre thn bln '001'];
[AU]=[pre thn bln];
if baris>0
    kode=cell2mat(mydata(1,1));
    if strcmp(kode,'No Data')>0
        C=1;
    else
        C1=kode(8:10);
        C=str2num(C1)+1;
        YL=kode(4:5);
        ML=kode(6:7);
        [AU]=[pre YL ML];
        if str2num(thn)~=str2num(YL)
            C=1;
        elseif str2num(bln)~=str2num(ML)
            C=1;
        end

    end   
end

if C <10
  [AU]=[AU '00' num2str(C)];
elseif C <100
  [AU]=[AU '0' num2str(C)];
else
  [AU]=[AU num2str(C)];
end

end


D.Membuat GUI CRUD Admin



E.Buat code sbb di dalamnya:


function varargout = admin(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @admin_OpeningFcn, ...
                   'gui_OutputFcn',  @admin_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function admin_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
axes(handles.axes2); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('logo.jpeg');
axes(handles.axes3); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('bg2.jpeg');
axes(handles.axes4); %memilih axes1 sebagai letak gambar yang dimunculkan
imshow('bg2.jpeg');

global kode_admin;
handles.pk='kode_admin';
handles.tabel='tb_admin';
handles.pre='ADM';

[kolom,mydata,no ]=lihatadmin(handles.tabel,handles.pk);
set(handles.myTable,'data',mydata,'ColumnName',kolom,'RowName',no);
set(handles.myTable,'Userdata',mydata); T=size(mydata,1); [tot]=['Total '
num2str(T) ' data']; set(handles.txtTotal,'String',tot);


[AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
set(handles.edkodeadmin,'String',AU);
guidata(hObject, handles);

guidata(hObject, handles);


function btnSimpan_Callback(hObject, eventdata, handles)
 kode_admin=get(handles.edkodeadmin,'String');
 name=get(handles.edname,'String');
 username=get(handles.edusername,'String');
 password=get(handles.edpassword,'String');

    [con,table,kolom]=koneksiadmin();
 
    kolomsimpan = {'kode_admin', 'name', 'username', 'password'};
    arData = {kode_admin, name,username,password};
        fastinsert(con,table,kolomsimpan,arData);
        showtabel('Simpan',handles);
 
function btnUbah_Callback(hObject, eventdata, handles)
 kode_admin=get(handles.edkodeadmin,'String');
 name=get(handles.edname,'String');
 username=get(handles.edusername,'String');
 password=get(handles.edpassword,'String');

[con,table,kolom]=koneksiadmin();
    [SQL]= ['update tb_admin set name=''', name, ''',username=''', username,''',password=''', password, ''' where kode_admin=''', kode_admin, ''''];
  sqls=cell2mat(SQL)
  curs = exec(con,sqls);
    exec(con, 'rollback');
    exec(con, 'commit');
 
showtabel('Ubah',handles);

function btnHapus_Callback(hObject, eventdata, handles)
 kode_admin=get(handles.edkodeadmin,'String');
[con,table,kolom]=koneksiadmin();
    [SQL]=['delete from tb_admin where kode_admin='''  kode_admin  ''''];
    curs = exec(con,SQL);
      sqls=cell2mat(SQL)
  curs = exec(con,sqls);exec(con, 'rollback');
    exec(con, 'commit');
showtabel('Hapus',handles);

function btnReset_Callback(hObject, eventdata, handles)
proyek=guidata(gcbo);
mau=questdlg(['Reset ' get(proyek.figure1,'Name')''],['Anda ingin Reset  Aplikasi ini?'],'Ya','Tidak','Ya');
if strcmp(mau,'Tidak')
return;
else

    hm = msgbox('Reset','Reset Sukses','help');
    showtabel('Clear',handles);
end

function btnTutup_Callback(hObject, eventdata, handles)
close();



function showtabel(proses,handles)
tabel=handles.tabel;
pk=handles.pk;
[kolom,mydata,no ]=lihatadmin(tabel,pk);
set(handles.myTable,'data',mydata,'ColumnName',kolom,'RowName',no);
set(handles.myTable,'Userdata',mydata);
T=size(mydata,1);
[tot]=['Total ' num2str(T) ' data'];
set(handles.txtTotal,'String',tot);

[AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
    set(handles.edkodeadmin,'String',AU);
    set(handles.edname,'String','');
    set(handles.edusername,'String','');
    set(handles.edpassword,'String','');
[ps]=['Sukses Proses ' proses];
msgbox(ps,proses,'help');


function myTable_CellSelectionCallback(hObject, eventdata, handles)
try
    al= eventdata.Indices;
    dataseleksi=get(handles.myTable,'Userdata');
    getdata=dataseleksi(al);
    kode=getdata{1};
 
    [kolom,mydata,no ] = lihatadmin(handles.tabel,handles.pk,kode);
    var1=mydata(1,1);
    var2=mydata(1,2);
    var3=mydata(1,3);
    var4=mydata(1,3);
 
    set(handles.edkodeadmin,'string',var1);
    set(handles.edname,'string',var2);
    set(handles.edusername,'string',var3);
    set(handles.edpassword,'string',var4);

catch
    [AU]=autoadmin(handles.tabel,handles.pk,handles.pre);
    set(handles.edkodeadmin,'string',AU);
    set(handles.edname,'string','');
    set(handles.edusername,'string','');
    set(handles.edpassword,'string','');
end



F.Hasil ahirnya adalah sbb:




Bila salah satu data pada tabel kita pilih/klik maka data tersebut akan terseleksi ke atas dan siap untuk di modifikasi (ubah / dihapus).....



CMIIW











Sabtu, 10 November 2018

POPUP MENU MATLAB


How Get VALUE POPUP MENU

function pilAgama_Callback(hObject, eventdata, handles)
ar= get(handles.pilAgama, 'String');
v = get(handles.pilAgama, 'value');        
hasil=cell2mat(ar(v));
set(handles.pilAgama, 'Userdata',hasil); 






How SET VALUE POPUP MENU:

         v=1;
         if(strcmp(agama,'Islam')>0)
             v=1;
         elseif(strcmp(agama,'Kristen')>0)
             v=2;
         elseif(strcmp(agama,'Hindu')>0)
             v=3;
         elseif(strcmp(agama,'Budha')>0)
             v=4;   
         end 
         set(handles.pilAgama, 'Value', v);



How SET STRING POPUP MENU:


a='you';b='are';c='crazy'
s=char(a,b,c);  %s         3x5                30  char   

set(handles.pilNIK,'string',s);



How SET STRING POPUP MENU FROM DATABASE:

[arkode,arnama] = aremployee( 'tb_employe' );

set(handles.pilNIK,'string',arkode);


function [kode,nama] = aremployee( tabel )
[con]=koneksivalue();
setdbprefs('NullNumberWrite', 'NaN');
    SQL=['SELECT nik,name FROM ' tabel '  order by nik asc' ];
    curs = exec(con,SQL);
    curs = fetch(curs);
    mydata=curs.Data;
    baris=size(mydata,1); 
    kode=mydata(:,1);
    nama=mydata(:,2);

end

function [con] = koneksivalue()
url = 'jdbc:mysql://localhost:3306/';
con = database('db_matlab', 'root', '', 'com.mysql.jdbc.Driver', url);

end




Menghitung Selisih Tanggal

Di database Matlab menyimpan tanggal dalam format string...

Misal:

str=date
    '10-Nov-2018'

Dan jika kita k=ingin mncari selisih dari dua string  tanggal tersebut maka gunakan rumus sbb:

A=datetime('02-Nov-2018','InputFormat','dd-MM-yyyy');
B=datetime('12-Nov-2018','InputFormat','dd-MM-yyyy');
numdays = datenum(A) - datenum(B);


HASIL:
  A            1x1                17  datetime             
  B            1x1                17  datetime             
  numdays      1x1                 8  double               

A = 02-Nov-2018
B = 12-Nov-2018
numdays =-10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++





Jumat, 17 Agustus 2018

MFCC Audio File

download file latihan


A.Pre-emphasis
the speech signal s(n) is sent to a high-pass filter:
s2(n) = s(n) - a*s(n-1)
where s2(n) is the output signal and the value of a is usually between 0.9 and 1.0. The z-transform of the filter is
H(z)=1-a*z-1

figure;
waveFile='sunday.wav';
[y,fs]=audioread(waveFile);
nbits=8;
y=y*2^nbits/2;
subplot(2,1,1);
time=(1:length(y))/fs;
plot(time, y); axis([min(time), max(time), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of "sunday"');

frameSize=512;
index1=0.606*fs;
index2=index1+frameSize-1;
line(time(index1)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
line(time(index2)*[1, 1], 2^nbits/2*[-1 1], 'color', 'r');
subplot(2,1,2);
time2=time(index1:index2);
y2=y(index1:index2);
plot(time2, y2, '.-'); axis([min(time2), max(time2), -2^nbits/2, 2^nbits/2]);
xlabel('Time (seconds)'); ylabel('Amplitude'); title('Waveforms of the voiced "ay" in "sunday"');



B.Frame blocking: 
The input speech signal is segmented into frames of 20~30 ms with optional overlap of 1/3~1/2 of the frame size. 
Usually the frame size (in terms of sample points) is equal to power of two in order to facilitate the use of FFT. If this is not the case, we need to do zero padding to the nearest length of power of two. If the sample rate is 16 kHz and the frame size is 320 sample points, then the frame duration is 320/16000 = 0.02 sec = 20 ms. Additional, if the overlap is 160 points, then the frame rate is 16000/(320-160) = 100 frames per second.



C.Hamming windowing: 

Each frame has to be multiplied with a hamming window in order to keep the continuity of the first and the last points in the frame (to be detailed in the next step). If the signal in a frame is denoted by s(n), n = 0,…N-1, then the signal after Hamming windowing is s(n)*w(n), where w(n) is the Hamming window defined by:
w(n, a) = (1 - a) - a cos(2pn/(N-1)),0≦n≦N-1
Different values of a corresponds to different curves for the Hamming windows shown next:



D.Fast Fourier Transform or FFT: 

Spectral analysis shows that different timbres in speech signals corresponds to different energy distribution over frequencies. Therefore we usually perform FFT to obtain the magnitude frequency response of each frame.
When we perform FFT on a frame, we assume that the signal within a frame is periodic, and continuous when wrapping around. If this is not the case, we can still perform FFT but the incontinuity at the frame's first and last points is likely to introduce undesirable effects in the frequency response. To deal with this problem, we have two strategies:
  1. Multiply each frame by a Hamming window to increase its continuity at the first and last points.
  2. Take a frame of a variable size such that it always contains a integer multiple number of the fundamental periods of the speech signal.
The second strategy encounters difficulty in practice since the identification of the fundamental period is not a trivial problem. Moreover, unvoiced sounds do not have a fundamental period at all. Consequently, we usually adopt the first strategy to mutiply the frame by a Hamming window before performing FFT. The following example shows the effect of multiplying a Hamming window.


fs=8000; t=(1:512)'/fs; f=306.396; original=sin(2*pi*f*t)+0.2*randn(length(t),1); windowed=original.*hamming(length(t));
plot(t, original); grid on; axis([-inf inf -1.5 1.5]); title('Original signal'); plot(t, windowed); grid on; axis([-inf inf -1.5 1.5]); title('Windowed signal');